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

时间:2015-03-19 10:53:57

标签: java 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值?我怎样才能正确解析它?

感谢您的阅读!

3 个答案:

答案 0 :(得分:0)

JT仅支持2D几何,它不支持Z值。点只有X和Y.

答案 1 :(得分:0)

JTS 确实至少在阅读和写作时支持3D几何。支持可能比实际3D支持2.5D,但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值。
  • 表示存在3D坐标
  • 通过设置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

答案 2 :(得分:0)

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

另外,如果您使用WKBWriter编写EWKB,请不要忘记指定输出调整:

 WKBWriter wkbw = new WKBWriter(3);