Ho un layer geojson nella mia app OL3 che voglio ridisegnare ogni 5 secondi (per mostrare il movimento sulla mappa).
Come lo faccio ? Impossibile trovare l'equivalente di Layer.redraw ().
Ho un layer geojson nella mia app OL3 che voglio ridisegnare ogni 5 secondi (per mostrare il movimento sulla mappa).
Come lo faccio ? Impossibile trovare l'equivalente di Layer.redraw ().
Risposte:
Ecco come è possibile aggiornare un'origine vettoriale ogni 5 secondi, da un servizio Web che restituisce funzionalità in un documento 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 viene utilizzato qui per richiedere i dati tramite Ajax ( $.ajax
), ma è ovviamente possibile utilizzare la libreria di propria scelta.
Questo frammento di codice presuppone inoltre che le proiezioni della mappa siano "EPSG: 3857" (web mercator) e che le coordinate nei documenti GeoJSON siano lunghezze e latitudini.
vectorSource
ed geojsonSource
essere unito?
So che questa domanda è vecchia ma ho finalmente trovato una soluzione per aggiornare un livello su openlayer 3.
Devi aggiornare i parametri della sorgente del livello in questo modo:
var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);
updateParams
metodo; OL3.18.2 mostra solo per ImageArcGISRest
, ImageMapGuide
, ImageWMS
, TileArcGISRest
e TileWMS
, e non, per esempio, ol.source.Vector
.
È possibile aggiornare un livello WFS con myLayer.getSource().clear()
.
clear()
qualsiasi funzione esistente verrà rimossa immediatamente dalla mappa e verrà aggiunta di nuovo solo dopo aver ricevuto la risposta HTTP. Questo vale sia per specificare un valore per VectorOptions#url
che per VectorOptions#loader
. Per i dati in tempo reale, eseguire manualmente alcuni WebSocket o la magia XHR e quindi chiamare getSource().clear()
seguiti getSource().addFeatures(...)
potrebbe sembrare migliore per l'utente finale.
Con OL2 ho usato una strategia di aggiornamento dei livelli che non è stata aggiunta a OL3. Di seguito è una funzione di auto-chiamata che utilizzerà una richiesta Ajax per recuperare il GeoJSON e quindi leggerlo e aggiungerlo a una fonte.
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!
Spero che sia di aiuto.
Questo funziona perfettamente per i livelli:
layer.changed();
come da http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed
layer.changed();
funziona perfettamente (ly) per i livelli. La descrizione della documentazione Increases the revision counter and dispatches a 'change' event.
non è davvero utile. In che modo l'utilizzo del metodo change () risponde alla domanda relativa al ridisegno della mappa ogni 5 secondi?
layer.changed();
non ha avuto alcun effetto per me, ma source.changed();
ha funzionato.
Non è necessario aggiornare esplicitamente. Ogni volta che aggiorni il contenuto di un livello, la mappa viene aggiornata richiedendo un nuovo rendering della cornice.
Per forzare il rendering manualmente hai map.render()
e map.renderSync()
metodi.