Tengo una capa geojson en mi aplicación OL3 que quiero volver a dibujar cada 5 segundos (para mostrar el movimiento en el mapa).
Cómo lo hago ? No se pudo encontrar el equivalente de Layer.redraw ().
Tengo una capa geojson en mi aplicación OL3 que quiero volver a dibujar cada 5 segundos (para mostrar el movimiento en el mapa).
Cómo lo hago ? No se pudo encontrar el equivalente de Layer.redraw ().
Respuestas:
Así es como puede actualizar una fuente de vectores cada 5 segundos, desde un servicio web que devuelve características en 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 se usa aquí para solicitar los datos a través de Ajax ( $.ajax
), pero obviamente puede usar la biblioteca de su elección.
Este fragmento de código también supone que las proyecciones del mapa son "EPSG: 3857" (web mercator) y que las coordenadas en los documentos GeoJSON son longitudes y latitudes.
vectorSource
y geojsonSource
debe fusionarse?
Sé que esta pregunta es antigua, pero finalmente encontré una solución para actualizar una capa en Openlayers 3.
Debe actualizar los parámetros de la fuente de la capa de esta manera:
var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);
updateParams
método; OL3.18.2 sólo muestra que para ImageArcGISRest
, ImageMapGuide
, ImageWMS
, TileArcGISRest
y TileWMS
, y no para, por ejemplo, ol.source.Vector
.
Puede actualizar una capa WFS con myLayer.getSource().clear()
.
clear()
las características existentes se eliminarán del mapa de inmediato y solo se agregarán nuevamente después de recibir la respuesta HTTP. Esto es cierto tanto para especificar un valor para VectorOptions#url
como para VectorOptions#loader
. Para los datos en tiempo real, hacer manualmente algo de WebSockets o magia XHR y luego llamar getSource().clear()
seguido getSource().addFeatures(...)
podría ser mejor para el usuario final.
Con OL2 utilicé una estrategia de actualización de capa que no se ha agregado a OL3. A continuación se muestra una función de llamada automática que utilizará una solicitud ajax para obtener el GeoJSON y luego leerlo y agregarlo a una fuente.
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!
Espero que esto ayude.
Esto funciona perfecto para capas:
layer.changed();
según http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed
layer.changed();
funciona perfecto (ly) para las capas. La descripción de la documentación Increases the revision counter and dispatches a 'change' event.
no es realmente útil. ¿Cómo responde el uso del método change () a la pregunta sobre cómo volver a dibujar el mapa cada 5 segundos?
layer.changed();
no tuvo ningún efecto para mí, pero source.changed();
funcionó.
No hay necesidad de actualizar explícitamente. Cada vez que actualiza el contenido de una capa, el mapa se actualiza solicitando una nueva representación del marco.
Para forzar manualmente la representación que tiene map.render()
y map.renderSync()
métodos.