2015-09-02 2 views
0

У меня есть дамп данных из базы данных, используемой XMap.Delorem XMap Hex/Binary to Lat Long

Похоже, что XMap хранит Lat/Lng в качестве значения Hex. Может ли кто-нибудь помочь мне их декодировать?

Я также мог использовать Xmap для загрузки некоторых моих собственных данных и посмотреть, как он преобразуется в Hex. Я просто не могу сделать массовый экспорт с версией Xmap, которая у меня есть.

Long: -100,00 Lat: 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 0x6FACC64EAB BA646E
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

+0

Вы уверены, что шестнадцатеричный код получен из информации о лат-лоне? – Amnon

+0

Это выглядело очень вероятным для меня. Я не размещал все данные здесь, но из некоторых других точек данных казалось, что вторая половина HEX имела некоторую корреляцию с Lat. – Anario

+0

Единственное, что выделяется на первый взгляд в этом примере, состоит в том, что идентичные точки Lat Lon получают одинаковые шестнадцатеричные коды, но я не вижу немедленного сходства между близкими координатами и их кодами. Для всех, кого я знаю, код может быть каким-то необратимым хешем координат - опять же, я никогда не был так много в расшифровке кодов или обратной инженерии ... – Amnon

ответ

1

Так что это точная проблема только что пришел на работу в последнюю ночь, и я потратил несколько часов декодирования и преобразования информации.

Оказывается, что широта и долго сохраняются в 32-битный прямой порядок байтов куски (read more about endianness here (wikipedia))

Из вашего примера 35.21285737 -98.447957160x57A9C64E17C1646E преобразует следующим образом:

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 = 256 + raw/-2^23 
LNG = -256 + raw/2^23 

Если мы идем вперед и запустить наши тестовые данные через уравнения мы получаем:

Lat: 35.212857365 
Lng: -98.447957158 

Если я получить больше времени в будущем, я могу попытаться выяснить более эффективный метод для преобразования (принимая во внимание знак бит), но пока этот метод работал достаточно хорошо для меня.

Теперь, когда эти данные были получены, можно было бы расширить его, чтобы иметь возможность преобразовывать необработанные данные для других более сложных типов геометрии (таких как строки). У меня не было возможности закончить разработку всех деталей для данных RAW, которые используются с линиями. Однако, что я действительно смотрел на это, кажется, что он включает заголовок, который содержит некоторую дополнительную информацию, такую ​​как количество Lat/Long Points в данных. Помимо этого, он выглядел так же просто, как и отдельные точки.

- Edit -

Revisited это сегодня и после того, как много рытья нашел лучшую формулу для преобразования из GPSBable source code.

COORD = (0x80000000 - raw)/0x800000 

Мы можем также сделать обратное и конвертировать из COORD обратно к необработанным данным

RAW = 0x80000000 - (coord * 0x800000) 

Я также посмотрел в знаковый бит, и, насколько я могу сказать, знаковые биты не сохраняются в данных, поэтому вы должны знать об этом. У меня также есть код, который реализует декодирование Point, Line и Polygon в PHP, если кому-то это нужно.