Отображение функций, возвращаемых WFS, в нарисованной вручную ограничивающей рамке OpenLayers

Я разрешаю пользователю рисовать объекты, а в drawend мне нужно сделать запрос к моему сервису WFS, чтобы вернуть объекты.

Я могу заставить WFS возвращать данные на основе экстента, используя:

let vectorSource = new VectorSource({
                format: new GeoJSON(),
                url: function(extent) {
                    return 'https://example/wfs' +
                        '?key=key' +
                        '&SERVICE=WFS' +
                        '&REQUEST=GetFeature' +
                        '&TYPENAMES=data_point' +
                        '&SRSNAME=urn:ogc:def:crs:EPSG::27700' +
                        '&BBOX=' + extent.join(',') + ',urn:ogc:def:crs:EPSG::27700';

                },
                strategy: bboxStrategy
            });

Однако я не могу отобразить эти функции, несмотря на внедрение этого источника в слой и слоя на карту.

Я могу получить все функции для отображения, используя что-то вроде:

        fetch('example/wfs?key=key', {
        method: 'POST',
        body: new XMLSerializer().serializeToString(featureRequest)
    }).then(function(response) {
        return response.text();
    }).then(function(gml) {
        console.log(gml);
        let features = new GML().readFeatures(gml);
        vectorSource.addFeatures(features);
        map.getView().fit(vectorSource.getExtent());
    });

Однако я не могу на всю жизнь решить, как ограничить данные, запрошенные в этом запросе, ограничивающей рамкой, скажем, с четырьмя координатами.

Потенциально это может быть безграничная заостренная геометрия, которая будет действовать как формочка для печенья для отображаемых данных.

Мои поиски не дали результатов.


person Phish    schedule 13.07.2019    source источник
comment
В вашем первом фрагменте с использованием format: new GeoJSON() потребуется &outputFormat=application/json в URL-адресе (и сервер, который его поддерживает). В противном случае format: new WFS() должно быть достаточно, если и представление, и данные имеют формат EPSG:27700.   -  person Mike    schedule 13.07.2019
comment
@Майк, спасибо, что ответил мне, и в субботу не меньше. Я на самом деле написал это здесь неправильно, поскольку мой WFS обслуживает меня GML. Я попробую WFS и посмотрю, что произойдет. Спасибо.   -  person Phish    schedule 13.07.2019
comment
@Mike, продолжая предыдущий фрагмент, я изменил и попытался установить формат как GML и WFS, и хотя он не выдает ошибок, и, глядя на запрос, они отправляют обратно правильно сформированный GML в пределах моего экстента (для изменения на координаты bbox), данные не отображаются на слое!   -  person Phish    schedule 13.07.2019
comment
@Mike Я полагаю, моя проблема в том, что с первым фрагментом кода я могу получить правильные данные с сервера, но они не отображаются на моей карте, второй отображает данные, но я не могу понять, как запрашивать данные только изнутри ограничивающий прямоугольник.   -  person Phish    schedule 13.07.2019


Ответы (1)


Вы, кажется, очень близки в обоих случаях.

В верхнем фрагменте вы можете зарегистрировать любые функции и их геометрию, чтобы подтвердить, загружаются ли они, и если да, то почему они не появляются там, где ожидалось (например, координаты геометрии - это значения долготы/широты, когда представление EPSG: 27700)

setTimeout(function(){
  console.log(vectorSource.getFeatures());
  vectorSource.getFeatures().forEach(function(feature){console.log(feature.getGeometry());});
}, 10000);

Во втором фрагменте, если все остальное работает, я предполагаю, что вам нужно будет добавить массив bbox к объекту featureRequest, используемому в вызове serializeToString, или изменить способ передачи данных.

Вот аналогичный пример WFS, где вы можете использовать источник просмотра. Он одинаково хорошо работает с форматами WFS или GML. Когда представление совпадает с проекцией данных http://mikenunn.16mb.com/demo/wfs-italy-4326.html достаточно использовать функцию URL. Но в отличие от таких форматов, как GeoJSON, OpenLayers автоматически не перепроецирует объекты для просмотра проекций для GML или WFS. С другой проекцией http://mikenunn.16mb.com/demo/wfs-italy-3857.html для перепроецирования геометрии объекта требуется функция загрузки, иначе итальянские провинции окажутся в Атлантике в нескольких метрах от [0,0].

person Mike    schedule 14.07.2019
comment
Спасибо, я думаю, что бывший отрезанный - мой путь. Второй фрагмент стал проблемой при понимании того, как использовать параметры фильтра. Проблема все еще сохраняется с первым, хотя на вкладке моей сети я определенно получаю правильный возвращаемый gml, он определенно не применяется к слою! Запуск функций get на любом этапе моего приложения возвращает пустой массив. - person Phish; 15.07.2019
comment
есть ли возможность протестировать отображение строк с помощью OL5? Теперь мы всесторонне протестировали это, и мы не можем на всю жизнь отображать LineStrings на векторном слое, используя первый метод, и склоняемся к ошибке OL. - person Phish; 17.07.2019
comment
Чтобы подтвердить, объекты добавляются к слою, но отображаются только точки и полигоны. - person Phish; 17.07.2019
comment
Если вы регистрируете загруженную геометрию, вы видите какие-либо LineStrings? Возможно, ваш GML не соответствует требованиям Simple Features schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/ (например, LineString определяется как массив gml:pos вместо одного gml:posList) или может быть стиль проблема. LineStrings не будут отображаться, если стиль не включает обводку. - person Mike; 17.07.2019