Eu tenho uma camada geojson no meu aplicativo OL3 que desejo redesenhar a cada 5 segundos (para mostrar o movimento no mapa).
Como eu faço isso ? Não foi possível encontrar o equivalente a Layer.redraw ().
Eu tenho uma camada geojson no meu aplicativo OL3 que desejo redesenhar a cada 5 segundos (para mostrar o movimento no mapa).
Como eu faço isso ? Não foi possível encontrar o equivalente a Layer.redraw ().
Respostas:
É assim que você pode atualizar uma fonte de vetor a cada 5 segundos, a partir de um serviço da Web que retorna recursos em um 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);
O jQuery é usado aqui para solicitar os dados através do Ajax ( $.ajax
), mas você pode obviamente usar a biblioteca de sua escolha.
Esse trecho de código também pressupõe que as projeções do mapa sejam "EPSG: 3857" (web mercator) e que as coordenadas nos documentos do GeoJSON sejam longitudes e latitudes.
vectorSource
e deve geojsonSource
ser mesclado?
Eu sei que essa pergunta é antiga, mas finalmente encontrei uma solução para atualizar uma camada nos openlayers 3.
Você precisa atualizar os parâmetros da origem da camada assim:
var source = yourLayer.getSource();
var params = source.getParams();
params.t = new Date().getMilliseconds();
source.updateParams(params);
updateParams
método; OL3.18.2 apenas mostra que para ImageArcGISRest
, ImageMapGuide
, ImageWMS
, TileArcGISRest
e TileWMS
, e não para, por exemplo, ol.source.Vector
.
Você pode atualizar uma camada WFS com myLayer.getSource().clear()
.
clear()
qualquer recurso existente será removido do mapa imediatamente e somente será adicionado novamente após o recebimento da resposta HTTP. Isso vale tanto para a especificação de um valor para VectorOptions#url
e para VectorOptions#loader
. Para dados em tempo real, executar manualmente algumas magias do WebSockets ou XHR e depois fazer chamadas getSource().clear()
seguidas por getSource().addFeatures(...)
pode parecer melhor para o usuário final.
Com o OL2, usei uma estratégia de atualização de camada que não foi adicionada ao OL3. Abaixo está uma função de auto-chamada que usará uma solicitação ajax para buscar o GeoJSON e, em seguida, lê-lo e adicioná-lo a uma 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!
Espero que isto ajude.
Isso funciona perfeito para camadas:
layer.changed();
conforme http://openlayers.org/en/latest/apidoc/ol.layer.Vector.html#changed
layer.changed();
funciona perfeitamente (camadas) para camadas. A descrição da documentação Increases the revision counter and dispatches a 'change' event.
não é realmente útil. Como o uso do método alterado () responde à pergunta sobre o redesenho do mapa a cada 5 segundos?
layer.changed();
não teve efeito para mim, mas source.changed();
fez o truque.
Não há necessidade de atualizar explicitamente. Cada vez que você atualiza o conteúdo de uma camada, o mapa é atualizado solicitando uma nova renderização de quadro.
Para forçar a renderização manualmente, você tem map.render()
e map.renderSync()
métodos.