OpenLayers 3 में layer.redraw (true) के बराबर?


13

मेरे ओएल 3 ऐप में एक जियोजोन परत है जिसे मैं हर 5 सेकंड में फिर से तैयार करना चाहता हूं (मानचित्र पर आंदोलन दिखाने के लिए)।

मैं यह कैसे करुं ? Layer.redraw () के बराबर नहीं मिल सका।


क्या आपने ol.animation को देखा है? सामान्य तौर पर, वेक्टर ड्राइंग चिकनी है और ol3 में अलग तरह से संभाला जाता है, लेकिन यह आपके प्रश्न से पूरी तरह से स्पष्ट नहीं है कि आप क्या करना चाहते हैं।
जॉन पॉवेल

@ JohnBarça - मेरा जियोसन डेटा पोस्टग्रेज से आता है जिसे हर 5 सेकंड में नए जीपीएस डेटा के साथ अपडेट किया जा रहा है। मैं हर बार मानचित्र पर इकाइयों की वर्तमान स्थिति को दिखाने के लिए परत को फिर से दिखाना चाहता हूं (यह बदलते रहते हैं ...)
अल्फाइंड

तो, आप एक पुनरावर्ती सेटटाइमआउट कॉल (या कुछ इसी तरह) का उपयोग करके हर 5 सेकंड में डेटा का अनुरोध कर रहे हैं और आप बस जानना चाहते हैं कि वेक्टर सुविधाओं को ताज़ा करने के लिए कैसे मजबूर किया जाए?
जॉन पॉवेल

@ JohnBarça - अगर कोई बेहतर तरीका है जो मैं सीखने को तैयार हूं, लेकिन यह वही है जो मैं करता हूं, मैं मानचित्र पर वास्तविक समय में जीपीएस का स्थान दिखाना चाहता हूं। GPS अपना स्थान PostGIS को भेजता है और वहाँ से मैंने जियोजन्स (या मैं जियोसेवर का उपयोग कर सकता हूं) डेटा का उपयोग करके पढ़ा है, लेकिन मैं परत को हर एक समय में अपडेट करने की इच्छा रखता हूं।
एल्फाइंड

ज़रूर, मुझे वही मिलेगा जो आप करने की कोशिश कर रहे हैं। कोड सैंपल का कोई भी मौका, क्योंकि मेरे अनुभव में, यदि आप एक एनीमेशन लूप को सेसमेट में डालते हैं, तो अजाक्स के साथ रिमोट सर्वर पर कॉल करें, और फॉर्मेट.जेनजोन या इसी तरह का उपयोग करके वापस आने वाले जोंस को लोड करें, तो फीचर्स अपडेट हो जाएंगे।
जॉन पॉवेल

जवाबों:


9

यह है कि आप हर 5 सेकंड में एक वेक्टर स्रोत को कैसे रिफ्रेश कर सकते हैं, एक जियोजंस डॉक्यूमेंट में वेब सेवा वापसी सुविधाओं से:

var vectorSource = new ol.source.Vector();
var geojsonFormat = new ol.format.GeoJSON();

window.setTimeout(function() {
  $.ajax('http://example.com/data.json', function(data) {
    var features = geojsonFormat.readFeatures(data
        {featureProjection:"EPSG:3857"});
    geojsonSource.clear();
    geojsonSource.addFeatures(features);
  });
}, 5000);

अजाक्स के माध्यम से डेटा का अनुरोध करने के लिए jQuery का उपयोग यहां किया गया है $.ajax, लेकिन आप स्पष्ट रूप से अपनी पसंद के पुस्तकालय का उपयोग कर सकते हैं।

यह कोड स्निपेट यह भी मानता है कि मानचित्र के अनुमान "EPSG: 3857" (वेब ​​मर्केटर) हैं और जियोसन दस्तावेजों में निर्देशांक अनुदैर्ध्य और अक्षांश हैं।


3
इस कोड को मुझे confuses, चाहिए vectorSourceऔर geojsonSourceविलय हो?
केली थॉमस

मुझे लगता है कि आपका मतलब है window.setInterval सेटटाइमआउट नहीं; अन्यथा यह केवल एक बार ही करता है।
जोनाथन

9

मुझे पता है कि यह सवाल पुराना है, लेकिन मैंने ओपनर 3 पर एक परत को ताज़ा करने के लिए एक समाधान ढूंढ लिया है।

आपको इस तरह परत स्रोत के अद्यतन को अद्यतन करना होगा:

var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);

3
ऐसा लगता है कि सभी स्रोत updateParamsविधि का समर्थन नहीं करते हैं ; OL3.18.2 केवल शो के लिए यह ImageArcGISRest, ImageMapGuide, ImageWMS, TileArcGISRestऔर TileWMS, और, के लिए नहीं जैसे, ol.source.Vector
अर्जन

दिनांक # getTime कैश को अमान्य करने के लिए Date # getMilliseconds से बेहतर हो सकता है और परत को फिर से तैयार करने के लिए मजबूर कर सकता है क्योंकि यह प्रत्येक बार एक अद्वितीय संख्या सुनिश्चित करेगा।
वॉकमैरट

5

आप WFS लेयर को रिफ्रेश कर सकते हैं myLayer.getSource().clear()


1
यह मेरे लिए OpenLayers 3 v। 0.14.2 और एक WFS GeoJSON वेक्टर स्रोत के साथ किया था।
डिर्क

3
एक लाइन के जवाब में कुछ भी गलत नहीं है अगर वे पैसे पर हैं। इस जानकारी बॉक्स को निकालने के लिए एक प्रतिष्ठा पुरस्कार होना चाहिए।
डेनिस बाऊज़स

1
उत्तर सही है, लेकिन यह कुछ चंचल दिखा सकता है: clear()किसी भी मौजूदा सुविधाओं को कॉल करने पर नक्शे से तुरंत हटा दिया जाएगा, और केवल HTTP प्रतिक्रिया प्राप्त करने के बाद फिर से जोड़ा जाएगा। यह दोनों के लिए VectorOptions#urlऔर इसके लिए एक मूल्य निर्दिष्ट करने के लिए सही है VectorOptions#loader। रियल टाइम डेटा के लिए, मैन्युअल रूप से कुछ WebSockets या एक्सएचआर जादू कर रही है और फिर कॉल getSource().clear()के बाद getSource().addFeatures(...)अंत उपयोगकर्ता के लिए बेहतर हो सकता है देखो।
अर्जन

3

OL2 के साथ मैंने एक लेयर रिफ्रेश रणनीति का उपयोग किया है जिसे OL3 में नहीं जोड़ा गया है। नीचे एक स्वयं कॉलिंग फ़ंक्शन है जो जेजेन्सन को लाने के लिए एक अजाक्स अनुरोध का उपयोग करेगा और फिर इसे पढ़कर एक स्रोत में जोड़ देगा।

var yourSource = new ol.source.GeoJSON();

//add this source to a layer, the layer to a map with a view etc
...

//now fetch the data
var fetchData = function () {
    jQuery.ajax(url,
    {
        dataType: 'json',
        success: function (data, textStatus, jqXHR) {
            yourSource.clear(); //remove existing features
            yourSource.addFeatures(yourSource.readFeatures(data));
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log(errorThrown);
        }
    });

    //call this again in 5 seconds time
    updateTimer = setTimeout(function () {
        fetchData();
    }, 5000);
};
fetchData(); //must actually call the function!

उम्मीद है की यह मदद करेगा।


2

यह परतों के लिए एकदम सही काम करता है:

layer.changed();

प्रति के रूप में http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed


1
आपको layer.changed();परतों के लिए एकदम सही (लिरिक्स) कैसे काम करता है, इसके बारे में थोड़ा और समझाने की जरूरत है । प्रलेखन विवरण Increases the revision counter and dispatches a 'change' event.वास्तव में उपयोगी नहीं है। कैसे बदला हुआ () विधि का उपयोग करते हुए हर 5 सेकंड में नक्शे को फिर से तैयार करने के बारे में सवाल का जवाब दिया जाता है।
nmtoken

मैंने एक संशोधित जियोजोन स्रोत को बचाने के लिए अजाक्स का उपयोग किया है, और मेरे पास समस्या यह थी कि अगर मैंने परत को बंद कर दिया और इसे फिर से खोला तो मानचित्र ने स्रोत के कैश्ड (अपरिवर्तित) संस्करण का उपयोग किया। एक बार जब मैंने कैश को साफ़ कर दिया तो परत संशोधित स्रोत का उपयोग करती थी जैसा कि मुझे उम्मीद थी। दुर्भाग्य से, सुझाव layer.changed();का मेरे लिए कोई प्रभाव नहीं था, लेकिन source.changed();चाल चली।
पीटर कूपर

1

स्पष्ट रूप से ताज़ा करने की कोई आवश्यकता नहीं है। हर बार जब आप एक लेयर की सामग्री को अपडेट करते हैं तो एक नए फ्रेम रेंडरिंग का अनुरोध करते हुए मैप को रिफ्रेश किया जाता है।

मैन्युअल रूप से प्रतिपादन करने के लिए आपके पास map.render()और map.renderSync()विधियाँ हैं।


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