Вопрос

Я использую OpenLayers для отображения карты на веб-странице. Я использую плитки из cloudmade, но те же проблемы возникают с плитками Mapnik из OpenStreetMap.

Я пытаюсь ограничить карту, чтобы пользователь не мог уменьшить масштаб весь путь к мировоззрению - я хочу, чтобы они оставались примерно на уровне города на уровне минимума.

Я пытался использовать minZoomLevel / maxZoomLevel / numZoomLevels характеристики; только maxZoomLevel а также numZoomLevels свойства, кажется, работают, тогда как minZoomLevel Недвижимость, кажется, полностью игнорируется.

Есть ли другой способ достичь этого?

Это было полезно?

Решение

MinzoomLeLevel не поддерживается для слоев XYZ, из которых OSM является подклассом.

Смотрите следующие билеты на обходные пути:

Другие советы

Вы можете переопределить 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 - ограничить количество уровней зума. Отказ Я не вставю это здесь, пожалуйста, смотрите там инструкции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top