Разобрать строку 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.