OpenLayers 3: फ़ीचर की शैली बदलने के बाद मैप को रिफ्रेश कैसे करें?


9

मेरे पास एक OpenLayers 3.2.0 मानचित्र है जिसमें कुछ वेक्टर स्रोत ( 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

ये सुझाए गए थे, लेकिन उनमें से किसी ने भी काम नहीं किया, जो कि आश्चर्य की बात नहीं है क्योंकि केवल पहली विधि भी OpenLayers 3.2.0 एपीआई प्रलेखन में सूचीबद्ध है और इसे स्थिर के रूप में चिह्नित नहीं किया गया है।


क्या आपने वेक्टरलेयर.रेफेश ({बल: सत्य}) की कोशिश की है; ?
ylka

मेरे पास है, लेकिन हैरानी की बात है कि यह काम नहीं करता है क्योंकि यह एक OpenLayers 2 विधि है।
Xharlie

जवाबों:


12

संयोग से, मैंने जवाब पर ठोकर खाई है - यह उनके संबंधित डेटा changed()की styleसंपत्ति को बदलने के बाद स्वयं सुविधाओं पर कॉल करना है। देखें: http://openlayers.org/en/v3.2.0/apidoc/ol.Feature.html?unstable=true#changed

इससे मुझे ol.Featureप्रत्येक vectorDataवस्तु से जुड़ी वस्तुओं पर नज़र रखने की आवश्यकता होती है (पूर्व में, मुझे केवल vectorDataएक सुविधा से ढूंढने की आवश्यकता थी , जिसे किया जा सकता था get()) लेकिन यह बहुत अधिक लागत नहीं है।

(मैं को देखकर यह पाया setGeometryऔर setStyleऔर पर अन्य तरीकों ol.Featureकि वे क्या करते हैं।)


यद्यपि यह दृष्टिकोण काम करता है, changedकिसी भी उचित संख्या में सुविधाओं के लिए कॉल करना वास्तव में एक बहुत ही गंभीर प्रदर्शन दंड देता है (क्रोम को इस तरह से कई बार क्रैश किया गया)। मैं changed()आपकी सभी विशेषताओं को बदलने के बाद आपकी परत के स्रोत पर कॉल करने की सलाह दूंगा।
काइल

0

मैंने इसे हटाने के बाद नक्शे से एक विशेषता (बहुभुज) गायब करने का तरीका जानने के लिए एक सप्ताह का समय बिताया ( vectorSource.removeFeature(selectedFeature)और कोई समाधान काम नहीं किया। अजीब तरह से वर्तमान OL3 v3.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)

कोई भी शैली काम करेगी क्योंकि फीचर को पहले ही लेयर से हटा दिया गया है लेकिन रिफ्रेश नहीं किया गया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.