2015-04-07 4 views
1

Я пытаюсь разобрать Well Known Binary двоичное кодирование объектов геометрии, используемых в географических информационных системах (ГИС). Я использую this spec from ESRI (те же результаты here from esri). У меня есть входные данные от Osmosis - инструмент для анализа данных OpenStreetMap, в частности pgsimp-dump format, который дает шестнадцатеричное представление двоичного файла.Почему красивое/геофолическое синтаксическое разборку это «недопустимое» хорошо известное двоичное?

Документы ESRI говорят, что должно быть только 21 байт для Point, 1 байт для порядка байтов, 4 для uint32 для typeid и 8 для double x и 8 для double y.

Пример из осмоса - это пример (шестнадцатеричный): 0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40, длина которого составляет 25 байт.

Shapely программа питон для разбора ВКБ (и т.д.), который основан на популярной библиотеке C GEOSявляется в состоянии разобрать эту строку:

>>> import shapely.wkb 
>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True) 
<shapely.geometry.point.Point object at 0x7f221f2581d0> 

Когда я спрашиваю Shapely разобрать из затем преобразовать в WKB Я получаю 21 байт.

>>> shapely.wkb.loads("0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40", hex=True).wkb.encode("hex").upper() 
'0101000000DB81DF2B5F7822C0DFBB7262B4744A40' 

Разница заключается в том, что 4 байта в середине, которые появляются 3 байта в uint32 для typeif = д

01010000**20E61000**00DB81DF2B5F7822C0DFBB7262B4744A40 

Почему стройные/GEOS разобрать этот ВКБ, когда он недействителен ВКБ? Что означают эти байты?

ответ

3

GEOS/Shapely использует расширенный вариант WKT/WKB под названием EWKT/EWKB, который является documented PostGIS. Если у вас есть доступ к PostGIS, вы можете увидеть, что здесь происходит:

SELECT ST_AsEWKT('0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40'::geometry); 

Возвращает EWKT SRID=4326;POINT(-9.2351011 52.9117549). Таким образом, дополнительные данные были идентификатором пространственной привязки или SRID. В частности EPSG:4326 для WGS 84.

стройных does not support SRIDs, однако есть несколько хаков, например .:

from shapely import geos 
geos.WKBWriter.defaults['include_srid'] = True 

должен теперь сделать wkb или wkb_hex выведите EWKB, который включает в себя SRID. Значение по умолчанию - False, которое выводит ISO WKB для 2D-геометрии (но не для 3D).

Итак, ваша цель - преобразовать EWKB в ISO WKB, который вы можете использовать с GEOS/Shapely для 2D-геометрии. Если у вас есть геометрия 3D (Z или M) или 4D (ZM), то только PostGIS может выполнить это преобразование.