Мин / Макс уровень масштабирования в OpenLayers
-
27-09-2019 - |
Вопрос
Я использую OpenLayers для отображения карты на веб-странице. Я использую плитки из cloudmade, но те же проблемы возникают с плитками Mapnik из OpenStreetMap.
Я пытаюсь ограничить карту, чтобы пользователь не мог уменьшить масштаб весь путь к мировоззрению - я хочу, чтобы они оставались примерно на уровне города на уровне минимума.
Я пытался использовать minZoomLevel
/ maxZoomLevel
/ numZoomLevels
характеристики; только maxZoomLevel
а также numZoomLevels
свойства, кажется, работают, тогда как minZoomLevel
Недвижимость, кажется, полностью игнорируется.
Есть ли другой способ достичь этого?
Решение
MinzoomLeLevel не поддерживается для слоев XYZ, из которых OSM является подклассом.
Смотрите следующие билеты на обходные пути:
- http://trac.osgeo.org/Openlayers/ticket/2909. (Примените смещение масштабирования)
- http://trac.osgeo.org/Openlayers/ticket/2189. (добавьте патч MinzoomLevel)
Другие советы
Вы можете переопределить 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.
Я нашел самый простой способ ограничить уровни MaxZoom для уровня XYZ, чтобы переопределить метод Getnumzoomlevels:
map.getNumZoomLevels = function(){
return 10;
};
Эти плагины уменьшаются за пределы уровня 10, а также правильно рисует контроль зообаря. Это и комбинация zoomOffset
Опция должна позволить вам легко контролировать Min / Max Zoom без необходимости беспорядок с разрешениями или подклассами.
Другие ответы здесь относятся к версии 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/conepts.html.
Теперь я использую это в «View»:
view: new ol.View({
center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
zoom: 15,
maxZoom: 17,
minZoom: 6
}),
И это работает нормально
Определение резолюций не решает проблему (даже в V2.1) - я не нашел никакого пернаменных исправлений для этого, поэтому я сделал свой собственный Zoombar в JS - вот что я бы порекомендовал всем, кто встречает вопросы с Zoombar, используя пользовательские плитка.
Я оказался с этим решением, поскольку я не мог понять, как использовать 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;
}
Я попробовал что-то вроде этого, и это работает для меня:
map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
Лучший ответ, который я нашел (включая пример) был на OpenLayers - ограничить количество уровней зума. Отказ Я не вставю это здесь, пожалуйста, смотрите там инструкции.