我刚开始使用几何图形,我得到了一些非常奇怪的错误。我正在尝试使用特定的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
我在这里错了什么?
答案 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似乎可能在任何给定应用程序的生命周期中存在。