[关闭]
@huyl08 2017-09-02T06:13:23.000000Z 字数 3137 阅读 1264

信号灯周期、队长标定中间数据说明

样式数据

  1. wx4g8nj0 77 20170331235409 86049 43.7 6.0 174.0 13331194428 wx4g8nj4
  2. wx4g8nj0 77 20170331235414 86054 37.3 0.0 0.0 13331194428 wx4g8nj1
  3. wx4g8nj0 77 20170331235426 86066 32.2 10.0 178.0 13331194428 wx4g8nj1
  4. wx4g8nj0 77 20170331235438 86078 15.9 6.0 180.0 13331194428 wx4g8jvp
  5. wx4g8nj0 77 20170331235450 86090 51.1 0.0 326.0 13331194428 wx4g8jvj
  6. wx4g8nj0 77 20170331235551 86151 179.7 56.0 168.0 13301208461 wx4g8nm1
  7. wx4g8nj0 77 20170331235603 86163 31.6 26.0 180.0 13301208461 wx4g8nj1
  8. wx4g8nj0 77 20170331235615 86175 14.7 0.0 178.0 13301208461 wx4g8nj0
  9. wx4g8nj0 77 20170331235627 86187 12.0 23.0 178.0 13301208461 wx4g8jvp
  10. wx4g8nj0 77 20170331235632 86192 49.6 34.0 178.0 13301208461 wx4g8jvj

对应字段

  1. nid direction timesecondsdistancespeedangle, vid, cargeohash

说明

经纬度与Geohash转换

GeoHash核心原理说明

  1. import java.util.BitSet;
  2. import java.util.HashMap;
  3. public class GeoHash {
  4. private static int numbits = 4 * 5; //经纬度单独编码长度
  5. //32位编码对应字符
  6. final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
  7. '9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p',
  8. 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
  9. //定义编码映射关系
  10. final static HashMap<Character, Integer> lookup = new HashMap<Character, Integer>();
  11. //初始化编码映射内容
  12. static {
  13. int i = 0;
  14. for (char c : digits)
  15. lookup.put(c, i++);
  16. }
  17. //对编码后的字符串解码
  18. public static double[] decode(String geohash) {
  19. StringBuilder buffer = new StringBuilder();
  20. for (char c : geohash.toCharArray()) {
  21. int i = lookup.get(c) + 32;
  22. buffer.append( Integer.toString(i, 2).substring(1) );
  23. }
  24. BitSet lonset = new BitSet();
  25. BitSet latset = new BitSet();
  26. //偶数位,经度
  27. int j =0;
  28. for (int i=0; i< numbits*2;i+=2) {
  29. boolean isSet = false;
  30. if ( i < buffer.length() )
  31. isSet = buffer.charAt(i) == '1';
  32. lonset.set(j++, isSet);
  33. }
  34. //奇数位,纬度
  35. j=0;
  36. for (int i=1; i< numbits*2;i+=2) {
  37. boolean isSet = false;
  38. if ( i < buffer.length() )
  39. isSet = buffer.charAt(i) == '1';
  40. latset.set(j++, isSet);
  41. }
  42. double lon = decode(lonset, -180, 180);
  43. double lat = decode(latset, -90, 90);
  44. return new double[] {lat, lon};
  45. }
  46. //根据二进制和范围解码
  47. private static double decode(BitSet bs, double floor, double ceiling) {
  48. double mid = 0;
  49. for (int i=0; i<bs.length(); i++) {
  50. mid = (floor + ceiling) / 2;
  51. if (bs.get(i))
  52. floor = mid;
  53. else
  54. ceiling = mid;
  55. }
  56. return mid;
  57. }
  58. //对经纬度进行编码
  59. public static String encode(double lat, double lon) {
  60. BitSet latbits = getBits(lat, -90, 90);
  61. BitSet lonbits = getBits(lon, -180, 180);
  62. StringBuilder buffer = new StringBuilder();
  63. for (int i = 0; i < numbits; i++) {
  64. buffer.append( (lonbits.get(i))?'1':'0');
  65. buffer.append( (latbits.get(i))?'1':'0');
  66. }
  67. return base32(Long.parseLong(buffer.toString(), 2));
  68. }
  69. //根据经纬度和范围,获取对应二进制
  70. private static BitSet getBits(double lat, double floor, double ceiling) {
  71. BitSet buffer = new BitSet(numbits);
  72. for (int i = 0; i < numbits; i++) {
  73. double mid = (floor + ceiling) / 2;
  74. if (lat >= mid) {
  75. buffer.set(i);
  76. floor = mid;
  77. } else {
  78. ceiling = mid;
  79. }
  80. }
  81. return buffer;
  82. }
  83. //将经纬度合并后的二进制进行指定的32位编码
  84. private static String base32(long i) {
  85. char[] buf = new char[65];
  86. int charPos = 64;
  87. boolean negative = (i < 0);
  88. if (!negative)
  89. i = -i;
  90. while (i <= -32) {
  91. buf[charPos--] = digits[(int) (-(i % 32))];
  92. i /= 32;
  93. }
  94. buf[charPos] = digits[(int) (-i)];
  95. if (negative)
  96. buf[--charPos] = '-';
  97. return new String(buf, charPos, (65 - charPos));
  98. }
  99. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注