ฉันมีเลเยอร์ geojson ในแอป OL3 ของฉันซึ่งฉันต้องการวาดใหม่ทุก 5 วินาที (เพื่อแสดงการเคลื่อนไหวบนแผนที่)
ฉันต้องทำอย่างไร ? ไม่พบสิ่งที่เทียบเท่ากับ Layer.redraw ()
ฉันมีเลเยอร์ geojson ในแอป OL3 ของฉันซึ่งฉันต้องการวาดใหม่ทุก 5 วินาที (เพื่อแสดงการเคลื่อนไหวบนแผนที่)
ฉันต้องทำอย่างไร ? ไม่พบสิ่งที่เทียบเท่ากับ Layer.redraw ()
คำตอบ:
นี่คือวิธีที่คุณสามารถรีเฟรชแหล่งเวกเตอร์ทุก ๆ 5 วินาทีจากเว็บเซอร์วิสที่ส่งคืนฟีเจอร์ในเอกสาร GeoJSON:
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 ( $.ajax
) แต่คุณสามารถใช้ไลบรารี่ที่คุณต้องการได้อย่างชัดเจน
ตัวอย่างรหัสนี้ยังถือว่าสมมติฐานของแผนที่คือ "EPSG: 3857" (เว็บ Mercator) และพิกัดในเอกสาร GeoJSON นั้นมีความยาวและละติจูด
vectorSource
และgeojsonSource
ผสาน?
ฉันรู้ว่าคำถามนี้เก่า แต่ในที่สุดฉันก็ได้พบวิธีแก้ปัญหาเพื่อรีเฟรชเลเยอร์ใน openlayers 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 หรือ XHR เวทมนต์ด้วยตนเองจากนั้นการโทรgetSource().clear()
ตามด้วยgetSource().addFeatures(...)
อาจทำให้ผู้ใช้ปลายทางดูดีขึ้น
ด้วย OL2 ฉันใช้กลยุทธ์การรีเฟรชเลเยอร์ซึ่งไม่ได้เพิ่มใน OL3 ด้านล่างเป็นฟังก์ชันการโทรด้วยตนเองที่จะใช้คำขอ ajax เพื่อดึงข้อมูล GeoJSON แล้วอ่านและเพิ่มไปยังแหล่งที่มา
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.
ไม่เป็นประโยชน์จริง ๆ การใช้เมธอด change () จะตอบคำถามเกี่ยวกับการเขียนแผนที่ใหม่ทุก ๆ 5 วินาทีได้อย่างไร
layer.changed();
ไม่มีผลสำหรับฉัน แต่source.changed();
ทำเคล็ดลับ
ไม่จำเป็นต้องรีเฟรชอย่างชัดเจน ทุกครั้งที่คุณอัปเดตเนื้อหาของเลเยอร์แผนที่จะรีเฟรชคำขอการเรนเดอร์เฟรมใหม่
เพื่อบังคับให้แสดงผลด้วยตนเองคุณมีmap.render()
และmap.renderSync()
วิธีการ