2010-11-21 4 views
19

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

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

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

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

ответ

9

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

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

+2

Это больше не применяется в OpenLayers 3.0. См. Мой обновленный ответ для OpenLayers 3.0. – jjmontes

11

Вы можете переопределить функцию 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

+0

Это не будет настраивать панель масштабирования. –

+0

Дэвид, извините, игнорировал элементы управления. Я добавил больше своего ответа - см. «Редактировать». По сути вам нужно будет определить разрешения, которые вы хотите разрешить. – Jonathan

+0

Хотя этот ответ не работает для элементов управления, он устранил мою проблему в том, что я хотел просто ограничить пользователя от масштабирования до определенного уровня (через колесо прокрутки или zoomToExtent). Благодаря! – SoWeLie

0

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

+0

Я обнаружил, что определение разрешений работает безупречно. Однако мне нужно было сделать математику. – rocketsarefast

6

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

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

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

+0

Сделал трюк для меня. Это ужасно, но это работает. Благодарю. – Countzero

+0

Согласовано - его противно, но после нескольких бесполезных часов возиться с разрешениями мне все равно. – Graham

+0

То же самое здесь. Странно, что нет более простого способа сделать это, но хорошо. Еще раз спасибо. – Countzero

0

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

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

map.newMoveTo = map.moveTo; 
map.moveTo = function(lonlat,zoom,options){ 
    return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false; 
}; 
2

Другие ответы здесь относятся к версиям 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

0

Теперь я использую это в "Просмотр":

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

И это работает отлично

Смежные вопросы