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 ().
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 ().
Réponses:
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.
vectorSource
et devrait geojsonSource
être fusionné?
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);
updateParams
méthode; OL3.18.2 montre seulement pour ImageArcGISRest
, ImageMapGuide
, ImageWMS
, TileArcGISRest
et TileWMS
, et non pour, par exemple, ol.source.Vector
.
Vous pouvez actualiser une couche WFS avec myLayer.getSource().clear()
.
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#url
et 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.
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.
Cela fonctionne parfaitement pour les couches:
layer.changed();
selon http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed
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?
layer.changed();
n'a eu aucun effet pour moi, mais a source.changed();
fait l'affaire.
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()
.