1

ジオメトリを使い始めたばかりで、本当に奇妙なエラーが発生しています。特定の SRID を使用して Java コード内に WKB を作成しようとしています。

終わったよ:

GeometryFactory gm = new GeometryFactory(new PrecisionModel,4326)
WKBWriter w = new WKBWriter(2,ByteOrderValues.LITTLE_ENDIAN)

Geometry geom: Geometry = gm.createPoint(new Coordinate(4,5))
Array[Byte] the_geom = w.write(geom)

println(geom)
println(geom.getSRID)
println(WKBWriter.toHex(the_geom.get))

そして得た

POINT (4 5)
4326
010100000000000000000010400000000000001440

しかし、私のDBにpostgisがあると:

GEOMETRYFROMTEXT('Point(4 5)',4326)) 

結果は

0101000020E610000000000000000010400000000000001440

ここで何が間違っているのですか??

4

1 に答える 1

2

PostGISはSRIDが存在する場合(のみ)WKB標準を使用せず、 WKB仕様ではサポートされていない3DおよびSRIDをサポートするEWKB形式を使用します。WKBを一種の軽いバイナリ2D配列と考えてください。これは、非常に単純な形式です。OGC標準の空間参照系はメタデータであるため、バイナリ表現には標高やSRIDは含まれません。WKBおよびEWKBの操作方法に光を当てる可能性のある相互作用の種類を次に示します。

moveable=> insert into my_table (some_other_geom) values (GeomFromText('POINT(4 5)'));
moveable=> insert into my_table (some_other_geom) values (GeomFromText('POINT(4 5)', 4326));

これはあなたに与えます:

010100000000000000000010400000000000001440
0101000020E610000000000000000010400000000000001440

あなたが見たように。16進値から始めて、SRIDプロジェクションを追加し、EWKBとして保存する場合は、次のいくつかのバリエーションを実行します。

==>insert into my_table (some_other_geom) values (ST_GeomFromWKB(decode('010100000000000000000010400000000000001440', 'hex'), 4326));
INSERT 0 1

また:

moveable=> insert into my_table (some_other_geom) values (ST_GeomFromWKB(decode('010100000000000000000010400000000000001440', 'hex')));
INSERT 0 1

あなたがこれらの収量をそれぞれ期待するように:

0101000020E610000000000000000010400000000000001440
010100000000000000000010400000000000001440

ここで、nullの-1デフォルトSRIDは、非SRID2dWKB形式と同じです。一般に、WKT、GeoJSON、およびKMLはOGC(?)1オープンスタンダードであり、SQLバージョンにはいくつかの必要な更新が保留されているため、より安全だと思います。PostGISドキュメントが示唆しているように:「PostGIS拡張フォーマットは現在OGCのもののスーパーセットです(すべての有効なWKB/WKTは有効なEWKB/EWKTです)が、これは将来、特にOGCが拡張機能と競合する新しいフォーマットで出てきた場合に変わる可能性がありますしたがって、この機能に依存するべきではありません!」

(1)実際には、これらの標準の半分のステータスが何であるかはわかりませんが、json、text、およびxmlは、特定のアプリケーションの存続期間中存在する可能性があります。

于 2011-05-25T22:11:08.010 に答える