我想从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服务器。
答案 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>')
});
我希望下面的小提琴能让你朝着正确的方向前进,享受:)
答案 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
});
});