OpenLayers 3'te Z-endeksi: OL3'te katman sırası


13

OpenLayers3'teki katmanların Z-dizinlerini eski sürümde olduğu gibi değiştirmek için bir yöntem var mı?

map.setLayerIndex(markers, 99); //set the marker layer to an arbitrarily high layer index

Bir harita kullanarak katmanların sırasını değiştirmem gerekiyor. Yani z-endeksini bu şekilde tanımlamak böyle bir olasılık yardımcı olmaz

var geoLayer = new ol.layer.Vector({
    source : new ol.source.GeoJSON({
        projection : 'EPSG:900913',
        url : './myGeoJson.json'
    }),
    style : function(feature, resolution) {
        var text = resolution < 5000 ? feature.get('name') : '';
        if (!styleCache[text]) {
            styleCache[text] = [new ol.style.Style({
                fill : new ol.style.Fill({
                    color : 'rgba(255, 255, 255, 0.1)'
                }),
                stroke : new ol.style.Stroke({
                    color : '#319FD3',
                    width : 1
                }),
                text : new ol.style.Text({
                    font : '12px Calibri,sans-serif',
                    text : text,
                    fill : new ol.style.Fill({
                        color : '#000'
                    }),
                    stroke : new ol.style.Stroke({
                        color : '#fff',
                        width : 3
                    })
                }),
                zIndex : 999
            })];
        }

    }
});

Büyük olasılıkla bu tür şeyleri anlamadığım için bu çözümü kullanırken sorun yaşıyorum. Lütfen sonucun bir örneğini gönderir misiniz, bunun bana gerçekten yardımcı olacağını düşünüyorum
dave_does_not_understand

Yanıtlar:


10

Şuna benzer bir şey deneyin:

map.getLayers().setAt(99, markers)

Katman listesi, bir nesneden devralınan bir nesnede bulunur ol.Collection. Bunun için API belgesine bakın .

Dikkatli olun, eminim 99 gibi rasgele bir sayı kullanamazsınız setAt: ilk arg, katman dizisindeki konum içindir ve ikinci arg, taşımak istediğiniz katman öğesi referansı içindir. Katman sayısını elde etmek içinmap.getLayers().getArray().length

Her ne kadar katmanlar için bir JS dizisi alabilirim, ancak katmanların ekli olayları olabileceğinden, bu diziyi doğrudan işlemenin en iyi yolu olduğundan emin değilim. Bunun ol.Collectionyerine yöntemleri kullanabilirsiniz .


Sadece bu (tabii ki) de bindirmeleri için çalıştığını söyleyerek bir yorum, eklemek istedim bu yüzden, bindirmeleri için bir çözüm arıyordu map.getOverlays()bir getiri ol.Collectiontıpkı map.getLayers()yapar.
decibyte

8

Eskisi kadar kolay değil, ama koleksiyon için bazı yardımcı yöntemler var. Bu, yukarıda açıklanan ThomasG77 ile benzer şeyler yapmanıza izin vermelidir.

4 adında harita adında bir haritanız olduğunu varsayarsak, [base_layer, sahil şeritleri, ısı haritası, işaretçiler]

Daha sonra koleksiyonu map.getLayers () üzerinden ve katman dizisini map.getLayers (). GetArray () üzerinden ve katmanları tek tek elde edebilirsiniz.

var heatmap = map.getLayers().getArray()[2]

Toplama yöntemleri ile katman sırasını değiştirebilirsiniz. Muhtemelen aşağıdaki gibi yardımcı fonksiyonların yaratılmasına yardımcı olacaktır:

function moveLayerBefore(map, old_idx, new_idx){
  var layer = map.getLayers().removeAt(old_idx);
  map.getLayers().insertAt(new_idx, layer);
}

Umarım katmanlarınızı tanımlama ve onları bulma yeteneğine sahipsiniz, daha sonra layer.get ("layer_id") yoluyla alınabilen layer.set ("layer_id" 44) gibi bir kimliğe ayarladım. Daha sonra katman diziniz boyunca bir findLayer yardımcı döngüsüne sahip olabilir ve katman dizinini döndürebilirsiniz.

function findLayer(map, layer_id){
  var layer_idx = -1;
  $.each(map.getLayers().getArray(), function (k,v){
    var this_layer_id = v.get("layer_id")
    if(this_layer_id == layer_id){
      layer_idx = k;
    }
  });
  return layer_idx;
}   

Bu şekilde moveLayerBefore (map, findLayer (44), findLayer (22)) gibi bir şeye sahip olabilirim;

Her neyse, koleksiyonda bir ton yöntem var, ancak umarım bu başlamanıza yardımcı olur. Ve bu kodda hatalar varsa üzgünüm, hepsi zihin derlenmiş ... :)


5

srussking cevabına dayanarak, harita adı verilen ana harita nesnesini varsayarak aşağıdaki kodu yazdım ve global bir var, kimliğe göre değil, adla bulma katmanını kullanmayı tercih ettim,

İşte benim kod:

function moveLayerBefore(old_idx, new_idx){
    if((old_idx === -1) || (new_idx === -1)){
        return false;
    }

    layer = map.getLayers().removeAt(old_idx);
    map.getLayers().insertAt(new_idx, layer);
}

function findLayer(layer_name){
    var layer_idx = -1;
    $.each(map.getLayers().getArray(), function (k,v){
        var this_layer_name = v.get('name');
        if(this_layer_name == layer_name){
            layer_idx = k;
        }
    });

    return layer_idx;
}

// set name1 before name2
moveLayerBefore(findLayer('name1'),findLayer('name2'));

1

SetAt veya insertAt aracılığıyla koleksiyondaki indeksleri işlemeye gerek yoktur. En kolay yolu olarak tabaka üzerine setZIndex yöntemini kullanmaktır API

geoLayer.setZIndex(999);

Buradaki zor şey, yalnızca katmanlar zaten haritadaysa işe yarıyor gibi görünüyor. Diyelim ki, iki vektör katmanını doğrudan haritaya koydum (birer birer, bir kerede değil). Birincisi ZIndex 10'a, ikincisi ZIndex 9'a ayarladım. Bu çalışmıyor. ZIndex 9 ile ikincisi ZIndex 10'un üstünde görünecek.
kiradotee

1

Benim durumumda ThomasG77'nin cevabı bir neden oldu AssertionError, çünkü yukarı çıkmak üzere olduğum katman zaten haritaya eklenmişti ( https://openlayers.org/en/v4.4.2/doc/errors/#58 ).

Benim için çalışan çözüm:

    let layers = map.getLayers();
    let markerTemp = layers.remove(refToMarkerLayer);
    layers.push(markerTemp);

(kaldırma işlevi kaldırılan katmanı döndürür). Oneliner da çalışmalı, ama test etmedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.