3

地理情報システム (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 で解析できるのはなぜですか? これらのバイトはどういう意味ですか?

4

1 に答える 1

5

GEOS / Shapely は、EWKT / EWKB と呼ばれる WKT/WKB の拡張バリアントを使用します。これは、PostGIS によって文書化されています。PostGIS にアクセスできる場合は、ここで何が起こっているかを確認できます。

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

EWKT を返しますSRID=4326;POINT(-9.2351011 52.9117549)。したがって、追加データは空間参照識別子 (SRID) でした。具体的には、WGS 84 のEPSG:4326 。

Shapelyは SRIDをサポートしていませんが、次のようないくつかのハックがあります。

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

SRID を含む EWKBを作成wkbまたは出力する必要があります。wkb_hexデフォルトはFalseで、これは 2D ジオメトリに対して ISO WKB を出力します (ただし、3D に対しては出力しません)。

したがって、あなたの目的は、EWKB を ISO WKB に変換することであると思われます。これは、2D ジオメトリに対してのみ GEOS/Shapely で行うことができます。3D (Z または M) または 4D (ZM) ジオメトリがある場合、PostGIS だけがこの変換を行うことができます。

于 2015-04-09T20:33:56.010 に答える