Проблемы с работой с геометрией заканчиваются WKBwriter на JTS
Я только начал с геометрии, и я получаю некоторые действительно странные ошибки. Я пытаюсь создать WKB внутри моего Java-кода с конкретным SRID.
Я сделал:
GeometryFactory gm = new GeometryFactory(new PrecisionModel,4326)
WKBWriter w = new WKBWriter(2,ByteOrderValues.LITTLE_ENDIAN)
Geometry geom: Geometry = gm.createPoint(new Coordinate(4,5))
Array[Byte] the_geom = w.write(geom)
println(geom)
println(geom.getSRID)
println(WKBWriter.toHex(the_geom.get))
и получил
POINT (4 5)
4326
010100000000000000000010400000000000001440
Но с postgis в моей БД:
GEOMETRYFROMTEXT('Point(4 5)',4326))
результаты в
0101000020E610000000000000000010400000000000001440
Что я тут не так понял??
1 ответ
PostGIS не использует (только) стандарт WKB, когда присутствует SRID, он использует формат EWKB, который поддерживает 3d и SRID, чего нет в спецификации WKB. Думайте о WKB как о неком легком двоичном 2d-массиве, это очень простой формат. Он не включает повышение или SRID в двоичном представлении, в стандартных системах пространственной привязки OGC используются метаданные. Вот некоторые виды взаимодействий, которые могут пролить свет на то, как вы работаете с WKB и EWKB:
moveable=> insert into my_table (some_other_geom) values (GeomFromText('POINT(4 5)'));
moveable=> insert into my_table (some_other_geom) values (GeomFromText('POINT(4 5)', 4326));
Это дает вам:
010100000000000000000010400000000000001440
0101000020E610000000000000000010400000000000001440
как вы видели Если вы начинаете с шестнадцатеричного значения и хотите добавить проекцию SRID и сохранить ее как EWKB, вы делаете несколько вариантов:
==>insert into my_table (some_other_geom) values (ST_GeomFromWKB(decode('010100000000000000000010400000000000001440', 'hex'), 4326));
INSERT 0 1
или же:
moveable=> insert into my_table (some_other_geom) values (ST_GeomFromWKB(decode('010100000000000000000010400000000000001440', 'hex')));
INSERT 0 1
Как и следовало ожидать, эти доходности, соответственно:
0101000020E610000000000000000010400000000000001440
010100000000000000000010400000000000001440
где ноль -1
SRID по умолчанию соответствует формату 2d WKB без SRID. В целом, я думаю, что безопаснее работать с WKT, GeoJSON и KML, так как они также являются открытыми стандартами OGC(?)1, а версия SQL имеет некоторые необходимые ожидающие обновления. Как показывают документы PostGIS: "Расширенные форматы PostGIS в настоящее время являются расширенным набором OGC (каждый действительный WKB/WKT является допустимым EWKB/EWKT), но это может измениться в будущем, особенно если OGC выйдет с новым форматом, конфликтующим с нашими расширениями Таким образом, вы не должны полагаться на эту функцию! "
(1) На самом деле понятия не имею, в каком состоянии находится половина этих стандартов, но json, text и xml, вероятно, будут существовать в течение любого конкретного приложения.