Geoserver pubblicare shapefile

Come pubblicare uno shapefile con GeoServer

Una delle prerogative più interessanti di GeoServer è quella di permettere di pubblicare dati geospaziali sia vettoriali che raster, tramite i  più diffusi standard OCG (WMS, WFS, WCS e WPS) con estrema facilità. Una volta installato, tramite la sua interfaccia web di amministrazione, è molto semplice: caricare mappe e layer, raggrupparli, collegarsi a data-source nei formati più diffusi (shapefile, postGIS,  geoJSON, geoTiff, … etc) impostare gli stili di presentazione e quindi “distribuirli” sul web.

Per inciso, e per chi ancora non lo sapesse, stiamo parlando di un sistema “server” per la gestione, distribuzione e analisi di dati geospaziali: questo è GeoServer. Quindi niente a che vedere con quelle soluzioni di web mapping realizzate con strumenti come OpenLayers o LeafletJS; queste infatti sono dei “client”, cioè  delle applicazioni che permettono la visualizzazione e fruizione di dati geospaziali resi disponibili da altri, appunto forniti da un map server o comunque da un geo data-source.

architettura mapserver clients

L’interfaccia di amministrazione di GeoServer: il menù Data

In questo articolo esaminiamo un esempio relativamente semplice che spiega come pubblicare uno shapefile, uno dei formati vettoriali a tutt’oggi ancora tra i più diffusi per la sua semplicità e portabilità anche se, per diverse ragioni, ormai un pò vecchiotto! La stessa documentazione ufficiale di GeoServer ne sconsiglia l’uso in produzione, specie per gestire dati complessi e di notevoli dimensioni (vd. GeoServer shapefile).
Ma a noi qui interessa solo vedere come Geoserver consente di pubblicare in modo molto semplice e senza scrivere una riga di codice; si tratta solo di capire i principi base del suo funzionamento e come è organizzato. Infatti, alcuni concetti che incontreremo hanno un carattere generale e non riguardano solo la pubblicazione degli shapefile.

Diamo per scontato che abbiate già GeoServer installato e funzionante insieme al vostro web server (Apache o altro); in ogni caso installare GeoServer è molto semplice. Per Windows e MacOS c’è un comodo installer, per sistemi Linux viene distribuito in un pacchetto .war (web archive) che dopo essere aperto permette di eseguire un applicazione web che esegue l’installazione (Geoserver guida all’installazione). Oppure, come ho avuto modo di consigliare anche in altri articoli, potete usare la “distro” OSGeo-Live  che è un sistema Lubuntu in cui sono gia pre-installati e configurati diversi geo-software opensource  tra cui, appunto,  anche GeoServer insieme ad alcuni esempi pratici.

Partiamo subito avviando GeoServer  ed entrando nella sua interfaccia web con le credenziali di amministratore; vi appare la schermata principale con la pagina di benvenuto che contiene degli avvisi ed alcune informazioni di sintesi (quanti layers, stores e workspaces sono già presenti); il menù con tutte le funzioni disponibili appare nella colonna di sinistra.

Geoserver web admin interfaceNella figura ho evidenziato in rosso il gruppo del menù Data perchè,  per quello che ci interessa fare qui, useremo solo quelle funzioni  e per cominciare parliamo innanzitutto di Workspaces e Stores .

Definizione di workspace e store

Un workspace è un contenitore che raccoglie insieme tutti gli elementi (dati, layers, files) e le informazioni che riguardano uno stesso progetto; se vogliamo possiamo considerarlo una specie di directory. I diversi layers che vengono caricati in GeoServer sono quasi sempre organizzati in workspaces.

Uno store è una connessione ad un data-source di geodati (vettoriali o raster) che può essere: un singolo file, un gruppo di file , un tabella di database, un file raster o una directory. Ogni workspace può contenere uno o più stores.

Per il nostro esempio definiamo un workspace che contiene un solo store che sarà connesso allo shapefile da pubblicare;  io ho usato come esempio un file di nome voklabruck_landuse.shp (estratto a suo tempo da OSM) e che rappresenta l’uso del terreno nei dintorni di una cittadina di Voklabruck in Austria (se volete scaricarlo cliccate qui: voklabruck.zip).
Allora innanzitutto creiamo il nostro workspace cliccando sulla voce del menù omonima; vi compare la pagina per la gestione dei workspaces con l’elenco di quelli già presenti sul vostro Geoserver ed in alto due voci : una per aggiungerne uno nuovo (che usiamo ora), una per cancellarne uno già esistente.

Geoserver gestione workspaces

Per definire un nuovo workspace dobbiamo indicare due parametri : il suo nome  ed un URI (Uniform Resource Identifier);  entrambi possono essere scelti a piacere, ma l’URI deve essere unico nel nostro sistema GeoServer.
Attenzione a non confondersi! L’ URI non ha nulla a che vedere con l’ URL (indirizzo web) con cui i layers del workspace saranno resi pubblici sul web; ripeto, esso serve solamente affinchè GeoServer, nel suo namespace,  possa identificare ogni entità che gestisce in modo univoco.
Per questo motivo, anche se la scelta dell’ URI è arbitraria, la documentazione di GeoServer consiglia come buona prassi di usare un formato URL-like in cui il nome del workspace venga posposto all’ URL di GeoServer sul nostro host. Nel nostro esempio e seguendo questo consiglio, essendo il nostro GeoServer pubblicato su localhost e porta 8082, abbiamo definito il workspace come si vede nella figura seguente :

new_workspace2Fatto questo, passiamo a definire lo store che faremo puntare al nostro shapefile. Cliccando sulla voce del menù Stores compare la pagina per la loro gestione e anche qui, in alto troviamo due voci: una per aggiungere uno nuovo ed una per cancellarne uno esistente.

Geoserver gestione storesIn questa pagina sono elencati gli stores già configurati ed i rispettivi workspace di appartenenza; come abbiamo già detto un workspace può contenere anche più stores.
L’elenco presenta:

  • una colonna “Data Type” che indica con un icona il tipo di geodati a cui lo store è connesso: se raster o vettore, distinguendo se su file o in DB e nel caso di vettore se deriva da un server WFS;
  • una colonna “Type” che indica il tipo di data-source a cui lo store è connesso: shapefile, cartella di shapefiles, PostGIS, GeoTIFF, … etc
  • una colonna che indica se lo store è abilitato (è funzionante) oppure no.

Per configurare un nuovo store facciamo click su  Add new store; la prima schermata che ci appare è quella per scegliere che tipo di data-source vogliamo connettere (nella figura seguente compaiono le diverse tipologie possibili). Nel caso nostro, scegliamo Directory of spatial files.

nuovo data source

Poichè  ci colleghiamo ad un solo shapefile, avremmo pure potuto scegliere l’opzione Shapefile, ma preferiamo la Directory of … perchè così eventualmente, in futuro, potremo usare anche altri shapefile collocati nella stessa cartella.
Cliccando sulla voce scelta, si apre un’altra finestra per la definizione vera e propria del nostro store: New Vector Data Source.

nuovo data source vettorialeQui nell’ordine :
– scegliamo il workspace a cui appartiene lo store (il nostro è: voklabruck);
– scriviamo il nome che vogliamo da dare allo store (io ho scelto lo stesso nome del workspace);
– indichiamo dove si trova la cartella che contiene il nostro shapefile (nel mio caso è la cartella: /home/GIS_data/vokla); col tasto “browse” è possibile appunto scorrere il file system del sistema che ospita GeoServer.

Il flag “enabled” è già settato di default e così lo lasciamo, altrimenti lo store non sarà attivo.
Lasciamo inalterate (come di default) anche tutte le altre opzioni. Alla fine premiamo il bottone “Save” e salviamo.

Fatto questo ci compare la seguente nuova finestra che  mostra tutti i layers (shapefiles) trovati dentro la directory che abbiamo indicato come data-source: nel nostro caso ce n’è uno solo (voklabruck_landuse).

nuovo layer

Pubblicazione di un layer: edit layer

Dopo aver configurato il data-source, dobbiamo dire a GeoServer che vogliamo pubblicare il relativo layer, quindi clicchiamo sulla voce Publish; in questo modo comparirà una nuova finestra (Edit Layer) che contiene tutti i parametri e le opzioni che servono per la pubblicazione, o meglio per la “distribuzione” del layer.
Ricordiamo che GeoServer non pubblica i geodati nel senso di renderli disponibili su pagine web; per fare questo c’è bisogno di un’ applicazione che faccia da tramite (per esempio un client realizzato con OpenLayers). Piuttosto li “distribuisce” sulla rete, principalmente  tramite i servizi OGC (e non solo).

La finestra Edit Layer è abbastanza complessa, ricca di impostazioni e suddivisa in quattro schede: Data, Publishing, Dimensions e Tile caching, ma … state tranquilli! Non serve sempre impostare tutti i parametri e le opzioni che essa contiene; dipende dal tipo di layer e da cosa si vuole fare. Nel nostro caso semplice, sarà sufficiente definire solo alcune cose sulla scheda “Data”.

Cominciando dalla parte alta della finestra (vd. figura seguente) l’unica cosa essenziale è settare l’opzione Enabled perchè altrimenti il layer, anche se configurato, non sarà visibile all’esterno, cioè Geoserver non lo pubblica. Abbiamo poi una opzione Advertised che serve per decidere se il layer sarà visibile in “preview” oppure no (vedremo tra un pò cosa significa); ma se non ci interessa possiamo pure disabilitarla.

Il campo  Title  altro non è che un nome “umanamente comprensibile” per il layer; di default viene impostato uguale al nome del layer (nel nostro caso il nome dello shapefile: voklabruck_landuse), ma noi possiamo cambiarlo.
Il campo “Abstract” è invece una descrizione estesa  che spiega più in dettaglio il contenuto del layer; ma per il nostro esempio lo lasciamo vuoto.
Quando un layer viene distribuito tramite un servizio OGC, nome, titolo e abstract vengono rilevati dal client che lo riceve con le opportune request (per esempio con la WMS GetCapabilities), che così può meglio identificarlo.

Il resto (Keywords e Metadata links) per adesso non ci interessa.

geoserver edit layer Nella seconda parte della finestra Edit Layer ci basta solo definire:
1. il sistema di riferimento (SRS: Spatial Reference System) del layer;
2. le sue dimensioni  in termini coordinate piane o metriche (X,Y) e di coordinate geografiche (Lat, Long).

Quando un layer ingloba anche l’informazione del suo SR (Sistema di Riferimento) e questa contiene il relativo codice EPSG, allora GeoServer lo riconosce e lo indica automaticamente nel campo Native SRS; altrimenti qui ci troviamo scritto UNKNOWN e dobbiamo essere noi a indicare il SR del layer nel campo Declared SRS. O comunque dobbiamo indicare il Declared SRS, quando per qualche motivo, vogliamo che GeoServer pubblichi il layer riproiettandolo su un SR diverso da quello che è stato rilevato.
Nel caso del nostro shapefile, esso ha anche il file .prj che contiene appunto informazioni sul suo SR (in questo caso è il WGS 84), ma in un formato (WKT) che non indica l’ EPSG; quindi GeoServer non lo riconosce. Allora usando il tasto “Find” si apre una tabella contenente il database degli SR caricati in GeoServer e qui cerchiamo l’ EPSG del WGS 84 (il 4326) per indicarlo come “Declared SRS”.

Il successivo campo SRS handling serve per stabilire come  deve comportarsi Geoserver  in merito agli SRS indicati e sono possibili tre diverse opzioni:
– Force declared: usa l’SRS dichiarato;
– Reproject native to declared: riproietta usando l’SRS dichiarato;
– Keep native; usa l’SRS nativo;
noi ovviamente, usiamo la prima opzione.

geoserver edit layerPer indicare le dimensioni (X,Y) del layer, a meno di esigenze diverse (per es. voler rappresentare solo una sua parte) basta cliccare su Compute from data e queste verranno riempite automaticamente. Lo stesso dicasi per i suoi limiti in termini di coordinate (Lat, Long); cliccando su Compute from native bounds queste verranno determinate automaticamente, sulla base dei limiti (X,Y) e ovviamente del SR del layer.

In fondo alla finestra Edit Layer troviamo una tabellina Feature Type Details che GeoServer genera automaticamente in base al tipo e alla struttura dello shapefile che stiamo caricando; qui  elenca:

  • il tipo di vettore (MultiPoligon);
  • i campi della sua tabella-attributi : osm_id, name, type;

essa è solo informativa e non va editata.
Bene, la configurazione fatta è sufficiente per pubblicare il layer; quindi clicchiamo su “Save”.

La layer preview di GeoServer

GeoServer è dotato di una funzionalità di preview che ci permette di vedere come un layer verrà distribuito sulla rete; cliccando sulla voce di menù  Layer preview, compare un elenco dei layer disponibili (quelli per i quali in fase di configurazione  abbiamo abilitato l’opzione Advertised). Devo ammettere che questo termine è un pò infelice, perchè non rende bene l’idea di cosa implica; forse sarebbe stato meglio usarne un’altro più appropriato (ma è solo una mia opinione !).

layer preview

Per effettuare questa preview del layer, il sistema propone diversi formati; in evidenza ci sono quelli più comuni (Common Formats) che sono disponibili subito cliccandoci sopra, altrimenti si può scegliere dal menù a discesa (All Formats) che li elenca tutti raggruppati per tipologia di servizio e di output:

  • per WMS – tra cui ricordiamo: GeoTIFF, OpenLayers, KML,  PDF;
  • per WFS – tra cui ricordiamo: CSV, KML, shapefile, geoJSON.

Quasi tutti sono formati che producono un file testo o XML (che rappresenta il layer) che si può scaricare o, in alcuni casi, visualizzare sul browser. Quello che certamente produce un output grafico del layer direttamente sul nostro browser è OpenLayers; così denominato perchè è un client realizzato con la famosa libreria javavacript omonima già incluso  in GeoServer.
Questo client  effettua una richiesta “WMS GetMap” e produce sul browser una rappresentazione del layer, più alcuni filtri avanzati che non sono disponibili quando si utilizza una versione stand-alone di OpenLayers. Inoltre, l’anteprima generato contiene un’intestazione con semplici opzioni di configurazione per la visualizzazione: versione WMS, tiling, dimensioni della finestra, … etc.

Nel caso del nostro esempio (voklabruck), l’ URL con request WMS che produce la sua preview con OpenLayers sul browser, è questa:

e questa è la web map che ci appare:

openlayers previewUna precisazione è d’obbligo, perchè per esperienza so che molti si confondono !
Questa ottenuta con OpenLayers è solo una “preview” e non l’output vero e proprio di GeoServer . Ricordo infatti ancora una volta che GeoServer distribuisce i geodati usando i protocolli OGC. Che poi chi li riceve, si crea un client con OpenLayers o altro per visualizzarli  su una pagina web, è un altro discorso.

Quindi il nostro layer voklabruck_landuse, insieme a tutti gli altri che compaiono nell’elenco dei layer come “enabled” sono automaticamente già disponibili in rete come: WMS, WFS o WCS (per i geodati tipo raster). Poi chiaramente, quando si configurano, eventualmente è possibile decidere quali servizi abilitare e quali no.

geoserver layer

Collegamento tramite WMS e WFS con QGIS

Facciamo un esempio di ricezione del nostro layer voklabruck_landuse tramite WMS e WFS, usando i client presenti in QGIS.  Naturalmente, essendo un layer vettoriale (di poligoni) il protocollo adatto per riceverlo come tale sarebbe il WFS; tuttavia GeoServer lo rende disponibile (tranne che lo impediamo volutamente) anche come WMS, perchè comunque può essere utile averlo come raster per realizzare delle mappe da reportistica. Chiaramente in questo secondo caso non è più possibile identificare le singole features ed i relativi attributi.

Poichè useremo un QGIS desktop  installato nello stesso computer su cui stiamo eseguendo GeoServer, gli indirizzi (URL) per identificare i servizi si riferiscono a “localhost”; è chiaro che più in generale saranno indirizzi che contengono l’indirizzo IP o l’ hostname (es.: www.miogeoserver.com) del server remoto che ospita GeoServer. Gli indirizzi da usare nel nostro caso sono allora i seguenti:

– per WMS : http://localhost:8082/geoserver/voklabruck/wms?
– per WFS :  http://localhost:8082/geoserver/voklabruck/wfs?

Da notare che nel path abbiamo inserito anche “voklabruck”  cioè il nome del worskspace che contiene il nostro layer; ma avremmo pure potuto non specificare nulla (per capirci scrivere solo : …/geoserver/wms?  o …/geoserver/wfs?) e in questo caso ci collegheremmo a tutti i layer pubblicati su GeoServer compreso il nostro.

Nelle figure seguenti vediamo come creare una nuova connessione WMS al nostro layer “voklabruck” e poi come effettuare tale connessione per caricare il layer, in QGIS :

A titolo di mera curiosità notiamo che, nonostante abbiamo specificato un URL con indicazione del workspace “voklabruck”,  quando si effettua la connessione a GeoServer, nell’elenco dei layer disponibili, oltre al nostro layer ne compaiono altri. Il motivo è che sul nostro GeoServer ci sono configurati dei “gruppi di layer” al di fuori di uno specifico workspace e quindi vengono esposti in WMS indipendentemente dal workspace specificato.
In ogni caso noi selezioniamo di aggiungere solo il layer che ci interessa (in fig. è il numero 4 del sub-elenco) e nel pannello-mappe di QGIS lo vediamo comparire come già visto nella preview :

QGIS layer WMSVi faccio notare che, avendo usato il servizio WMS, quella caricata è solamente una mappa raster, quindi anche se si vedono disegnate le diverse aree (features), queste non sono distinguibili graficamente e non abbiamo disponibile la tabella dei relativi attributi !

Effettuiamo ora invece, sempre da QGIS, una connessione al nostro layer usando il servizio WFS, cioè quello specifico per i layer vettoriali:

Il risultato di questa connessione WFS è ora il seguente :

QGIS WFS layerStavolta è effettivamente un vettore di poligoni e non una semplice immagine; infatti andando a modificare il suo stile (proprietà del vettore) abbiamo scelto di colorare diversamente le diverse aree (ora distinguibili) in base alla diversa “destinazione d’uso” del terreno, come si evince dalla legenda nel pannello-layer.

Definire lo stile di un layer WMS con SLD

Se con GeoServer vogliamo distribuire dei geodati tramite WMS, in modo che questi siano  “vestiti” (rappresentati graficamente) in modo opportuno per evidenziarne meglio il contenuto, per esempio: mettere delle etichette, usare simboli e/o colori  per le diverse features, … etc, lo si può fare usando un linguaggio di markup chiamato SLD (Styled Layer Descriptor): una specifica OGC per la vestizione di layer vettoriali e raster .
Quando si configura un layer  in GeoServer, è possibile stabilire quale file SLD (è un documento XML) usare per il suo stile.

Rispetto alle semplici operazioni viste fin’ora, forse l’ SLD è un aspetto di GeoServer un pò più complesso, in quanto il file SLD va editato a mano e la sua sintassi non è proprio semplice; ma una volta capito il meccanismo, prendendoci la mano, si possono realizzare stili molto sofisticati.
Volendo, esistono anche degli editor SLD  come quello che possiede il GIS uDig, oppure, per esempio, si può definire lo stile con QGIS e poi salvarlo in formato SLD (anche se la compatibilità con Geoserver non è sempre totale).
Tra la  documentazione online di GeoServer c’è pure questa guida d’uso  sulla definizione degli stili con SLD.

Vediamo allora come definire e gestire gli stili in GeoServer. Nel menù Data con l’ultima voce Styles si apre la pagina per la gestione degli stili; essa contiene l’elenco degli stili SLD che sono stati definiti  con la possibilità di definirne di nuovi (Add a new style) o rimuoverne di già esistenti (Removed selected styles). Notate anche che, uno stile può  essere assegnato a un workspace oppure no; nel primo caso esso sarà salvato nella directory del workspace, ma sarà comunque disponibile per qualunque layer.

Geoserver layers

Quando si crea un nuovo stile o si vuole modificare uno esistente (cliccando sul suo nome), si apre la seguente finestra Style Editor; ovviamente se si sta creando uno nuovo stile sarà tutta vuota:

Style editor

In essa, oltre il “nome” con cui vogliamo chiamare lo stile, come appena detto abbiamo la possibilità di assegnarlo o meno a un dato workspace; il format è invece sempre SLD (la casella di selezione è in realtà bloccata su questa opzione). La parte principale è il text-editor per scrivere il file dello stile SLD; per agevolare questa operazione ci sono sue possibilità:

  • copiare il codice di uno style già definito in GeoServer (Copy from existing style) ;
  • caricare un file SLD dall’esterno (Browse… e poi Upload)

una volta copiato/caricato uno stile di partenza, possiamo modificarlo nel text-editor per crearne un nuovo. Si capisce l’utilità di questa funzione, che ci evita di definire dei nuovi stili partendo ogni volta da zero !
Un altro aiuto per definire gli stili, ci è dato dalla pagina SLD cookbook presente nella documentazione online di GeoServer; in essa troviamo un raccolta di stili già pronti per l’uso (distinti per tipologia di layer: punti, linee, poligoni o raster) da cui partire per poi crearsi il proprio.

Dopo aver editato il nostro stile, è molto utile controllare che esso rispetti la sintassi SLD e per fare questo c’è il bottone Validate; premendolo comparirà in cima alla pagina il risultato del controllo con gli eventuali errori riscontrati.

style validator

Un’altra funzione utile è Preview legend che serve per visualizzare in preview il tipo di rappresentazione grafica e le eventuali classi/categorie definite nello stile; premendo il bottone questa preview appare immediatamente sotto .

preview legend

Infine, per salvare lo stile editato si preme Submit, altrimenti per uscire senza salvare Cancel.

Per vedere un esempio di come assegnare lo stile a un layer, riprendiamo il nostro voklabruck_landuse e vediamo come dargli una vestizione un pò meno piatta e banale di quella tutta grigia di default vista prima.
Innazitutto definiamo un nuovo stile partendo da uno di quelli presenti nella pagina “SLD cookbook”, scegliamo lo stile polygon with styled label (vd. pagina col codice); quindi lo carichiamo nello Style editor e poi modifichiamo cosa vogliamo. Io ho cambiato: il campo da usare come etichetta (o scelto il tipo che identifica la destinazione d’uso delle aree), il colore di riempimento delle aree e il colore dei bordi. Poi, dopo aver eseguito il “validate”, l’ho salvato col nome poly_miostile.

Ora riapriamo la pagina di editing del nostro layer e andiamo sulla scheda Publishing che prima avevamo ignorato. Qui c’è una parte, sotto il gruppo “WMS settings”, che permette di scegliere quale stile usare come default del layer e poi, se si vuole, anche quali altri stili alternativi (Selected Styles) si possono scegliere. Quando il layer verrà distribuito come WMS, il client ricevente troverà come opzioni di rappresentazione questi stili alternativi.

layer style

La figura sopra, mostra il nostro esempio in cui abbiamo scelto lo stile di default poly_miostile prima definito e poi, a titolo di esempio, alcuni stili alternativi scelti tra quelli già presenti in GeoServer (Available Styles).
Ora andando a rivedere la preview (OpenLayers) del nostro layer, questo è il risultato che vien fuori :

preview stile

Come si vede, nella barra di controllo in alto, compare anche l’elenco degli stili alternativi che abbiamo previsto; andandoli a selezionare uno per uno possiamo provare a vedere come varia l’aspetto grafico del layer.

La stessa cosa succede anche se ci connettiamo tramite un client WMS, come quello di QGIS; nella finestra di connessione compare l’elenco dei layer e per il nostro voklabruck_landuse, come sub-menù, l’elenco degli stili disponibili (il primo è quello che ho scelto come default).

QGIS conn WMS e stile

Notiamo anche  che la request WMS restituisce per ogni stile un title (per “poly_miostile” è rimasto il title originario del SLD cook book, perchè non l’abbiamo modificato) e un abstract; infatti, anche se prima non ne abbiamo parlato, questi sono due parametri che possono essere impostati quando si definisce il file SLD.

Caricando il nostro layer in QGIS (con il suo stile di default) e poi aggiungendo come base-map di sfondo una disponibile via web da Mapquest-OSM, otteniamo un risultato complessivo (mashup) molto più gradevole di quello precedente e con delle informazioni aggiuntive (le etichette) che ci indicano la destinazione d’uso delle diverse aree.

QGIS layer WMS e Mapquest

Naturalmente, inutile ribadire che,  anche se graficamente più espressivo di prima, è sempre un layer WMS quindi  una mappa-immagine senza informazioni sui geodati originali (il vettore). Se ci serve di ricevere anche questi, dobbiamo usare il servizio WFS e a quel punto la vestizione del layer ce la possiamo gestire a nostro piacimento direttamente sul client.

condividi: