Wie definiere ich die Ebenenreihenfolge in Openlayern?

28

Ich habe eine Markierungsebene, zwei Vektorebenen und zwei Rasterebenen. Die Markierungsebene wird von den beiden Rasterebenen abgedeckt.

Gibt es eine Möglichkeit, die Markierungsebene immer nach oben zu verschieben?

Bearbeitet: Die Reihenfolge der Z-Indizes funktioniert in der Vektorebene gut, aber wenn ich der Karte eine weitere WMS-Rasterebene mit einem niedrigeren Z-Index hinzufüge, bedeckt die Rasterebene weiterhin die Vektorebene.

Bearbeitet: Kann jemand auf den Unterschied der Renderreihenfolge in Bezug auf "LayerIndex" und "Z-Index" einer Ebene hinweisen? Ich denke, der Ebenenindex befasst sich mit der Überlagerungsreihenfolge und der Zindex mit der Merkmalsreihenfolge in einer Vektorebene. Stimmt das?

Gesehen
quelle
Ich denke, Layerindex und Z-Index sind austauschbare Begriffe in OpenLayers. Sie werden im gleichen Kontext in der Dokumentation verwendet, z. B .
Casey
Hallo @Casey, ich schätze dein Beispiel. Ich denke jedoch nicht, dass der Layerindex und der Z-Index austauschbar sind. Nach meiner eigenen Erfahrung funktioniert der setZindex nicht, aber der setIndex. Ich stelle fest, dass: 1. das Z-Index-Beispiel in openlayer für ein Feature in einer Vektorebene funktioniert und durch rendererOptions: {zIndexing: true} aktiviert wird. 2.Aus Ihrem Beispiel für die Rasterbildebene können Sie ersehen, dass die Ebenenrenderreihenfolge von dem abhängt, was Sie auf dem Kartensteuerelement sehen (abhängig vom Ebenenindex als Antwortcode). 3. Der Ebenenindex wird in der Reihenfolge festgelegt, in der ich eine neue Ebene hinzufüge (Basisebene als 0 ...)
Gesehen
1. Ich denke du hast recht. 2 & 3. Richtig, aber Sie können das Standardverhalten überschreiben, indem Sie die setLayerIndex-Methode aufrufen, die den Z-Index einer Ebene anpasst. Dies wirkt sich auf die Reihenfolge der Ebenen im Kartensteuerelement und die Zeichenreihenfolge der Ebenen aus.
Casey

Antworten:

24

Das Festlegen des Z-Index für jede Ebene sollte helfen: http://www.openlayers.org/dev/examples/ordering.html

BEARBEITET

Das Beispiel, auf das ich ursprünglich verlinkt habe, ist nicht sehr hilfreich. Sie möchten den Layerindex / Z-Index der Layer festlegen, nicht die Maker innerhalb der Layer (wie im Bestellbeispiel gezeigt). Ich habe ein Beispiel (basierend auf diesem Beispiel ) zusammengestellt, das die benutzerdefinierte Ebenenindizierung zeigt. Beachten Sie, dass die Markierungsebene beim Aktivieren des Kanada-Rasters oben bleibt.

Hier ist der relevante Code:

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

Die Dokumentation zum setLayerIndex-Code finden Sie hier: http://dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/OpenLayers/Map-js.html#OpenLayers.Map.setLayerIndex

Casey
quelle
Das Beispiel verweist auf eine Malware.
Bazinga777
8

Sie können es tun, wenn Sie möchten, dass Ihre Vektorebene immer mit einfachem Code oben ist ...

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

Möge es einfach sein!

Aragon
quelle
4

Keines der oben genannten Probleme hat bei mir funktioniert, aber wenn ich eine neue Ebene hinzufüge, ist dies ein Genuss, um meine Marker-Ebene an der Spitze zu halten:

myMarkerLayer.setZIndex (1001);

ErichBSchulz
quelle
Dies war die einzige Antwort, die auch für mich funktioniert hat. Keiner der anderen hat funktioniert.
Matthew Lock
3

Sie können sich vorstellen, der Karte einen Layer hinzuzufügen, indem Sie ein neues Blatt über die vorhandenen legen. Wenn das neue Blatt nicht transparent ist, werden alle darunter liegenden ausgeblendet.

Leider hat OpenLayers keine insertLayerAt- Methode, sodass Sie Ihre Ebenen nach dem Einfügen neu anordnen müssen. Die Lösung besteht darin, die Ebene hinzuzufügen und sie dann auf die gewünschte Tiefe über den Stapel nach unten zu verschieben oder diejenige, die Sie oben haben möchten, wieder nach oben zu verschieben.

Das können Sie wie folgt machen:

// 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
quelle