在JTS上处理Geometry结束WKBwriter的问题

时间:2011-05-25 15:24:08

标签: java geometry postgis jts

我刚开始使用几何图形,我得到了一些非常奇怪的错误。我正在尝试使用特定的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

但是我的数据库中有postgis:

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

结果

0101000020E610000000000000000010400000000000001440

我在这里错了什么?

1 个答案:

答案 0 :(得分:2)

当SRID存在时,PostGIS不使用(仅)WKB标准,它使用支持3d和SRID的EWKB格式,WKB specification不支持。可以把WKB看作一种轻型二进制2d数组,它是一种非常简单的格式。它不包括二进制表示中的高程或SRID,在OGC标准空间参考系统中是元数据。以下是一些可能阐明您如何使用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
如你所见。如果您以十六进制值开头并想要添加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与非SRID 2d WKB格式相同。总的来说,我认为使用WKT,GeoJSON和KML更安全,因为它们也是 OGC (?) 1 开放标准,而SQL版本有一些必要的更新悬而未决。正如PostGIS文档所述:“PostGIS扩展格式目前是OGC的超集(每个有效的WKB / WKT都是有效的EWKB / EWKT),但未来可能会有所不同,特别是如果OGC出现与我们的扩展相冲突的新格式因此,你不应该依赖这个功能!“

(1)实际上不知道这些标准的一半是什么状态,但json,text和xml似乎可能在任何给定应用程序的生命周期中存在。