ওপেনলায়ার্স 3-তে জেড-ইনডেক্স: ওল 3-এ স্তর অর্ডার করা


13

ওপেনলায়ার 3 এর স্তরগুলির জেড-ইনডেক্সগুলি পুরানো সংস্করণে যেমন পরিবর্তন করার কোনও পদ্ধতি আছে?

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

আমার একটি মানচিত্র ব্যবহার করে স্তরগুলির ক্রম পরিবর্তন করতে হবে। সুতরাং এর মতো জেড-সূচককে সংজ্ঞায়িত করার মতো সম্ভাবনা সাহায্য করে না

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

    }
});

এই সমাধানটি ব্যবহার করতে আমার সমস্যা হচ্ছে, সম্ভবত আমার এই জাতীয় জিনিসগুলি না বোঝার কারণে। আপনি কি দয়া করে ফলাফলটির একটি উদাহরণ পোস্ট করতে পারেন, আমি বিশ্বাস করি এটি সত্যিই আমাকে সাহায্য করবে?
ডেভ_ডোস_না_ফান্ডার

উত্তর:


10

এর মতো কিছু চেষ্টা করুন:

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

স্তরগুলির তালিকাটি একটি থেকে উত্তরাধিকার সূত্রে প্রাপ্ত একটি সামগ্রীতে রয়েছে ol.Collection। এটির জন্য এপিআই ডকটি দেখুন ।

সতর্কতা অবলম্বন করুন, আমি নিশ্চিত যে আপনি 99 setAtটির মতো স্বেচ্ছাচারিত সংখ্যাটি ব্যবহার করতে পারবেন না : প্রথম আরগটি স্তরগুলির অ্যারেতে অবস্থানের জন্য এবং দ্বিতীয় আর্গটি স্তরটি স্থানান্তর করতে চান এমন স্তর রেফারেন্সের জন্য। স্তরগুলির সংখ্যা পেতে, কেবল ব্যবহার করুনmap.getLayers().getArray().length

যদিও আপনি দেখতে পান যে আমরা স্তরগুলির জন্য একটি জেএস অ্যারে পেতে পারি, আমি নিশ্চিত নই যে এই অ্যারেটি সরাসরি পরিচালনা করা সবচেয়ে ভাল উপায় কারণ স্তরগুলি সংযুক্ত থাকতে পারে। ol.Collectionপরিবর্তে আপনি পদ্ধতিগুলি ব্যবহার করতে পারেন ।


আমি প্রতিস্থাপক জন্য একটি সমাধান খুঁজছেন ছিল, তাই আমি শুধু একটি মন্তব্য বলার অপেক্ষা রাখে না যে, এই (অবশ্যই) ও প্রতিস্থাপক জন্য কাজ করে, হিসাবে যুক্ত করতে চেয়েছিলেন map.getOverlays()আয় একটি ol.Collectionঠিক map.getLayers()আছে।
ডেসিবিট

8

এটি আগে হিসাবে সহজ হিসাবে সহজ নয়, তবে সংগ্রহের জন্য কিছু সহায়ক পদ্ধতি রয়েছে। এটি আপনাকে উপরে বর্ণিত থমাস জি as77 এর মতো কাজ করতে দেয়।

ধরে নিচ্ছি আপনার কাছে একটি মানচিত্রের নামক মানচিত্র রয়েছে, যার সাথে 4 টি স্তর রয়েছে [[বেস_লেয়ার, উপকূলরেখাগুলি, হিটম্যাপ, চিহ্নিতকারী]]

তারপরে আপনি মানচিত্রের মাধ্যমে সংগ্রহটি সংগ্রহ করতে পারেন get

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

সংগ্রহের পদ্ধতিগুলির মাধ্যমে আপনি স্তর ক্রমটি পরিচালনা করতে পারেন। এটি সম্ভবত কিছু সহায়ক ফাংশন তৈরি করতে সহায়তা করবে:

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

আশা করি আপনি আপনার স্তরগুলি সনাক্ত করতে এবং সেগুলি সন্ধান করার দক্ষতা পেয়েছেন, আমি লেয়ার.সেট ("স্তর_id" 44) এর মতো তৈরির জন্য একটি আইডি স্থাপন করেছি, যা পরে স্তর.জেটের ("স্তর_id") মাধ্যমে পুনরুদ্ধার করা যায়। তারপরে আপনার লেয়ার অ্যারের মাধ্যমে আপনি একটি ফাইন্ডলাইনার সহায়ক লুপ পেতে পারেন এবং স্তর সূচকটি ফিরে আসতে পারেন।

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

এইভাবে আমার কাছে মুভ লেয়ারবায়ারফোন (মানচিত্র, ফাইন্ডলায়ার (44), ফাইন্ড লাইয়ার (22%) এর মতো কিছু থাকতে পারে;

যাইহোক, সংগ্রহের মধ্যে প্রচুর পদ্ধতি রয়েছে তবে আশা করি এটি আপনাকে শুরু করতে সহায়তা করবে। এবং দুঃখিত যদি সেই কোডটিতে কিছু বাগ থাকে তবে সেটাই মনে মনে সংকলিত আছে ... :)


5

উত্তরের উপর ভিত্তি করে আমি প্রধান কোডটি মানচিত্র বলে মনে করে নিম্নলিখিত কোডটি লিখেছি এবং এটি একটি বিশ্বব্যাপী, আমি আইডি দ্বারা নয় নাম অনুসারে স্তরটি ব্যবহার করতে পছন্দ করেছি,

এখানে আমার কোড:

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

সংগ্রহের সূচকগুলি সেটএট বা ইনসার্টএটের মাধ্যমে হ্যান্ডেল করার দরকার নেই। সবচেয়ে সহজ উপায় হ'ল এপিআই- তে লেয়ারে সেটজেড ইন্ডেক্স পদ্ধতিটি ব্যবহার করা

geoLayer.setZIndex(999);

এখানে জটিল জিনিসটি মনে হয় কেবলমাত্র মানচিত্রটিতে স্তরগুলি ইতিমধ্যে থাকলে কাজ করা হয়। বলুন, আমি সরাসরি মানচিত্রে দুটি ভেক্টর স্তর রেখেছি (এক এক করে, সব একবারে নয়)। প্রথমটি আমি জিনডেক্স 10 তে সেট করলাম, দ্বিতীয়টি জিনডেক্স 9 তে সেট করুন This এটি কার্যকর হয় না। জিনডেক্স 9 সহ দ্বিতীয়টি জিনডেক্স 10 এর উপরে উপস্থিত হবে
কিরাদোটি

1

আমার ক্ষেত্রে থমাস জি's। এর উত্তরের AssertionErrorকারণ হয়েছে, কারণ যে স্তরটি আমি উপরে যাব সেটিকে ইতিমধ্যে মানচিত্রের সাথে সংযুক্ত করা হয়েছে ( https://openlayers.org/en/v4.4.2/doc/erferences/#58 )।

সমাধান আমার পক্ষে কাজ করেছে:

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

(ফাংশন রিটার্ন সরানো স্তর মুছে ফেলুন)। ওনলাইনারের পাশাপাশি কাজ করা উচিত, তবে আমি এটি পরীক্ষা করিনি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.