У моєму додатку OL3 є шар geojson, який я хочу перемальовувати кожні 5 секунд (щоб показати рух на карті).
Як це зробити? Не вдалося знайти еквівалент Layer.redraw ().
У моєму додатку OL3 є шар geojson, який я хочу перемальовувати кожні 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" (веб-меркатор) і що координати в документах 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.
не дуже корисний. Як використання методу змінений () відповідає на питання щодо перемальовування карти кожні 5 секунд?
layer.changed();
не вплинуло на мене, але source.changed();
зробило трюк.
Не потрібно явно оновлюватись. Кожен раз, коли ви оновлюєте вміст шару, карта оновлюється, вимагаючи нового відображення кадру.
Для примусового відображення вручну ви маєте map.render()
та map.renderSync()
методи.