地理情報システム (GIS) で使用されるジオメトリ オブジェクトのバイナリ エンコーディングであるWell Known Binaryを解析しようとしています。私はESRIのこの仕様を使用しています(esriの結果と同じです)。OpenStreetMap データを解析するツールであるOsmosisからデータを入力しました。具体的には、バイナリの 16 進数表現を与えるpgsimp-dump 形式です。
ESRI ドキュメントによると、a には 21 バイトPoint
、バイト オーダーには 1 バイト、typeid には uint32 には 4、double x には 8、double y には 8 が必要です。
osmosis の例は、この (16 進数) の例です:0101000020E6100000DB81DF2B5F7822C0DFBB7262B4744A40
で、長さは 25 バイトです。
人気のある C ライブラリGEOS に基づく WKB (など) を解析する Python プログラムは、この文字列を解析できます。
>>> 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 バイトです。これは、typeif=d の uint32 に 3 バイト表示されます。
01010000**20E61000**00DB81DF2B5F7822C0DFBB7262B4744A40
無効な WKB の場合、この WKB を shapely/geos で解析できるのはなぜですか? これらのバイトはどういう意味ですか?