Ich habe eine Geojson-Ebene in meiner OL3-App, die ich alle 5 Sekunden neu zeichnen möchte (um die Bewegung auf der Karte anzuzeigen).
Wie mache ich es ? Konnte das Äquivalent von Layer.redraw () nicht finden.
Ich habe eine Geojson-Ebene in meiner OL3-App, die ich alle 5 Sekunden neu zeichnen möchte (um die Bewegung auf der Karte anzuzeigen).
Wie mache ich es ? Konnte das Äquivalent von Layer.redraw () nicht finden.
Antworten:
So können Sie eine Vektorquelle alle 5 Sekunden über einen Webdienst aktualisieren, der Funktionen in einem GeoJSON-Dokument zurückgibt:
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 wird hier zum Anfordern der Daten über Ajax ( $.ajax
) verwendet, aber Sie können natürlich die Bibliothek Ihrer Wahl verwenden.
In diesem Codeausschnitt wird außerdem davon ausgegangen, dass die Projektionen der Karte "EPSG: 3857" (Web Mercator) lauten und dass die Koordinaten in den GeoJSON-Dokumenten Längen- und Breitengrade sind.
vectorSource
und geojsonSource
soll zusammengeführt werden?
Ich weiß, dass diese Frage alt ist, aber ich habe endlich eine Lösung gefunden, um eine Ebene auf OpenLayer 3 zu aktualisieren.
Sie müssen die Parameter der Ebenenquelle folgendermaßen aktualisieren:
var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);
updateParams
Methode unterstützen. OL3.18.2 nur zeigt es ImageArcGISRest
, ImageMapGuide
, ImageWMS
, TileArcGISRest
und TileWMS
, und nicht für zB ol.source.Vector
.
Sie können eine WFS-Ebene mit aktualisieren myLayer.getSource().clear()
.
clear()
werden vorhandene Features sofort aus der Karte entfernt und erst nach Erhalt der HTTP-Antwort wieder hinzugefügt. Dies gilt sowohl für die Angabe eines Wertes für VectorOptions#url
als auch für VectorOptions#loader
. Für Echtzeitdaten sieht es für den Endbenutzer möglicherweise besser aus, getSource().clear()
wenn Sie einige WebSockets- oder XHR-Aktionen manuell ausführen und anschließend aufrufen, gefolgt von getSource().addFeatures(...)
.
In OL2 habe ich eine Layer-Aktualisierungsstrategie verwendet, die nicht zu OL3 hinzugefügt wurde. Im Folgenden finden Sie eine selbstaufrufende Funktion, die eine Ajax-Anforderung verwendet, um den GeoJSON abzurufen, ihn dann zu lesen und einer Quelle hinzuzufügen.
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!
Hoffe das hilft.
Dies funktioniert perfekt für Ebenen:
layer.changed();
gemäß http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed
layer.changed();
perfekt (ly) für Ebenen funktioniert. Die Dokumentationsbeschreibung Increases the revision counter and dispatches a 'change' event.
ist nicht wirklich hilfreich. Wie beantwortet die Verwendung der changed () -Methode die Frage zum erneuten Zeichnen der Karte alle 5 Sekunden?
layer.changed();
keine Wirkung für mich, hat aber source.changed();
den Trick gemacht.
Eine explizite Aktualisierung ist nicht erforderlich. Jedes Mal, wenn Sie den Inhalt eines Layers aktualisieren, wird die Karte aktualisiert und fordert ein neues Frame-Rendering an.
Um das Rendern manuell zu erzwingen, haben Sie map.render()
und map.renderSync()
Methoden.