处理几何的问题结束了WKB在JTS上的写作



我刚开始学习几何图形,我遇到了一些非常奇怪的错误。我正试图在我的java代码中创建一个带有特定SRID的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

我做错了什么??

PostGIS在存在SRID时不使用(仅)WKB标准,它使用支持3d和SRID的EWKB格式,而WKB规范没有。把WKB想象成一种光二进制二维阵列,它是一种非常简单的格式。它在二进制表示中不包括高程或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

其中空CCD_ 1默认SRID与非SRID 2d WKB格式相同。一般来说,我认为使用WKT、GeoJSON和KML更安全,因为它们也是OGC(?)1开放标准,SQL版本有一些需要的更新。正如PostGIS文档所建议的:"PostGIS扩展格式目前是OGC扩展格式的超集(每个有效的WKB/WKT都是有效的EWKB/EWKT),但这在未来可能会有所不同,特别是如果OGC出现了与我们的扩展冲突的新格式。因此,您不应该依赖此功能!"

(1) 实际上,我们不知道其中一半标准的状态,但json、text和xml似乎在任何给定应用程序的生命周期中都存在。

最新更新