【问题标题】:Display features returned by WFS within OpenLayers hand drawn bounding box在 OpenLayers 手绘边界框中显示 WFS 返回的特征
【发布时间】:2019-07-13 14:45:31
【问题描述】:

我允许用户绘制要素,并且在 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());
    });

但是,我终其一生都无法弄清楚如何将此请求中请求的数据限制为四个坐标的边界框。

这可能是一个无限的尖头几何图形,将充当显示数据的千篇一律。

我的搜索没有结果。

【问题讨论】:

  • 在您使用format: new GeoJSON() 的第一个sn-p 中,URL 中需要&outputFormat=application/json(以及支持它的服务器)。否则,如果视图和数据都是 EPSG:27700,format: new WFS() 就足够了
  • @Mike 谢谢你回复我,而且在星期六也一样。我实际上在这里写错了,因为我的 WFS 为我服务 GML。我将尝试 WFS,看看会发生什么。谢谢。
  • @Mike 所以使用前一个 sn-p,我已经更改并尝试将格式设置为 GML 和 WFS,虽然它没有抛出任何错误,并且查看请求,这些都正确发回在我的范围内形成GML(要更改为bbox的坐标),数据不会显示在图层上!
  • @Mike 我想我的问题是,使用第一个代码 sn-p 我可以从服务器获取正确的数据,但它没有显示在我的地图上,第二个显示数据但我无法弄清楚如何只从边界框内请求数据。

标签: openlayers bounding-box openlayers-5 web-feature-service


【解决方案1】:

你似乎在这两种情况下都非常接近。

在顶部的 sn-p 中,您可以记录任何特征及其几何形状,以确认是否正在加载任何特征,以及为什么它们没有出现在预期的位置(例如,当视图为 EPSG 时,几何坐标为 lon/lat 值: 27700)

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

在第二个 sn-p 中,如果其他一切正常,我认为您需要将 bbox 数组添加到 serializeToString 调用中使用的 featureRequest 对象,或更改传递数据的方式。

这是一个类似的 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] 的几米范围内进入大西洋。

【讨论】:

  • 谢谢你,我认为前者剪断是我要走的路。在了解如何使用过滤器选项时,第二个 sn -p 成为一个问题。第一个问题仍然存在,尽管在我的网络选项卡中我肯定得到了正确的 gml 返回它肯定没有被应用到图层!在我的应用程序的任何阶段运行获取功能都会返回一个空数组。
  • 有没有可能你可以用 OL5 测试显示 lineStrings?我们现在已经对此进行了广泛的测试,我们无法使用第一种方法在矢量图层上显示 LineStrings,并且倾向于 OL 错误。
  • 确认,要素被添加到图层,但只显示点和多边形。
  • 如果您记录加载的几何图形,您是否看到任何 LineStrings?可能是您的 GML 不符合简单功能 schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/1.0.0/…(例如 LineString 被定义为 gml:pos 数组而不是单个 gml:posList),或者可能存在样式问题。除非样式包含笔划,否则不会显示 LineStrings。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多