2010-10-22 4 views
4

Я занимаюсь этим целый день, и, честно говоря, у меня нет идей. У меня есть некоторые слои WMS, которые я хотел бы отображать/не отображать в зависимости от текущего уровня масштабирования. Да, я прошел через документы API, и они кажутся ясными как день, но я следую всему, что предлагается, и я не получаю желаемых результатов :(Отображение уровня WMS на основе уровня масштабирования

Это был один из источников, на которые я смотрел : http://trac.osgeo.org/openlayers/wiki/SettingZoomLevels

Тогда, чтобы усугубить ситуацию, я узнал, что если у вас есть базовый слой Open Street Map, отображаемый при загрузке, он, кажется, ограничивает ваш контроль над номер numZoomLevels карты, именно то, что мне было нужно, так как я НЕ хочу использовать это как мой базовый уровень загрузки ...

Так что мои вопросы:

Что я делаю неправильно? Верно ли, что при управлении базовым слоем Open Street Map при загрузке на самом деле нет обходного пути для управления уровнями масштабирования? Или есть что-то, чего я просто не знаю?

Вот некоторые из моих попыток кода: Возьмите 1: уровень tib_villages должен отображаться только тогда, когда уровень масштабирования 8-10, не работает!

var options = { 
             controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider 
      maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34), 
      units: 'm', 
      numZoomLevels: null, //setting the map's zoom levels to null 
      allOverlays: false 
     } 

var osm = new OpenLayers.Layer.OSM(); //MY base layer 

//MY overlay layer 
var tib_villages = new OpenLayers.Layer.WMS(
        "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: 10, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true} 
       ); 

Take 2: tib_villages слой должен показывать только тогда, когда уровень масштабирования 8-10, карта должна иметь только 10 уровней масштабирования, но вместо этого имеет 19 как Open Street Map Layer навязывает его, не работает !

var options = { 
             controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider 
      maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34), 
      units: 'm', 
      numZoomLevels: 10, //setting the map's zoom levels to 10 only 
      allOverlays: false 
     } 

var osm = new OpenLayers.Layer.OSM(); //MY base layer 

//MY overlay layer 
var tib_villages = new OpenLayers.Layer.WMS(
        "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: null, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true} 
       ) 

;

Take 3: После того, как вы избавились от базового слоя Open Street Map при загрузке, карта имеет только 10 уровней масштабирования, как указано, но уровень tib_villages должен отображаться только тогда, когда уровень масштабирования 8-10, не работает!

var options = { 
             controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider 
      maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34), 
      units: 'm', 
      numZoomLevels: 10, //setting the map's zoom levels to 10 
      allOverlays: false 
     } 

//MY overlay layer 
var tib_villages = new OpenLayers.Layer.WMS(
        "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: 10, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true} 
       ); 

Все ваши предложения искренне оценены!

elshae

+0

** @ elshae **: Я бы поставил ваш вопрос на http://gis.stackexchange.com/ или в рассылке *[email protected]*. – Chau

+0

Хмм я пойду проверить gis.stackexchange.com, и я отправляю сообщение на [email protected], но у меня часто нет ответов: -/ – elshae

ответ

4

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

+0

Я на самом деле закончил с minScale в конце :), слишком плохо, я не могу отметить оба ответа как правильно: -/ – elshae

+0

Все нормально. Если вы можете изменить, какой ответ правильный, было бы неплохо, конечно, но это не biggie. –

+3

Если вы загиб - отправьте комментарий, чтобы я мог улучшить в будущем. Благодарю. –

9

Попробуйте использовать minResolution и maxResolution вместо minZoomLevel. Обычно это нормально. Вы можете получить разрешение для любого рычага трансфокатора, если вы вызываете метод map.getResolution().

Другой вариант - прослушивать OpenLayers.Mapzoomend событие и отображать видимость слоя соответственно. Что-то вроде этого:

map.events.on({ "zoomend": function (e) { 
    if (this.getZoom() > 2) { 
     layer1.setVisibility(false); 
     layer2.setVisibility(true); 
    } 
    else { 
     layer2.setVisibility(false); 
     layer1.setVisibility(true); 
    } 
    } 
}); 
+0

Большое спасибо! Ваш ответ был очень ясным и кратким, и теперь функциональность моей карты работает так, как я хотел: D – elshae

+0

понятное объяснение, изящное решение. работал безупречно. –

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