Мин. / Макс. Уровень масштабирования в OpenLayers - PullRequest
20 голосов
/ 22 ноября 2010

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

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

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

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

Ответы [ 9 ]

11 голосов
/ 22 ноября 2010

Вы можете переопределить функцию isValidZoomLevel. Как то так (не проверено):

OpenLayers.Map.isValidZoomLevel = function(zoomLevel) {
   return ( (zoomLevel != null) &&
      (zoomLevel >= 2) && // set min level here, could read from property
      (zoomLevel < this.getNumZoomLevels()) );
}

EDIT

Или вам нужно переопределить доступные разрешения, см. Пример здесь: http://dev.openlayers.org/examples/zoomLevels.html

9 голосов
/ 28 ноября 2010

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

См. Следующие билеты для обходных путей:

7 голосов
/ 24 февраля 2012

Я нашел самый простой способ ограничить уровни maxZoom для слоя XYZ - переопределить метод getNumZoomLevels:

map.getNumZoomLevels = function(){
        return 10;
        };

Это предотвращает масштабирование выше 10 уровня, а также правильно отображает элемент управления zoomBar. Это и комбинация опции zoomOffset должны позволять вам легко управлять минимальным / максимальным увеличением без необходимости возиться с разрешениями или подклассами.

2 голосов
/ 01 февраля 2016

Другие ответы здесь относятся к версиям OpenLayers до версии 3.

С OpenLayers 3 вы можете использовать опцию maxZoom map при инициализации карты, как показано ниже:

    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

1 голос
/ 06 мая 2016

Теперь я использую это в «View»:

view: new ol.View({
    center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
    zoom: 15,
    maxZoom: 17,
    minZoom: 6
}),

И это прекрасно работает

0 голосов
/ 13 мая 2013

Лучший ответ, который я нашел (включая пример), был на OpenLayers - ограничить количество уровней масштабирования . Я не вставляю его сюда, пожалуйста, смотрите инструкции там.

0 голосов
/ 13 июля 2012

Я пробовал что-то вроде этого, и у меня это работает:

map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
    return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
0 голосов
/ 14 мая 2012

Я остановился на этом решении, так как не мог понять, как использовать 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;
        }
0 голосов
/ 15 августа 2011

Определение разрешений не решает проблему (даже в v2.1) - я не нашел ни одного постоянного исправления для этого, поэтому я сделал свой собственный зоомбар в JS - это то, что я бы порекомендовал всем, кто сталкивается с проблемамиzoombar с использованием пользовательских плиток.

...