Delorem XMap十六进制/二进制到Lat Long

时间:2015-09-02 21:15:47

标签: hex coordinates decode

我有来自XMap使用的数据库的数据转储。

看起来XMap将Lat / Lng存储为十六进制值。任何人都可以帮我解码这些吗?

我还能够使用Xmap上传我自己的一些数据,看看它是如何将其转换为Hex的。我只是无法使用我拥有的Xmap版本进行批量导出。

长:-100.00纬度:35.00 0000004E 0000806E

-101.00 35.00 0000804D 0000806E

-101.1 35.1 3333734D 3333736E
-101.2 35.2 6666664D 6666666E

Lat Lon Hex
35.21285737 -98.44795716 0x57A9C64E17C1646E
35.21305335 -98.44786274 0x6FACC64EABBA646E
35.94602108 -96.74434793 0x35B9A04FC8E8066E
34.89283431 -99.037117 0xC03F7B4E9BB78D6E
34.89300668 -99.03754044 0xE0317B4EF5B18D6E
34.41109633 -100.2820795 0xD2E4DB4D3261CB6E
33.97470069 -101.2196311 0x21E3634D023D036F
34.0079211 -101.1440331 0x53906D4D71FCFE6E
32.76227534 -104.2691193 0x808DDD4BC36D9E6F
32.77947819 -104.204128 0x22DFE54B0F3A9C6F
32.77947819 -104.204128 0x22DFE54B0F3A9C6F
32.64307308 -104.5322441 0x6DDFBB4BC8AFAD6F
32.64290345 -104.531814 0x85EDBB4B57B5AD6F
32.47907078 -104.5652282 0x9AA6B74BCFADC26F
32.47907078 -104.5652282 0x9AA6B74BCFADC26F
32.22682178 -101.3943434 0x28864D4D81F7E26F
32.07237184 -101.8558813 0x7B72124D85BCF66F
31.89574015 -102.4611448 0x35F9C44C63580D70
31.8808713 -102.4563805 0x5395C54C9C3F0F70
31.18487537 -101.1440152 0xE9906D4D01566870
31.28633738 -100.4128259 0x8528CB4D4C595B70
31.0369339 -100.5050048 0x015CBF4DC0457B70
30.83263898 -100.6261411 0x9CDAAF4D166C9570

1 个答案:

答案 0 :(得分:1)

所以这个问题刚刚出现在昨晚的工作中,我花了几个小时解码并转换信息。

看起来lat和long存储在32位Little-endian块中(read more about endianness here (wikipedia)

从您的示例35.21285737 -98.44795716 0x57A9C64E17C1646E转换如下:

Split to 32 bit sections -->  0x57A9C64E (lng)   0x17C1646E (lat)

Adjust for endianness
    LAT: 17 C1 64 6E  => Swap Bytes =>  6E 64 C1 17  ==> 1852096791 (base 10)
    LNG: 57 A9 C6 4E  => Swap Bytes =>  4E C6 A9 57  ==> 1321642327 (base 10)

从那些信息中,我然后使用线性回归来计算转换方程(http://arachnoid.com/polysolve/。最初,我尝试使用Excel的回归工具,但它没有提供足够的准确度)。它的结果比我原先想象的要好得多。但是,似乎数据中应该有sign位,但我没有弄清楚如何检索它,所以有两个单独的方程式,无论是lat还是long。

LAT = 256 + raw / -2^23
LNG = -256 + raw / 2^23

如果我们继续通过我们收到的公式运行我们的测试数据:

Lat: 35.212857365
Lng: -98.447957158

如果我将来有更多的时间,我可能会尝试找出一种更有效的转换方法(考虑到符号位)但是现在这种方法对我来说运作得很好。

现在,如果计算出这个数据,可以扩展它以便能够将原始数据转换为其他更复杂的几何类型(例如线条)。我没有机会完成与线路一起使用的RAW数据的所有细节。但是,我所看到的似乎它包含一个包含一些附加信息的标题,例如数据中有多少Lat / Long Points。除此之外,它看起来像单点一样简单。

- 编辑 -

今天重新审视了这一点,经过多次挖掘后发现了一个更好的GPSBable转换公式source code

COORD = (0x80000000 - raw) / 0x800000

我们也可以执行反转并从COORD转换回原始数据

RAW = 0x80000000 - (coord * 0x800000)

我也查看了符号位,据我所知,符号位没有存储在数据中,所以你必须要注意这一点。如果有人需要,我还有在PHP中实现Point,Line和Polygon解码的代码。