मेरे ओएल 3 ऐप में एक जियोजोन परत है जिसे मैं हर 5 सेकंड में फिर से तैयार करना चाहता हूं (मानचित्र पर आंदोलन दिखाने के लिए)।
मैं यह कैसे करुं ? Layer.redraw () के बराबर नहीं मिल सका।
मेरे ओएल 3 ऐप में एक जियोजोन परत है जिसे मैं हर 5 सेकंड में फिर से तैयार करना चाहता हूं (मानचित्र पर आंदोलन दिखाने के लिए)।
मैं यह कैसे करुं ? Layer.redraw () के बराबर नहीं मिल सका।
जवाबों:
यह है कि आप हर 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" (वेब मर्केटर) हैं और जियोसन दस्तावेजों में निर्देशांक अनुदैर्ध्य और अक्षांश हैं।
vectorSource
और geojsonSource
विलय हो?
मुझे पता है कि यह सवाल पुराना है, लेकिन मैंने ओपनर 3 पर एक परत को ताज़ा करने के लिए एक समाधान ढूंढ लिया है।
आपको इस तरह परत स्रोत के अद्यतन को अद्यतन करना होगा:
var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);
updateParams
विधि का समर्थन नहीं करते हैं ; OL3.18.2 केवल शो के लिए यह ImageArcGISRest
, ImageMapGuide
, ImageWMS
, TileArcGISRest
और TileWMS
, और, के लिए नहीं जैसे, ol.source.Vector
।
आप WFS लेयर को रिफ्रेश कर सकते हैं myLayer.getSource().clear()
।
clear()
किसी भी मौजूदा सुविधाओं को कॉल करने पर नक्शे से तुरंत हटा दिया जाएगा, और केवल HTTP प्रतिक्रिया प्राप्त करने के बाद फिर से जोड़ा जाएगा। यह दोनों के लिए VectorOptions#url
और इसके लिए एक मूल्य निर्दिष्ट करने के लिए सही है VectorOptions#loader
। रियल टाइम डेटा के लिए, मैन्युअल रूप से कुछ WebSockets या एक्सएचआर जादू कर रही है और फिर कॉल getSource().clear()
के बाद getSource().addFeatures(...)
अंत उपयोगकर्ता के लिए बेहतर हो सकता है देखो।
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!
उम्मीद है की यह मदद करेगा।
यह परतों के लिए एकदम सही काम करता है:
layer.changed();
प्रति के रूप में http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed
layer.changed();
परतों के लिए एकदम सही (लिरिक्स) कैसे काम करता है, इसके बारे में थोड़ा और समझाने की जरूरत है । प्रलेखन विवरण Increases the revision counter and dispatches a 'change' event.
वास्तव में उपयोगी नहीं है। कैसे बदला हुआ () विधि का उपयोग करते हुए हर 5 सेकंड में नक्शे को फिर से तैयार करने के बारे में सवाल का जवाब दिया जाता है।
layer.changed();
का मेरे लिए कोई प्रभाव नहीं था, लेकिन source.changed();
चाल चली।
स्पष्ट रूप से ताज़ा करने की कोई आवश्यकता नहीं है। हर बार जब आप एक लेयर की सामग्री को अपडेट करते हैं तो एक नए फ्रेम रेंडरिंग का अनुरोध करते हुए मैप को रिफ्रेश किया जाता है।
मैन्युअल रूप से प्रतिपादन करने के लिए आपके पास map.render()
और map.renderSync()
विधियाँ हैं।