使用OpenLayers,我想设置1个地图的视图,与另一个地图相同。 到目前为止,我使用了Zoom和Center,它运行良好,但由于技术上不可能进行某种投影,我尝试了一定程度。
我正在使用最新的OpenLayers(4.6.3)。
以下代码理论上应该获取我当前地图的范围,并使我的地图符合这个范围,这样就不会有任何动作。
let view = map.getView();
let extent = view.calculateExtent(map.getSize());
view.fit(extent, map.getSize());
但实际上,如果我放大得足够(例如,点击加号按钮6次),然后运行上面的代码,它会在每次运行时缩小,这不是我想要的。
我尝试了constraintResolution
,但它最大限度地减少了伤害,而不是完全删除它。
这是一个小提琴:http://jsfiddle.net/t6uvybd3/1/ (我不确定那里的ol版本是什么,但它也确实发生在那里)
视频:https://www.youtube.com/watch?v=ZAV_FuZ-p7M&feature=youtu.be
答案 0 :(得分:2)
这种情况正在发生,因为它会改变分辨率以适应范围。如果更改地图div的大小,则可能不会遇到问题。无论如何,这似乎是开放层的不当行为,但这是一种解决方法。
var map = new ol.Map({
target: 'map',
loadTilesWhileAnimating: true,
layers: [new ol.layer.Tile({source: new ol.source.OSM()})],
view: new ol.View({
center: ol.proj.transform([0, 0], 'EPSG:4326', 'EPSG:3857'),
zoom: 1
})
});
var fitExtentAnimated = document.getElementById('fit-extent-animated');
fitExtentAnimated.addEventListener('click', function() {
let view = map.getView();
let extent = view.calculateExtent(map.getSize());
//hold the current resolution
let res = view.getResolution();
//if you use older versions of ol3 use `fitExtent` istead of `fit`
view.fit(extent, map.getSize());
//apply the resolution back
view.setResolution(res);
}, false);
答案 1 :(得分:0)
我使用了@pavios的解决方案,但由于我的情况有些不同,因此必须对其进行一些调整。我正在使用几何对象来适合/居中于地图。我注意到 当几何图形只是一个点时,OL会缩小得太多。但是我发现 发生这种情况时,分辨率变为零。因此,我在调用setResolution之前添加了一个条件,因为当几何不是POINT时,每次都弄乱其他条件时会调用它。
let mainFeature: ol.Feature = feature == null ? this.mainFeature : feature;
if (mainFeature != null && this.map != null) {
// get the current resolution before calling fit
// as this will zoom out too much if the geometry is just a POINT
let res = this.map.getView().getResolution();
this.map.getView().fit(mainFeature.getGeometry().getExtent(), { constrainResolution: false});
// set the resolution back to the original resolution if the new resolution
// after calling fit is equal or less than zero
let newRes = this.map.getView().getResolution();
if (newRes <= 0)
this.map.getView().setResolution(res);
}