java - 在 JTS 上处理几何端 WKBwriter 时出现的问题

标签 java geometry postgis 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

我在这里弄错了什么?

最佳答案

当 SRID 存在时,PostGIS 不使用(仅)WKB 标准,它使用 EWKB支持 3d 和 SRID 的格式,其中 WKB specification才不是。将 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

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

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

关于java - 在 JTS 上处理几何端 WKBwriter 时出现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6126917/

相关文章:

java - GWT 中单元格表的水平滚动

python - 如何将简单的几何形状写入 numpy 数组

postgresql - 在以下情况下如何使用 ST_Contains?

linux - 无法在 Centos 5 上使用 postgis 启动 postgres

java - 从 EditText 更新数据库

java - 如何检查 body 是否几乎停止在 libgdx + box2d 中移动

java - Gradle 在目录中包含传递依赖项

c++ - 高效的算法来获得圆心的圆心

html - 如何在 CSS 中创建八 Angular 形蒙版

postgresql - postgis 2.3 安装与 postgres 9.6 ubuntu 18.04