Equivalente di layer.redraw (true) in OpenLayers 3?


13

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 ().


Hai visto ol.animation? In generale, il disegno vettoriale è più fluido e gestito in modo diverso in ol3, ma dalla tua domanda non è del tutto chiaro cosa desideri fare.
John Powell,

@ JohnBarça - I miei dati GeoJson provengono da Postgres che viene aggiornato ogni 5 secondi con nuovi dati GPS. Voglio ridisegnare il livello per mostrare ogni volta la posizione corrente delle unità sulla mappa (continua a cambiare ...)
Alophind

Quindi, stai richiedendo dati ogni 5 secondi usando una chiamata setTimeout ricorsiva (o qualcosa di simile) e vuoi solo sapere come forzare l'aggiornamento delle funzionalità vettoriali?
John Powell,

@ JohnBarça - Se c'è un modo migliore che sono disposto a imparare, ma questo è quello che faccio, voglio mostrare la posizione del GPS in tempo reale sulla mappa. Il GPS invia la propria posizione a PostGIS e da lì leggo i dati utilizzando GeoJSON (o posso usare GeoServer) ma desidero che il livello si aggiorni di tanto in tanto.
Alophind,

Certo, ho quello che stai cercando di fare. Qualsiasi possibilità di un esempio di codice, perché nella mia esperienza, se metti un loop di animazione in settimeout, con una chiamata ajax a un server remoto e carichi il json che torna utilizzando Format.GeoJSON o simile, le funzionalità verranno aggiornate.
John Powell,

Risposte:


9

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.


3
Questo codice mi confonde, dovrebbe vectorSourceed geojsonSourceessere unito?
Kelly Thomas,

Penso che intendi window.setInterval non setTimeout; altrimenti lo fa solo una volta.
Jonathan,

9

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);

3
Sembra che non tutte le fonti supportino il updateParamsmetodo; OL3.18.2 mostra solo per ImageArcGISRest, ImageMapGuide, ImageWMS, TileArcGISReste TileWMS, e non, per esempio, ol.source.Vector.
Arjan,

Date # getTime potrebbe essere migliore di Date # getMilliseconds per invalidare la cache e forzare il layer a ridisegnare in quanto garantirà un numero univoco ogni volta.
walkermatt,

5

È possibile aggiornare un livello WFS con myLayer.getSource().clear().


1
Questo è stato per me con OpenLayers 3 v. 0.14.2 e una sorgente vettoriale Wo GeoJSON.
Dirk,

3
niente di sbagliato con una risposta di una riga se sono in denaro. ci dovrebbe essere un premio reputazione per aver rimosso questa casella di informazioni.
Dennis Bauszus,

1
La risposta è corretta, ma ciò potrebbe mostrare uno sfarfallio: al momento di chiamare 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#urlche 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.
Arjan,

3

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.


2

Questo funziona perfettamente per i livelli:

layer.changed();

come da http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed


1
Devi spiegare un po 'di più su come 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?
nmtoken,

Ho usato Ajax per salvare una fonte geojson rivista e il problema che avevo era che se chiudevo il livello e lo riaprivo, la mappa utilizzava la versione memorizzata nella cache (non rivista) della fonte. Dopo aver svuotato la cache, il livello ha utilizzato l'origine rivista come mi sarei aspettato. Sfortunatamente, il suggerimento layer.changed();non ha avuto alcun effetto per me, ma source.changed();ha funzionato.
Peter Cooper,

1

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.


Questo non aggiorna il contenuto, aggiorna solo la tela della mappa stessa.
Mapper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.