Mam aplikację geojson w mojej aplikacji OL3, którą chcę przerysować co 5 sekund (aby pokazać ruch na mapie).
Jak mam to zrobić ? Nie można znaleźć odpowiednika Layer.redraw ().
Mam aplikację geojson w mojej aplikacji OL3, którą chcę przerysować co 5 sekund (aby pokazać ruch na mapie).
Jak mam to zrobić ? Nie można znaleźć odpowiednika Layer.redraw ().
Odpowiedzi:
W ten sposób możesz odświeżać źródło wektora co 5 sekund z usługi zwracającej funkcje w dokumencie 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 służy tutaj do żądania danych za pomocą Ajax ( $.ajax
), ale oczywiście możesz użyć wybranej biblioteki.
Ten fragment kodu zakłada również, że rzutami mapy jest „EPSG: 3857” (mercator sieciowy) i że współrzędne w dokumentach GeoJSON to długości i szerokości geograficznej.
vectorSource
i powinien geojsonSource
zostać scalony?
Wiem, że to pytanie jest stare, ale w końcu znalazłem rozwiązanie, aby odświeżyć warstwę w openlayers 3.
Musisz zaktualizować parametry źródła warstwy w następujący sposób:
var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);
updateParams
metodę; OL3.18.2 tylko pokazuje, że dla ImageArcGISRest
, ImageMapGuide
, ImageWMS
, TileArcGISRest
i TileWMS
, a nie do np ol.source.Vector
.
Możesz odświeżyć warstwę WFS myLayer.getSource().clear()
.
clear()
wszelkie istniejące funkcje zostaną natychmiast usunięte z mapy i dodane ponownie dopiero po otrzymaniu odpowiedzi HTTP. Dotyczy to zarówno określenia wartości dla, jak VectorOptions#url
i dla VectorOptions#loader
. W przypadku danych w czasie rzeczywistym ręczne wykonanie niektórych magii WebSockets lub XHR, a następnie wywołanie, getSource().clear()
a następnie wywołanie getSource().addFeatures(...)
może wyglądać lepiej dla użytkownika końcowego.
W OL2 użyłem strategii odświeżania warstw, która nie została dodana do OL3. Poniżej znajduje się funkcja wywoływania, która użyje żądania ajax do pobrania GeoJSON, a następnie przeczytaj go i dodaj do źródła.
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!
Mam nadzieję że to pomoże.
Działa to idealnie w przypadku warstw:
layer.changed();
zgodnie z http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed
layer.changed();
działa idealnie (ly) dla warstw. Opis dokumentacji Increases the revision counter and dispatches a 'change' event.
nie jest zbyt pomocny. W jaki sposób użycie metody zmienionej () odpowiada na pytanie dotyczące przerysowywania mapy co 5 sekund?
layer.changed();
nie miało dla mnie żadnego efektu, ale source.changed();
zrobiło to samo.
Nie ma potrzeby wyraźnego odświeżania. Za każdym razem, gdy aktualizujesz zawartość warstwy, mapa jest odświeżana z żądaniem renderowania nowej ramki.
Aby wymusić ręczne renderowanie, masz map.render()
i map.renderSync()
metody.