在OpenLayers 4中获取WMS层的范围

时间:2018-04-03 09:38:25

标签: openlayers openlayers-3 wms mapserver

我想从BBOX参数中动态检索OpenLayers中ImageWMS图层的范围。

我会用它来(例如)缩放到图层范围。

目前,我的代码如下所示:

    var layer2 = new ol.layer.Image({
        title: 'zone',
        visible: false,
        source: wmsSource2,
        extent: [952014.59,5571269.68,1272301.10,5862273.22]
    });

...


// in the layers tab, zoom map to layer when zoom icon is clicked
$('.fa-search').on('click', function() {
    var layer = layer2;
    view.fit(layer.getExtent(), {
        duration:1000
    });
});

如您所见,现在我在layer变量中定义范围。

相反,我很乐意从WMS本身获取它,而不是在我的js中再次重新定义它。

从文档中,我看到我可以在ol.source.ImageWMS params选项中设置BBOX WMS参数。更好,它由OL4自动设置!

所以,问题是:如果可能的话,如何从这个参数中检索BBOX?如果重要的话,我正在使用Mapserver作为WMS服务器。

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的东西来检索BBOX的范围。

map.on('click', function(evt) {
    //get extent
    var extent_coords = evt.map.getView().calculateExtent();
    // get coordinates
    var coords_view = evt.coordinate;
    coords.innerHTML = [
        coords_view[0].toFixed(3),
        coords_view[1].toFixed(3)
    ]
    bb_extent.innerHTML = [
        extent_coords[0].toFixed(3),
        extent_coords[1].toFixed(3),
        extent_coords[2].toFixed(3),
        extent_coords[3].toFixed(3)

    ].join('<br>')

});

我希望下面的小提琴能让你朝着正确的方向前进,享受:)

https://jsfiddle.net/Svinjica/r9xdaoeo/

答案 1 :(得分:1)

我最后关注了示例at this site

这有点棘手,但我希望值得这样做。

基本上,通过以下代码,我现在可以通过解析WMS GetCapabilities而不是在js中对其进行硬编码来检索图层范围(至少对于其中一个当前版本)。

这样,如果我的WMS图层将改变,我不必更新js。使用相同的解析器,我希望循环遍历每一层,以自动将它们插入我的openlayers代码中(这将是my project的下一个改进之一。)

// WMS PARSER (https://bl.ocks.org/ThomasG77/5f9e62d3adeb5602d230a6eacbb9c443)

var base_url = 'https://localhost/cgi-bin/mapserver/mapserv.exe?map=C:\\DATI\\git\\shire\\\mapfile\\\mapfile\\mymapWINDOWS.map&'
var parser = new ol.format.WMSCapabilities();

// Parse WMS Capabilities to retrieve layer extent
fetch(base_url + 'SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities').then(function(response) {
        return response.text();
    }).then(function(text) {
            var result = parser.read(text);
            var extent = result.Capability.Layer.Layer.find(l => l.Name === 'zone').EX_GeographicBoundingBox;
            var extent_3857 = ol.proj.transformExtent(extent, 'EPSG:4326', 'EPSG:3857')

...

var layer2 = new ol.layer.Image({
    title: 'zone',
    visible: false,
    source: wmsSource2,
    extent: extent_3857
});

...

// in the layers tab, zoom map to layer when zoom icon is clicked
$('.fa-search').on('click', function() {
    var layer = layer2;
    view.fit(layer.getExtent(), {
        duration: 1000
    });
});