Разобрать строку WKB с помощью JTS Topology Suite

Уже несколько дней я борюсь со строками 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 Topology Suite LineStringZ? Если нет, то почему точки могут иметь значение Z? И как я могу разобрать это правильно?

Спасибо, что прочитали!

3 ответа

JTs поддерживает только 2D геометрию, он не поддерживает значение Z. Точки имеют только X и Y в нем.

Пакет JTS Topology поддерживает трехмерные данные, но в формате EWKB. ISO WKB не поддерживается. Если так получилось, что вы используете postgis, он поддерживает EWKB. ST_GeomFromEWKB <-> ST_AsEWKB

Также, если вы пишете свой EWKB с помощью WKBWriter, не забудьте указать выходные размеры:

 WKBWriter wkbw = new WKBWriter(3);

JTS поддерживает 3D геометрию, по крайней мере, в чтении и письме. Поддержка может быть скорее 2.5D, чем реальная 3D, но значения Z все еще продолжаются в операциях. Проблема в том, что существует два способа представления геометрии XYZ, XYM и XYZM в WKB. 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.

Другие вопросы по тегам