使用JTS拓扑套件分析WKB字符串



我已经有几天在处理WKB字符串了。我需要能够解析它,以便获得等效的几何图形并提取点坐标(X,Y,Z)我不能使用PostGIS功能。我发现的唯一一个java库是JTS拓扑套件,我使用它如下:

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值?如何正确解析?

感谢您的阅读!

JT只支持2D几何图形,不支持Z值。点中只有X和Y。

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/vividsolutions/jts/io/WKBWriter.java

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

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

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

JTS拓扑套件支持3D数据,但采用EWKB格式。不支持ISO WKB。如果您正在使用postgis,那么它支持EWKB。ST_GeomFromEWKB<->ST_AsWKB

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

 WKBWriter wkbw = new WKBWriter(3);
  • https://trac.osgeo.org/geos/ticket/707
  • https://postgis.net/docs/reference.html