Ricevere e visualizzare layer WFS

La classe che in OL3 è dedicata a gestire dati WFS è ol.format.WFS che appunto permette sia di leggere che scrivere geodati vettoriali nel formato WFS; ma questa non prevede dei metodi per effettuare una richiesta dati (GetFeature) ad  un server remoto WFS.

Dato che i diversi server WFS, possono comunque avere modalità di risposta con delle differenze e quindi era abbastanza difficile prevedere una funzione unica valida per tutti, in OL3 si è scelta la strada di lasciare all’utente di creare un loader ad hoc per ogni sorgente WFS.
Precisamente nell’oggetto ol.source.Vector si può definire come opzione loader (funzione per caricare delle features vettoriali da una sorgente remota) una jQuery AJAX che implementa la richiesta WFS GetFeature con tutti i parametri necessari.

Quando l’esecuzione del loader (jQuery) viene completata e si ricevono i dati WFS, a questo punto interviene il metodo readFeatures(..) dell’oggetto ol.format.WFS per leggere gli elementi (features) che lo compongono.

ARPA Piemonte WFS

Per fare un esempio concreto, ho scelto un servizio WFS dell’ARPA Piemonte che restituisce dati sugli effetti di un evento alluvionale dell’8 Luglio 1996 nella Provincia del Verbano-Cusio-Ossola e di Novara; questo è il suo URL:

Per vedere che cosa ci fornisce nel dettaglio questo servizio e con quali modalità, facciamo una richiesta GetCapabilites; in particolare vediamo che sono pubblicati 7 layers (2 di punti, 3 di aree e 2 di polilinee); per il nostro esempio ho scelto un layer areale  avente nome “Effetti_al_suolo_ed_elementi_morfologici_areali”.

Abbiamo quindi tutte le informazioni necessarie per ricevere questo layer WFS; ecco di seguito il codice essenziale per farlo con OL3:

Notiamo in particolare la jQuery AJAX che implementa la funzione del loader: $.ajax(…) che è l’abbreviazione di jQuery.ajax(…); ovviamente per poterla usare abbiamo caricato la relativa libreria (jquery-1.11.2.min.js). Nel loader sono definiti tutti i parametri necessari per ricevere i dati dal server WFS, in particolare: il suo URL, il tipo di richiesta (GetFeature),  il nome del layer (typename), l’EPSG del suo sistema di riferimento e i limiti geografici entro cui è compresa l’area che ci interessa (bbox) e che può pure essere una parte dell’intera estensione del layer.

Notiamo anche che come strategia di caricamento degli elementi del vettore (loadingstrategy) abbiamo scelto il tipo bbox, ovvero in base all’attuale estensione della vista della mappa e della risoluzione. Gli altri tipi previsti in OL3 sono: fixed e tile (vedi API docs: ol.loadingstrategy).

Questo è l’esempio completo e funzionante.

Se riguardiamo il codice sopra, si nota che si è scelto di caricare gli elementi del vettore che ricadono dentro una certa area (bounding box) prefissata. Un’altra possibilità, in genere più usata, consiste nel definire una bounding box variabile in base all’estensione attuale della vista mappa. Per farlo, basta definire la proprietà bbox (dentro il loader) nel seguente modo:

Naturalmente il layer WFS una volta caricato, può essere “vestito” come un normale layer vettoriale, definendone lo stile e le eventuali etichette; qui ecco un esempio:

Come mostrano le righe di codice evidenziate, si è scelto di etichettare gli elementi del layer con il valore di uno dei suoi attributi (che si chiama GID); per cui lo stile è stato definito tramite una function(feature) che rileva gli elementi del vettore  e poi con la feature.get(…) assegna il valore del dato attributo all’etichetta.

Qui c’è l’esempio completo, modificato sia con il bbox dinamico (extent) sia con la vestizione del vettore.

L’uso della classe  ol.format.WFS non è comunque l’unico modo per leggere i dati proveniente da una sorgente WFS. Infatti in generale i servizi WFS, come formato vettoriale di uscita, oltre al GML (quello di default), ne possono prevedere anche altri, per esempio: shape-zip (shapefile), application/json (JSON), text/javascript (JSONP) e CSV.

Quando è supportato il formato text/javascript (JSONP), possiamo leggere i dati WFS usando la classe ol.format.geoJSON; il loader invece lo realizziamo sempre con una jQuery AJAX, naturalmente con dei parametri adatti a gestire il formato.

Il servizio WFS usato nel precedente esempio (quello dell’ ARPA Piemonte) non supporta il formato text/javascript, allora per vedere un esempio concreto scegliamo quest’altro server (un servizio demo):

facendo una richiesta GetCapabilities su di esso,  vediamo quali sono i formati di uscita supportati:

WFS outputFormat

Questo server pubblica diversi layer; quello che vogliamo usare come esempio si chiama “medford:parks”. Questo allora è il codice OL3 che recupera i dati WFS come JSONP:

Potete confrontare questo codice con quello dell’esempio precedente (che usa ol.format.WFS) e notare che la struttura è essenzialmente la stessa, con poche differenze.
Ora nella jQuery abbiamo l’indicazione dell’ outputFormat ed il tipo di dati da recuperare (dataType); inoltre la funzione che legge gli elementi del vettore JSONformat.readFeatures(response) quando la jQuery ha terminato,  viene richiamata col metodo di callback.

Come loadingstrategy in questo caso, abbiamo usato il tipo tile, ma è solo per provare quest’altra tecnica, perchè avremmo potuto benissimo usare lo stesso tipo bbox di prima. Comunque se volete, potete fare delle prove cambiando la loadingstrategy e vedere quale tipo consente un caricamento degli elementi del vettore WFS più rapido, caso per caso (dimensione della vista, risoluzione, … etc).

WFS formato JSONP

Per vedere l’esempio completo funzionante: cliccate qui.

 

 

 

condividi: