Jak zdefiniować kolejność warstw w Openlayers?

28

Mam warstwę znacznika, dwie warstwy wektorowe i dwie warstwy rastrowe. Warstwa znacznika zostaje przykryta przez dwie warstwy rastrowe.

Czy istnieje sposób na przeniesienie warstwy znacznika zawsze na wierzch?

Edytowane: Kolejność indeksów Z działa dobrze w warstwie wektorowej, ale gdy dodam kolejną warstwę rastrową WMS na mapie o niższym indeksie Z, warstwa rastrowa nadal obejmuje warstwę wektorową.

Edytowane: Czy ktoś mógłby wskazać różnicę w kolejności renderowania w kategoriach „LayerIndex” i „Z-Index” warstwy? Myślę, że indeks warstw zajmuje się kolejnością nakładek, a Zindex zajmuje się kolejnością obiektów w warstwie wektorowej, prawda?

Widziany
źródło
Myślę, że layerindex i z-index są wymiennymi terminami w OpenLayers. Są one używane w tym samym kontekście w dokumentacji, np .: dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/…
Casey
Cześć @Casey Doceniam twój przykład. Nie sądzę jednak, by indeks warstwy i indeks Z były wymienne. Z mojego własnego doświadczenia setZindex nie działa, ale setIndex działa. Zauważam, że: 1. przykład indeksu Z w openlayer działa dla funkcji w warstwie wektorowej i jest włączony przez rendererOptions: {zIndexing: true}. 2. Na przykładzie warstwy obrazu rastrowego widać, że kolejność renderowania warstw jest oparta na tym, co widać na kontrolce mapy, która zależy od indeksu warstwy (jako kodu odpowiedzi). 3. Indeks warstw jest ustalany według kolejności, którą dodaję na nowej warstwie (warstwa bazowa jako 0 ...)
Widziano
1. Myślę, że masz rację. 2 i 3. Tak, ale możesz zmienić domyślne zachowanie, wywołując metodę setLayerIndex, która dostosowuje indeks Z warstwy. Wpłynie to na kolejność warstw w kontrolce mapy i kolejność rysowania warstw.
Casey

Odpowiedzi:

24

Ustawienie indeksu Z dla każdej warstwy powinno pomóc: http://www.openlayers.org/dev/examples/ordering.html

EDYTOWANE

Przykład, z którym pierwotnie korzystałem, nie jest zbyt pomocny. Chcesz ustawić indeks warstw / indeks z warstw, a nie twórców w obrębie warstw (jak pokazano w przykładzie porządkowania). Złożyłem przykład (na podstawie tego przykładu ) pokazujący niestandardowe indeksowanie warstw. Zauważ, że po włączeniu funkcji Canada Raster warstwa znacznika pozostaje na wierzchu.

Oto odpowiedni kod:

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

Dokumentacja dla kodu setLayerIndex znajduje się tutaj: http://dev.openlayers.org/releases/OpenLayers-2.11/doc/apidocs/files/OpenLayers/Map-js.html#OpenLayers.Map.setLayerIndex

Casey
źródło
przykład prowadzi do złośliwego oprogramowania.
Bazinga777
8

Możesz to zrobić, jeśli chcesz, aby warstwa wektorowa zawsze zawierała tylko kod ...

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

Niech to będzie łatwe!

Aragonia
źródło
4

żadne z powyższych nie działało dla mnie, ale po prostu robiąc to za każdym razem, gdy dodam nową warstwę, działało uczta, aby utrzymać warstwę znacznika na wierzchu:

myMarkerLayer.setZIndex (1001);

ErichBSchulz
źródło
To była jedyna odpowiedź, która również działała dla mnie. Żadne z pozostałych nie działało.
Matthew Lock
3

Możesz pomyśleć o dodaniu warstwy do mapy, tak aby położyć nowy arkusz na istniejących. Jeśli nowy arkusz nie jest przezroczysty, ukryje wszystkie poniższe.

Niestety OpenLayers nie ma metody insertLayerAt , więc po wstawieniu musisz zmienić kolejność warstw. Rozwiązaniem jest dodanie warstwy, a następnie przesunięcie jej w dół stosu na żądaną głębokość lub przeniesienie tego, który chcesz na górze, z powrotem na górę.

Możesz to zrobić w następujący sposób:

// 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
źródło