在openlayers.js(当前版本5.3.0)中,如何在鼠标拖动期间限制地图?纬度范围应为[-90,90]。
与下面的两个示例相比,
https://openlayers.org/en/latest/examples/drag-rotate-and-zoom.html?q=drag
https://docs.mapbox.com/mapbox-gl-js/example/add-image-animated/
如果将地图拖到lat [-90,90]上,则地图框中的地图会自动限制范围,而OpenLayers中的地图将显示空白区域。
这是相同的问题,但没有完全的答案。 https://gis.stackexchange.com/questions/222698/openlayers3-how-to-limits-the-drag-range-of-the-map
我尝试过的肮脏解决方案是 1.添加map.on('moveend'...)侦听器 2.缩放检测地图中心 3.如果超出范围,请执行map.getView()。animate({center:[...],duration:100})
但是,动画的过程是从空白区域到指定中心的过渡。
地图构造函数中是否有任何选项? 还是在OpenLayers中可以完成某些黑客代码的源代码的任何位置?
答案 0 :(得分:0)
这是在全球范围内的相同演示:
var view = new ol.View();
var map = new ol.Map({
layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ],
target: 'map'
});
function openMap() {
map.setView(view);
var extent = ol.proj.transformExtent([ -540, -85, 540, 85], 'EPSG:4326', 'EPSG:3857');
// fit the extent horizontally or vertically depending on screen size
// to determine the maximum resolution possible
var size = map.getSize();
var width = ol.extent.getWidth(extent);
var height = ol.extent.getHeight(extent);
if (size[0]/size[1] > width/height) {
view.fit([extent[0],(extent[1]+extent[3])/2,extent[2],(extent[1]+extent[3])/2], { constrainResolution: false });
} else {
view.fit([(extent[0]+extent[2])/2,extent[1],(extent[0]+extent[2])/2,extent[3]], { constrainResolution: false });
}
var maxResolution = view.getResolution();
var resolution = 0;
function resChange() {
var oldView = map.getView();
if (resolution == 0 || oldView.getZoom()%1 == 0) {
resolution = oldView.getResolution();
var width = map.getSize()[0] * resolution;
var height = map.getSize()[1] * resolution;
var newView = new ol.View({
projection: oldView.getProjection(),
extent: [extent[0]+(width/2), extent[1]+(height/2), extent[2]-(width/2), extent[3]-(height/2)],
resolution: resolution,
maxResolution: maxResolution,
rotation: oldView.getRotation()
});
newView.setCenter(newView.constrainCenter(oldView.getCenter()));
newView.on('change:resolution', resChange);
map.setView(newView);
}
}
resChange();
}
map.on('change:size', openMap);
openMap();
<link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" type="text/css">
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<div id="map" class="map"></div>
如果您可以等到OpenLayers 6发布,或者不介意使用Beta版本,那么range选项将约束可见范围,除非指定了multiWorld选项,否则范围默认为一个世界https://github.com/openlayers/openlayers/blob/master/changelog/upgrade-notes.md < / p>