Openlayers 3 view.calculateExtent返回[NaN,NaN,NaN,NaN]

Openlayers 3 view.calculateExtent返回[NaN,NaN,NaN,NaN],openlayers-3,Openlayers 3,我使用的是OpenLayers 3.18.2。 我的地图是olMap,我的视图是olView。 我想得到屏幕上可见地图的范围 olView.getCenter() = [2142126.3712395,-4085536.2324793] olView.getZoom() = 16 olView.getResolution() = 2.388657133911758 olMap.getSize() = [1906,904] olView.calculateExtent(olMap.getSize(

我使用的是OpenLayers 3.18.2。 我的地图是olMap,我的视图是olView。 我想得到屏幕上可见地图的范围

olView.getCenter() = [2142126.3712395,-4085536.2324793]
olView.getZoom() = 16
olView.getResolution() = 2.388657133911758
olMap.getSize() = [1906,904]
olView.calculateExtent(olMap.getSize()) = [NaN,NaN,NaN,NaN]

为什么这没有返回正确的范围?

实际上,由于代码似乎正确,您在获取映射范围时应该没有任何问题。我的映射定义为map和map.getView().calculateExtent(map.getSize())。我能够获取范围。

事实上,由于代码似乎正确,您在获取地图范围时不应该有任何问题。我的地图定义为map和map.getView().calculateExtent(map.getSize())。我能够获取范围。

为了继续工作,我自己计算了范围:

var center = olView.getCenter();
var res = olView.getResolution();
var pxSize = olMap.getSize();
var cx = parseFloat(center[0]);
var cy = parseFloat(center[1]);
var dx = res * pxSize[0] / 2;
var dy = res * pxSize[1] / 2;
var extent = [cx - dx, cy - dy, cx + dx, cy + dy];

olView.getCenter()返回一个字符串数组,因此返回parseFloat。

为了继续工作,我自己计算了范围:

var center = olView.getCenter();
var res = olView.getResolution();
var pxSize = olMap.getSize();
var cx = parseFloat(center[0]);
var cy = parseFloat(center[1]);
var dx = res * pxSize[0] / 2;
var dy = res * pxSize[1] / 2;
var extent = [cx - dx, cy - dy, cx + dx, cy + dy];

olView.getCenter()返回一个字符串数组,因此是parseFloat。

这里是一个与您类似的映射的工作JSFIDLE(使用OSM作为基本映射)。calculateExtent()似乎工作正常


点击我
变量视图=新的ol.view({
中间:[2142126.3712395,-4085536.2324793],
缩放:16
})
var map=新ol.map({
目标:“地图”,
图层:[
新ol.layer.Tile({
来源:new ol.source.OSM()
})
],
视图:视图
});
window.test=函数(){
警报(view.calculateExtent(map.getSize());
}

这是一个与您的类似的工作JSFIDLE映射(使用OSM作为基本映射)。calculateExtent()似乎工作正常


点击我
变量视图=新的ol.view({
中间:[2142126.3712395,-4085536.2324793],
缩放:16
})
var map=新ol.map({
目标:“地图”,
图层:[
新ol.layer.Tile({
来源:new ol.source.OSM()
})
],
视图:视图
});
window.test=函数(){
警报(view.calculateExtent(map.getSize());
}

在熟睡之后,考虑到这里的反馈和更多的实验,我发现了问题的原因:坐标来自于返回字符串的AJAX调用。我打电话

olView.setCenter([x, y])
当x和y为字符串时,地图视图将更改为正确的中心位置,但随后无法正常工作。将呼叫更改为

olView.setCenter([parseFloat(x), parseFloat(y)])

使地图正常工作。

在睡过觉之后,考虑到这里的反馈和更多的实验,我发现了问题的原因:坐标来自于返回字符串的AJAX调用。我打电话

olView.setCenter([x, y])
当x和y为字符串时,地图视图将更改为正确的中心位置,但随后无法正常工作。将呼叫更改为

olView.setCenter([parseFloat(x), parseFloat(y)])

使地图正常工作。

我已经在IE11、FireFox和Chrome中使用我的自定义版本和OL3.18.2的完整版本进行了测试,得到了相同的结果。NaNI已经在IE11、FireFox和Chrome中使用我的自定义版本和OL3.18.2的完整版本进行了测试,得到了相同的结果。楠