Имя геометрии OpenLayers не сохраняется при загрузке из WFS
Я использую OpenLayers 6 и GeoServer 2.16 (плюс PostGIS); и когда я загружаю слои с GeoServer, функция загружается, но их геометрическое имя перезаписывается. В GeoServer имя геометрии (и столбец в PostGIS):geom
. Возвращенный XML отражает это. Но тогда объект OpenLayers имеет геометрическое имяgeometry
, игнорируя имя геометрии, возвращенное GeoServer.
Это кажется тривиальным, но вызывает проблемы, поскольку, когда я иду редактировать функцию, я получаю сообщение об ошибке org.geoserver.wfs.WFSException: No such property: geometry
; поэтому, хотя я мог редактировать имя геометрии и соответствующее значение в моем коде, это похоже на плохой взлом.
Это ошибка или какая-то настройка, которую я просто не могу найти в документации?
Любая помощь будет принята с благодарностью! (Я не видел никаких вопросов, отражающих эту ошибку (я получаю WFS, все вопросы, похоже, касаются обратной отправки). Если у меня есть дубликат, дайте мне знать.)
2 ответа
Вы можете исправить это, попросив OpenLayers прочитать имя столбца геометрии из ввода. Для GeoJSON:
source: new VectorSource({
format: new GeoJSON({ extractGeometryName: true }),
url: ...
}),
Не знаю, ошибка это или нет. Но это очень раздражает. к сожалению, в OpenLayers нет обновленного документа о функциях редактирования.
Есть какое-то решение для решения этой проблемы:
Изменение имени поля PostGIS. Вы можете переименовать поле PostGIS или установить имя поля геометрии на
geometry
при импорте в PostGIS.Также вы можете вручную изменить запрос на редактирование в OpenLayers. Обычный способ редактирования функций - это отправка XML или POST-запроса на GeoServer. Поэтому перед отправкой просто замените
geometry
кgeom
! Что-то вроде этого:
var node = wfs.writeTransaction(null, [feature], null, gml);
var s = new XMLSerializer();
var str = s.serializeToString(node);
str = str.replace("geometry", "geom");
xhr.open('POST', 'http://localhost:8080/geoserver/wfs', true);
xhr.send(str);