3

几天以来,我一直在为 WKB 字符串苦苦挣扎。我需要能够解析它以获得等效的几何图形并提取点坐标(X,Y,Z)。我不能使用 PostGIS 功能。我发现的唯一 java 库是 JTS Topology Suite,我使用如下:

String wkb = "01ea030000020000009b4d3899fe95154153d97e8f43875941000000000000454003085bc23f9615411b4dc406578759410000000000004740"
byte[] aux = WKBReader.hexToBytes(wkb);
try {
    Geometry geom = new WKBReader().read(aux);
} catch (ParseException e) {
    e.printStackTrace();
    System.err.println("Bad WKB string.");
}

但它给了我以下错误:

com.vividsolutions.jts.io.ParseException:未知的 WKB 类型 234

234 是十六进制字符串“ea”的十进制值。就像 JTS 库只查看前 2 个字节而不是查看 4 个字节“ea03”,它对应于小端序中的 1002(所以是 LineStringZ)。

我的问题是:JTS 拓扑套件是否处理 LineStringZ ?如果不是,为什么点可以有 Z 值?我怎样才能正确解析它?

谢谢你的阅读!

4

3 回答 3

0

JTs 仅支持 2D 几何,不支持 Z 值。点中只有 X 和 Y。

于 2015-05-04T16:41:04.010 回答
0

JTS 拓扑套件支持 3D 数据,但采用 EWKB 格式。不支持 ISO WKB。如果碰巧您使用的是 postgis,它支持 EWKB。ST_GeomFromEWKB <-> ST_AsEWKB

此外,如果您使用 WKBWriter 编写 EWKB,请不要忘记指定输出尺寸:

 WKBWriter wkbw = new WKBWriter(3);
于 2017-08-08T15:44:10.290 回答
0

JTS至少在读写方面确实支持 3D 几何。支持可能是 2.5D 而不是真正的 3D,但 Z 值仍在操作中进行。问题是在 WKB 中呈现 XYZ、XYM 和 XYZM 几何图形有两种方法。JTS 支持 PostGIS EWKB 变体,从源代码文件https://sourceforge.net/p/jts-topo-suite/code/HEAD/tree/trunk/jts/java/src/com/中的评论中可以看出生动的解决方案/jts/io/WKBWriter.java

  • 此实现还支持扩展 WKB
  • 标准。扩展的 WKB 允许写入 3 维坐标
  • 并包括几何 SRID 值。
  • 表示存在 3D 坐标
  • 通过设置 wkbType 字的高位。
  • SRID 的存在表示
  • 通过设置 wkbType 字的第三位。
  • EWKB 格式向上兼容原始 SFS WKB 格式。

您的 WKB 属于 OGC 文档http://portal.opengeospatial.org/files/?artifact_id=25355中定义的 OGC 变体

JTS 不理解四位几何类型代码。此邮件线程提供了更多信息https://lists.osgeo.org/pipermail/geos-devel/2013-December/006757.html

于 2016-02-11T10:58:25.467 回答