Имя геометрии 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 - это мой случай, все вопросы, похоже, касаются обратной отправки). Если я дублирую, сообщите мне об этом.)


person ehiller    schedule 18.10.2019    source источник


Ответы (2)


Не знаю баг это или нет. Но это действительно раздражает. к сожалению, в OpenLayers нет обновленного документа о редактировании функций.

Есть какое-то решение, чтобы решить эту проблему:

  1. Изменение имени поля PostGIS. Вы можете переименовать поле PostGIS или установить имя поля геометрии на geometry при импорте в PostGIS.

  2. Также вы можете изменить запрос на редактирование в 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);
person Mahdi Mahmoodian    schedule 20.10.2019
comment
Я также обнаружил, что OpenLayers не учитывает входящий XML. В итоге я просто переименовал в PostGIS, чтобы сэкономить время. - person ehiller; 23.10.2019
comment
Большой! но я уверен, что вы можете исправить это с помощью замены строки. Возможно, вам следует сначала зарегистрировать эту строку запроса, чтобы узнать, что именно. - person Mahdi Mahmoodian; 25.10.2019

Вы можете исправить это, попросив OpenLayers прочитать имя столбца геометрии из ввода. Для GeoJSON:

source: new VectorSource({
    format: new GeoJSON({ extractGeometryName: true }),
    url: ...
}),
person Magnus Hoff    schedule 10.03.2021