Équivalent de layer.redraw (true) dans OpenLayers 3?


13

J'ai une couche geojson dans mon application OL3 que je veux redessiner toutes les 5 secondes (pour montrer le mouvement sur la carte).

Comment fait-on ça ? Impossible de trouver l'équivalent de Layer.redraw ().


Avez-vous regardé ol.animation? En général, le dessin vectoriel est plus fluide et géré différemment dans ol3, mais il n'est pas tout à fait clair à partir de votre question ce que vous voulez faire.
John Powell

@ JohnBarça - Mes données GeoJson proviennent de postgres qui sont mises à jour toutes les 5 secondes avec de nouvelles données GPS. Je veux redessiner le calque pour montrer à chaque fois la position actuelle des unités sur la carte (ça change sans
cesse

Donc, vous demandez des données toutes les 5 secondes à l'aide d'un appel setTimeout récursif (ou quelque chose de similaire) et vous voulez simplement savoir comment forcer les entités vectorielles à se rafraîchir?
John Powell du

@ JohnBarça - S'il y a une meilleure façon d'apprendre, mais c'est ce que je fais, je veux montrer la position du GPS en temps réel sur la carte. Le GPS envoie sa position à PostGIS et à partir de là, je lis les données en utilisant GeoJSON (ou je peux utiliser GeoServer) mais je souhaite que la couche se mette à jour de temps en temps.
Alophind

Bien sûr, je comprends ce que vous essayez de faire. Toute chance d'un exemple de code, car d'après mon expérience, si vous mettez une boucle d'animation dans settimeout, avec un appel ajax vers un serveur distant, et chargez le json qui revient en utilisant Format.GeoJSON ou similaire, les fonctionnalités seront mises à jour.
John Powell,

Réponses:


9

Voici comment actualiser une source vectorielle toutes les 5 secondes, à partir d'un service Web renvoyant des fonctionnalités dans un document 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 est utilisé ici pour demander les données via Ajax ( $.ajax), mais vous pouvez évidemment utiliser la bibliothèque de votre choix.

Cet extrait de code suppose également que les projections de la carte sont "EPSG: 3857" (web mercator) et que les coordonnées dans les documents GeoJSON sont les longitudes et les latitudes.


3
Ce code me confond, devrait vectorSourceet devrait geojsonSourceêtre fusionné?
Kelly Thomas

Je pense que vous voulez dire window.setInterval pas setTimeout; sinon, il ne le fait qu'une seule fois.
Jonathan

9

Je sais que cette question est ancienne mais j'ai finalement trouvé une solution pour rafraîchir une couche sur openlayers 3.

Vous devez mettre à jour les paramètres de la source de couche comme ceci:

var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);

3
Il ne semble pas que toutes les sources soutiennent la updateParamsméthode; OL3.18.2 montre seulement pour ImageArcGISRest, ImageMapGuide, ImageWMS, TileArcGISRestet TileWMS, et non pour, par exemple, ol.source.Vector.
Arjan

Date # getTime peut être meilleur que Date # getMilliseconds pour invalider le cache et forcer la couche à se redessiner car cela garantira un numéro unique à chaque fois.
walkermatt

5

Vous pouvez actualiser une couche WFS avec myLayer.getSource().clear().


1
Cela l'a fait pour moi avec OpenLayers 3 v. 0.14.2 et une source vectorielle WFS GeoJSON.
Dirk

3
rien de mal avec une réponse en une seule ligne s'ils sont sur l'argent. il devrait y avoir un prix de réputation pour supprimer cette boîte d'informations.
Dennis Bauszus

1
La réponse est correcte, mais cela peut montrer un certain scintillement: lors de l'appel, clear()toutes les fonctionnalités existantes seront immédiatement supprimées de la carte et ne seront ajoutées à nouveau qu'après avoir reçu la réponse HTTP. Cela est vrai à la fois pour spécifier une valeur pour VectorOptions#urlet pour VectorOptions#loader. Pour les données en temps réel, faire manuellement des WebSockets ou de la magie XHR, puis appeler getSource().clear()puis getSource().addFeatures(...)pourrait sembler mieux à l'utilisateur final.
Arjan

3

Avec OL2, j'ai utilisé une stratégie de rafraîchissement de couche qui n'a pas été ajoutée à OL3. Vous trouverez ci-dessous une fonction auto-appelante qui utilisera une requête ajax pour récupérer le GeoJSON, puis le lire et l'ajouter à une source.

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!

J'espère que cela t'aides.


2

Cela fonctionne parfaitement pour les couches:

layer.changed();

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


1
Vous devez expliquer un peu plus comment layer.changed();fonctionne parfaitement (ly) les calques. La description de la documentation Increases the revision counter and dispatches a 'change' event.n'est pas vraiment utile. Comment l'utilisation de la méthode changed () répond-elle à la question de redessiner la carte toutes les 5 secondes?
nmtoken

J'ai utilisé Ajax pour enregistrer une source geojson révisée, et le problème que j'avais était que si je fermais la couche et la rouvrais, la carte utilisait la version mise en cache (non révisée) de la source. Une fois que j'ai vidé le cache, la couche a utilisé la source révisée comme je m'y attendais. Malheureusement, la suggestion layer.changed();n'a eu aucun effet pour moi, mais a source.changed();fait l'affaire.
Peter Cooper du

1

Il n'est pas nécessaire de rafraîchir explicitement. Chaque fois que vous mettez à jour le contenu d'une couche, la carte est actualisée et demande un nouveau rendu de cadre.

Pour forcer le rendu manuellement, vous disposez des méthodes map.render()et map.renderSync().


Cela ne met pas à jour le contenu, met simplement à jour le canevas de carte lui-même.
Mapper du
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.