Comment définir l'ordre des calques dans Openlayers?

28

J'ai un calque marqueur, deux calques vectoriels et deux calques raster. La couche marqueur est couverte par les deux couches raster.

Existe-t-il un moyen de déplacer le calque marqueur toujours au-dessus?

Modifié: l'ordre des index Z fonctionne bien dans la couche vectorielle, mais lorsque j'ajoute une autre couche raster WMS sur la carte avec un index Z inférieur, la couche raster couvre toujours la couche vectorielle.

Modifié: Quelqu'un pourrait-il souligner la différence de l'ordre de rendu en termes de "LayerIndex" et "Z-Index" d'un calque? Je pense que l'indice de calque traite de l'ordre de superposition et le Zindex traite de l'ordre des entités dans une couche vectorielle, ai-je raison?

Vu
la source
Je pense que layerindex et z-index sont des termes interchangeables dans OpenLayers. Ils sont utilisés dans le même contexte dans la documentation, ex: dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/…
Casey
Bonjour @Casey J'apprécie ton exemple. Cependant, je ne pense pas que le layerindex et le z-index soient interchangeables. Pour ma propre expérience, le setZindex ne fonctionne pas mais le setIndex fonctionne. Je remarque que: 1. l'exemple Z-index en openlayer fonctionne pour une entité dans une couche vectorielle, et il est activé par rendererOptions: {zIndexing: true}. 2.Dans votre exemple pour la couche d'image raster, vous pouvez voir que l'ordre de rendu des couches est basé sur ce que vous voyez sur le contrôle de carte, qui dépend de l'index de la couche (comme votre code de réponse). 3. L'index des calques est défini par l'ordre que j'ajoute sur le nouveau calque (calque basé sur 0 ...)
Vu
1. Je pense que vous avez raison. 2 & 3. Exact, mais vous pouvez remplacer le comportement par défaut en appelant la méthode setLayerIndex, qui ajuste le z-index d'un calque. Cela affectera l'ordre des couches dans le contrôle de carte et l'ordre de dessin des couches.
Casey

Réponses:

24

La définition du z-index pour chaque couche devrait aider: http://www.openlayers.org/dev/examples/ordering.html

ÉDITÉ

L'exemple auquel j'ai lié à l'origine n'est pas trop utile. Vous souhaitez définir l'index de couche / index z des couches, pas les fabricants au sein des couches (comme le montre l'exemple de commande). J'ai rassemblé un exemple (basé sur cet exemple ) montrant l'indexation de couche personnalisée. Notez que lorsque vous activez le Canada Raster, le calque Marqueur reste en haut.

Voici le code pertinent:

map.setLayerIndex(dm_wms, 0); //set the image overlay to the bottom
map.setLayerIndex(markers, 99); //set the marker layer to an arbitrarily high layer index

La documentation du code setLayerIndex est ici: http://dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/OpenLayers/Map-js.html#OpenLayers.Map.setLayerIndex

Casey
la source
l'exemple est lié à un malware.
Bazinga777
8

Vous pouvez le faire, si vous voulez que votre couche vectorielle soit toujours remplie de code ...

var vecLyr = map.getLayersByName('VectorLayer')[0];
map.raiseLayer(vecLyr, map.layers.length);

Que ce soit facile!

Aragon
la source
4

rien de ce qui précède n'a fonctionné pour moi, mais simplement le faire chaque fois que j'ajoute un nouveau calque a fait un régal pour garder mon calque de marqueur sur le dessus:

myMarkerLayer.setZIndex (1001);

ErichBSchulz
la source
Ce fut la seule réponse qui a fonctionné pour moi aussi. Aucun des autres n'a fonctionné.
Matthew Lock
3

Vous pouvez penser à ajouter une couche à la carte comme à poser une nouvelle feuille par-dessus celles existantes. Si la nouvelle feuille n'est pas transparente, elle masquera toutes celles ci-dessous.

Malheureusement, OpenLayers ne dispose pas d'une méthode insertLayerAt , vous devez donc réorganiser vos calques après l'insertion. La solution consiste alors à ajouter la couche, puis à la déplacer vers le bas de la pile à la profondeur souhaitée ou à déplacer celle que vous souhaitez en haut vers le haut.

Vous pouvez le faire comme suit:

// add your wms as usual
var yourWMSLayer = new ....
map.addLayer(yourWMSlayer);

// you can do it both ways:
// 1. now move the markers to the top of the stack
var yourMarkers = map.getLayersByName("the marker layer name")[0];
map.setLayerIndex(yourMarkers, map.layers.length-1);

// 2. OR you move the WMS down
// this is more succint
map.setLayerIndex(yourWMSLayer, map.layers.length-2);
unicoletti
la source