У меня есть слой 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» (веб-меркатор) и что координаты в документах 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()
методы.