ওপেন লেয়ারস 3: কোনও বৈশিষ্ট্যের স্টাইল পরিবর্তন করার পরে মানচিত্রটি কীভাবে রিফ্রেশ করবেন?


9

আমার কাছে একটি ওপেনলায়ার্স ৩.২.০ মানচিত্র রয়েছে যা কিছু ভেক্টর উত্স ( ol.source.Vector) এবং সম্পর্কিত ভেক্টর স্তরগুলি ( ol.layer.Vector) সরবরাহ করে

যখন বৈশিষ্ট্যগুলি ( ol.Feature) ভেক্টর উত্সগুলিতে যুক্ত করা হয়, তখন তাদের এমন একটি dataসম্পত্তি দেওয়া হয় যা জাভাস্ক্রিপ্ট অবজেক্টে সেট করা থাকে যা বৈশিষ্ট্যটি উপস্থাপন করে। টাইপস্ক্রিপ্ট অনুসরণ করে ...

vectorSource.addFeature(new ol.Feature({
    geometry: /* ... */,
    data: vectorData,
}));

ভেক্টর স্তরগুলির পরে একটি স্টাইল-ফাংশন থাকে যা dataসম্পত্তিটি পড়ে এবং এর স্টাইলটি পুনরুদ্ধার করে:

vectorLayer = new ol.layer.Vector({
    source: vectorSource,
    renderBuffer: /* ... */,
    style: function (feature: ol.Feature, resolution: any) {
        var data = </* TypeScript Type */>feature.get('data');
        if ((data) && (data.style)) {
            return [data.style];
        }
        else {
            /* return default style */
        }
    }
});

কখনও কখনও, মানচিত্রের সাথে সম্পর্কিত না হওয়া ইভেন্টগুলির কারণে শৈলীর পরিবর্তন ঘটে। উদাহরণস্বরূপ, যখন কোনও বস্তু অবৈধ হয়ে যায়, তখন এর স্টাইলটি পরিবর্তিত হয়। স্পষ্টতই, যেহেতু data.styleপুরোপুরি আমার নিয়ন্ত্রণে রয়েছে তাই এটি পরিবর্তন করা তুচ্ছ।

সমস্যাটি হ'ল মানচিত্রটি জানে না যে স্টাইলটি পরিবর্তিত হয়েছে। যদি আমি কোনও অবজেক্টের স্টাইল পরিবর্তন করি এবং মানচিত্রটিকে পুনরায় আঁকতে বাধ্য করি তবে জুম করে দেখি যে আমার স্টাইল-ফাংশনগুলি নতুন স্টাইলটি চালিয়ে ফিরে আসে এবং বৈশিষ্ট্যটি আবার চিত্রিত হয়। আমি কীভাবে অগ্রণীভাবে মানচিত্রটিকে রিফ্রেশ করতে বাধ্য করব?

কিছু অনুসন্ধান এবং পরীক্ষার পরে, আমি চেষ্টা করেছি:

  1. কলিং render()উপর ol.Mapনিজেই।
  2. কলিং dispatchChangeEvent()উপরol.source.Vector
  3. কলিং redraw()উপরol.layer.Vector

এগুলি প্রস্তাবিত হয়েছিল তবে তাদের কেউই কাজ করেন নি, এটি অবাক করার মতো নয় যেহেতু কেবল প্রথম পদ্ধতিটি এমনকি ওপেন লেয়ারস ৩.২.০ এপিআই ডকুমেন্টেশনে তালিকাভুক্ত এবং এটি স্থিতিশীল হিসাবে চিহ্নিত করা হয়নি।


আপনি চেষ্টা করেছেন ভেক্টরলেয়ার.ফ্রেস ({বল: সত্য}); ?
ylka

আমার কাছে কিন্তু, আশ্চর্যজনকভাবে এটি কাজ করে না কারণ এটি একটি ওপেনলায়ার্স 2 পদ্ধতি।
জারলি

উত্তর:


12

সুযোগমতো, আমি উত্তরটি হোঁচট খেয়েছি - তাদের সম্পর্কিত ডেটার সম্পত্তি changed()পরিবর্তন করার পরে styleতাদের বৈশিষ্ট্যগুলি কল করা । দেখুন: http://openlayers.org/en/v3.2.0/apidoc/ol.Feature.html?unstable=true# পরিবর্তন

এটির জন্য ol.Featureপ্রতিটি vectorDataবস্তুর সাথে যুক্ত অবজেক্টগুলি আমার নজর রাখার প্রয়োজন নেই (পূর্বে, আমাকে কেবল vectorDataকোনও বৈশিষ্ট্য থেকে এটি সন্ধানের প্রয়োজন ছিল যা দিয়ে সম্পন্ন করা যেতে পারে get()) তবে এটি খুব বেশি ব্যয় করে না।

(আমি এ খুঁজছেন দ্বারা এই পাওয়া setGeometryএবং setStyleএবং এর অন্যান্য পদ্ধতি ol.Featureতারা কি দেখতে।)


যদিও এই পদ্ধতিটি কার্যকর হয়, changedযেকোন যুক্তিসঙ্গত বৈশিষ্ট্যের জন্য কল করা আসলে বেশ মারাত্মক পারফরম্যান্স জরিমানা (ক্রমকে ক্র্যাশ করে বহুবার এইভাবে ক্র্যাশ করে)। changed()আপনার সমস্ত বৈশিষ্ট্য পরিবর্তিত হওয়ার পরে আমি আপনার স্তরের উত্সে ফোন করার পরামর্শ দেব ।
কাইল

0

মুছে ফেলার পরে মানচিত্র থেকে কীভাবে কোনও বৈশিষ্ট্য (বহুভুজ) অদৃশ্য হয়ে যায় তা নির্ধারণের চেষ্টা করার জন্য আমি এক সপ্তাহ কাটিয়েছি ( vectorSource.removeFeature(selectedFeature)এবং কোনও সমাধান কার্যকর হয়নি। অবাকভাবে বর্তমান ওএল 3 ভি 3.15.1 এর বেসিক জোর-রিফ্রেশ / রেন্ডার ফাংশন নেই যা কাজটি! আমার জন্য যে সমাধানটি কাজ করেছিল তা হ'ল selectedFeatureস্টাইল পরিবর্তন করা :

        var newStyle = new ol.style.Style({
            image: new ol.style.Circle({
                radius: 5,
                fill: new ol.style.Fill({color: 'red'}),
                stroke: new ol.style.Stroke({color: 'yellow', width: 1})
            })
        });
        selectedFeature.setStyle(newStyle)

বৈশিষ্ট্যটি ইতিমধ্যে স্তর থেকে সরানো হলেও রিফ্রেশ না করে যে কোনও স্টাইল কাজ করবে।

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