OpenLayers 3: Come aggiornare la mappa dopo aver modificato lo stile di una caratteristica?


9

Ho una mappa OpenLayers 3.2.0 che presenta alcune fonti vettoriali ( ol.source.Vector) e livelli vettoriali associati ( ol.layer.Vector)

Quando ol.Featurevengono aggiunte funzionalità ( ) alle origini vettoriali, viene assegnata una dataproprietà impostata sull'oggetto javascript rappresentato dalla funzione. TypeScript segue ...

vectorSource.addFeature(new ol.Feature({
    geometry: /* ... */,
    data: vectorData,
}));

I livelli vettoriali hanno quindi una funzione di stile che legge la dataproprietà e ne recupera lo stile:

vectorLayer = new ol.layer.Vector({
    source: vectorSource,
    renderBuffer: /* ... */,
    style: function (feature: ol.Feature, resolution: any) {
        var data = </* TypeScript Type */>feature.get('data');
        if ((data) && (data.style)) {
            return [data.style];
        }
        else {
            /* return default style */
        }
    }
});

A volte, eventi non correlati alla mappa fanno cambiare gli stili. Ad esempio, quando un oggetto diventa non valido, il suo stile cambia. Chiaramente, poiché data.styleè interamente sotto il mio controllo, cambiarlo è banale.

Il problema è che la mappa non sa che lo stile è cambiato. Se cambio lo stile di un oggetto e poi ingrandisco la mappa, costringendolo a ridisegnare, noto che le mie funzioni di stile vengono eseguite e restituiscono il nuovo stile e la funzionalità viene ridisegnata. Come imposto a livello di codice l'aggiornamento della mappa?

Dopo alcune ricerche e sperimentazioni, ho provato:

  1. Richiamo render()sulla ol.Mapstessa.
  2. Chiamando dispatchChangeEvent()ilol.source.Vector
  3. Chiamando redraw()ilol.layer.Vector

Questi sono stati suggeriti, ma nessuno di loro ha funzionato, il che non sorprende poiché solo il primo metodo è elencato nella documentazione API OpenLayers 3.2.0 e non è contrassegnato come stabile.


hai provato vectorlayer.refresh ({force: true}); ?
ylka

Ho, ma non sorprende, che non funziona perché è un metodo OpenLayers 2.
Xharlie,

Risposte:


12

Per caso, mi sono imbattuto nella risposta: è fare appello changed()alle funzionalità stesse dopo aver modificato la styleproprietà dei dati associati. Vedi: http://openlayers.org/en/v3.2.0/apidoc/ol.Feature.html?unstable=true#changed

Questo mi richiede di tenere traccia degli ol.Featureoggetti associati a ciascun vectorDataoggetto (in precedenza, avevo sempre e solo bisogno di trovare il vectorDatada una funzione, che potrebbe essere fatto con get()), ma questo non è un gran costo.

(Ho trovato questo guardando setGeometrye setStylee altri metodi ol.Featureper vedere cosa fanno.)


Sebbene questo approccio changedfunzioni , la richiesta di un numero ragionevole di funzioni comporta in realtà una penalità piuttosto grave per le prestazioni (Chrome si è schiantato più volte in questo modo). Ti consiglio di chiamare changed()la fonte del tuo livello dopo che tutte le tue funzionalità sono state modificate.
Kyle,

0

Ho trascorso una settimana a cercare di capire come far scomparire una funzione (Poligono) dalla mappa dopo averla eliminata ( vectorSource.removeFeature(selectedFeature). E nessuna soluzione ha funzionato. Stranamente l'attuale OL3 v3.15.1 non ha una funzione di aggiornamento / rendering forzato di base che funziona! La soluzione che ha funzionato per me è stata quella di cambiare lo selectedFeaturestile:

        var newStyle = new ol.style.Style({
            image: new ol.style.Circle({
                radius: 5,
                fill: new ol.style.Fill({color: 'red'}),
                stroke: new ol.style.Stroke({color: 'yellow', width: 1})
            })
        });
        selectedFeature.setStyle(newStyle)

Qualsiasi stile funzionerebbe poiché la funzione è già stata rimossa dal livello ma non aggiornata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.