2010-10-22 30 views
4

Je suis allé là-bas toute la journée et honnêtement, je n'ai plus d'idées. J'ai quelques couches WMS que je voudrais afficher/ne pas afficher en fonction du niveau de zoom actuel. Oui, j'ai parcouru les documents API et ils semblent être clairs comme le jour, mais je suis tout ce qui est suggéré et je n'obtiens pas les résultats souhaités :(Afficher le calque WMS en fonction du niveau de zoom

Ceci a été l'une des sources que j'ai regardé Ensuite, pour aggraver les choses, j'ai découvert que si vous avez une couche de base Open Street Map en charge, cela semble limiter votre contrôle sur les numZoomLevels de la carte, tout ce que je avais besoin, car je ne veux l'utiliser comme ma couche de base de chargement ...

Mes questions sont les suivantes:

Qu'est-ce que je fais mal? Est-il vrai qu'il n'existe pas de solution de contournement pour contrôler les niveaux de zoom lors de l'utilisation d'une couche de base Open Street Map en charge? Ou y a-t-il quelque chose que je ne sais pas?

Voici quelques-unes de mes tentatives de code: Prenez 1: le calque tib_villages ne devrait s'afficher que lorsque le niveau de zoom est de 8-10, ne fonctionne pas!

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: couche de tib_villages ne doit montrer que le niveau de zoom est de 8-10, la carte ne devrait avoir 10 niveaux de zoom, mais a 19 comme la couche Open Street Map, il applique à, ne fonctionne pas !

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} 
       ) 

; Prendre 3: Après avoir éliminé la couche de base Open Street Map en charge, la carte n'a que 10 niveaux de zoom comme spécifié, mais la couche tib_villages ne devrait s'afficher que lorsque le niveau de zoom est de 8-10, ne fonctionne pas!

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} 
       ); 

Toutes vos suggestions sont sincèrement appréciées!

elshae

+0

** @ elshae **: J'adresserais ta question sur http://gis.stackexchange.com/ ou sur la liste de diffusion * [email protected]*. – Chau

+0

Hmm Je vais aller voir gis.stackexchange.com et je poste sur [email protected].org, mais je n'obtiens souvent aucune réponse: -/ – elshae

Répondre

4

Je recommande d'utiliser la maxScale et minScale sur les couches au lieu de la résolution, mais c'est peut-être une question de goût. :-) Je ne peux pas me référer à une valeur de résolution, mais une échelle est facile à comprendre et à maintenir à plus long terme, quand les autres regardent votre code.

+0

En fait, je me suis retrouvé avec minScale à la fin :), tant pis je ne peux pas marquer les deux réponses comme à droite: -/ – elshae

+0

C'est ok. Si vous pouvez changer la bonne réponse, ce serait bien sûr, mais ce n'est pas un problème. –

+3

Si vous êtes downvoting - s'il vous plaît soumettre un commentaire afin que je puisse améliorer dans le futur. Merci. –

9

Essayez d'utiliser minResolution et maxResolution au lieu de minZoomLevel. Cela fonctionne habituellement bien. Vous pouvez obtenir une résolution pour tout levier de zoom si vous appelez la méthode map.getResolution().

Une autre option est d'écouter OpenLayers.Map l'événement zoomend et de basculer la visibilité du calque en conséquence. Quelque chose comme ceci:

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

Merci beaucoup! Votre réponse était très claire et concise et maintenant la fonctionnalité de ma carte fonctionne comme je le voulais: D – elshae

+0

explication claire, solution élégante. travaillé impeccablement bien. –