Минимальный уровень масштабирования в OpenLayers
Я использую OpenLayers для отображения карты на веб-странице. Я использую плитки из CloudMade, но те же проблемы возникают с плитами Mapnik из OpenStreetMap.
Я пытаюсь ограничить карту так, чтобы пользователь не мог увеличить весь экран до мирового уровня - я хочу, чтобы они почти не приближались к масштабу на уровне города.
Я попытался использовать свойства minZoomLevel
/maxZoomLevel
/numZoomLevels
; только свойства maxZoomLevel
и numZoomLevels
, похоже, работают, тогда как свойство minZoomLevel
, кажется, полностью игнорируется.
Есть ли другой способ сделать это?
Ответы
Ответ 1
minZoomLevel не поддерживается для слоев XYZ, из которых OSM является подклассом.
См. следующие билеты для обходных решений:
Ответ 2
Вы можете переопределить функцию isValidZoomLevel
. Что-то вроде этого (не проверено):
OpenLayers.Map.isValidZoomLevel = function(zoomLevel) {
return ( (zoomLevel != null) &&
(zoomLevel >= 2) && // set min level here, could read from property
(zoomLevel < this.getNumZoomLevels()) );
}
ИЗМЕНИТЬ
Или вам нужно переопределить доступные разрешения, см. пример здесь: http://dev.openlayers.org/examples/zoomLevels.html
Ответ 3
Я нашел самый простой способ ограничить уровни maxZoom для слоя XYZ, чтобы переопределить метод getNumZoomLevels:
map.getNumZoomLevels = function(){
return 10;
};
Это означает, что изображение выходит за пределы уровня 10, а также правильно управляет регулятором масштабирования. Это и комбинация опций zoomOffset
должны позволять вам легко управлять минимальным/максимальным увеличением без необходимости возиться с разрешениями или подклассами.
Ответ 4
Другие ответы здесь относятся к версиям OpenLayers до версии 3.
С помощью OpenLayers 3 вы можете использовать опцию карты maxZoom
при инициализации карты следующим образом:
var map = new ol.Map({
target: 'mapcontainer-001',
layers: layers, // Layers need to be initialized previously
view: new ol.View({
center: ol.proj.transform([-5.12345, 42.12345], 'EPSG:4326', 'EPSG:3857'),
zoom: 12,
maxZoom: 19
})
});
Более подробную информацию можно найти в документации OpenLayers: http://openlayers.org/en/v3.0.0/doc/tutorials/concepts.html
Ответ 5
Определение разрешений не решает проблему (даже в версии 2.1). Я не нашел для нее никакого фиксированного исправления, поэтому я сделал свой собственный зомбар в JS - это то, что я рекомендую всем, кто сталкивается с проблемами с zoombar, используя пользовательские плитки.
Ответ 6
Я закончил с этим решением, так как не мог понять, как использовать zoomOffset в моей настройке.
map.getNumZoomLevels = function(){
return (options.maxzoom-options.minzoom+1);
};
map.isValidZoomLevel = function(zoomLevel) {
var valid = ( (zoomLevel != null) &&
(zoomLevel >= options.minzoom) &&
(zoomLevel <= options.maxzoom) );
if(!valid && map.getZoom() == 0){
map.zoomTo(options.maxzoom - (options.maxzoom - options.minzoom)/2);
}
return valid;
}
Ответ 7
Я пробовал что-то вроде этого, и это работает для меня:
map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
Ответ 8
Лучший ответ, который я нашел (включая пример), был OpenLayers - ограничение количества уровней масштабирования. Я не вставляю его здесь, см. Инструкции там.
Ответ 9
Теперь я использую это в "View":
view: new ol.View({
center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
zoom: 15,
maxZoom: 17,
minZoom: 6
}),
И он отлично работает