relazione - Server users.dimi.uniud.it

Transcript

relazione - Server users.dimi.uniud.it
Università Degli Studi Di Udine A.A. 2006/2007
Facoltà di Scienze Fisiche Matematiche e Naturali
Introduzione a
Una soluzione per GIS open - source
Paolo Gallo
mat. 40398
Corso di Basi di
Dati
Spaziali
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Sommario
Che cos’e GeoServer ? ....................................................................................................................................... 4
Qualche accenno su GeoTools....................................................................................................................... 4
Funzionalità di GeoServer.............................................................................................................................. 5
Requisiti di sistema ............................................................................................................................................ 6
Installazione
6
Configurazione 6
Namespace .................................................................................................................................................... 6
DataStore ....................................................................................................................................................... 7
Opzioni aggiuntive ......................................................................................................................................... 7
Gestire dati Raster ( Coverage ) ................................................................................................................. 8
Formati di Output di GeoServer ............................................................................................................... 8
Lato client
9
“Closed Source” Desktop Client .................................................................................................................... 9
Open Source Clients : OpenLayers ............................................................................................................... 9
Esempio ..................................................................................................................................................... 9
GeoServer & Google Earth .......................................................................................................................... 10
Funzionalità avanzate ...................................................................................................................................... 10
OGC Filters ................................................................................................................................................... 10
DataSet .................................................................................................................................................... 11
Richiesta .................................................................................................................................................. 11
Risposta ................................................................................................................................................... 11
Interrogazioni mediante Common Query Language CQL ............................................................................ 11
Elenco delle funzioni supportate ................................................................................................................. 16
GeoServer & Oracle ......................................................................................................................................... 19
Installazione del supporto Oracle ................................................................................................................ 19
Oracle & GeoServer in esecuzione sulla stessa macchina ........................................................................... 20
Caricamento dei dati spaziali su Oracle....................................................................................................... 21
Collegamento a GeoServer di una sorgente di dati spaziali Oracle ............................................................ 22
Impostazione delle FeatureTypes................................................................................................................ 23
Un esempio pratico ......................................................................................................................................... 25
Requisiti ....................................................................................................................................................... 25
Modello Concettuale ................................................................................................................................... 25
Schema Logico ............................................................................................................................................. 26
Elementi utilizzati ........................................................................................................................................ 27
Pagina 2
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Scelta di un sistema di riferimento spaziale SRS ......................................................................................... 27
Creare un immagine georeferenziata, per il livello raster........................................................................... 27
Creare degli shapefiles ................................................................................................................................ 28
Convertire gli shapefile e caricarli sul DB Oracle ......................................................................................... 31
Caricamento dell’immagine raster .............................................................................................................. 33
Configurazione di GeoServer per l’utilizzo dei dati del DB Oracle .............................................................. 34
Creazione di un client mediante l’utilizzo di OpenLayers ........................................................................... 34
Glossario
40
Bibliografia ............................................................................................................................................... 43
Pagina 3
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Che cos’e GeoServer ?
Come banalmente suggerisce il nome GeoServer è un server, che permette agli utenti di visualizzare,
inserire e modificare dati geografici (e quindi dati spaziali in genere) tramite interfaccia web o client (es.
UDig o GVSig) . Mediante GeoServer è possibile pubblicare e modificare dati spaziali utilizzando gli standard
open source.
E’ possibile rendere disponibile l’informazione spaziale in un ampia varietà di formati di mappe / immagini ,
o dati geospaziali. Le funzionalità vengono rese disponibili tramite richieste http , in modo tale da poter
realizzare sistemi GIS sia su una singola macchina, sia su rete locale ma anche in remoto.
Inoltre sono disponibili delle funzionalità di gestione delle transazioni che rendono possibile un editing
condiviso dei dati.
Tecnicamente GeoServer è un completo WFS-T e WMS (Web Feature Service , Web Map Service, vedi
glossario).
GeoServer è stato scritto in linguaggio java, precisamente la versione 1.4 , il suo sviluppo si basa sull’
utilizzo delle librerie GeoTools , scritte anch’esse in java. Fondamentale è la capacità di utilizzare svariati tipi
di file sia raster (anche georeferenziati come GeoTIFF) che vettoriali e anche tipi di file utilizzati da altre
applicazioni commerciali, inoltre i dati vettoriali possono essere inseriti sia come collegamenti a semplici
shapefiles, sia come collegamenti a database “robusti” come Oracle, Db2, Postgis oltre che a soluzioni
MySql, MapInfo ecc.
Qualche accenno su GeoTools
GeoTools è una libreria open-source (LGPL) scritta in java che fornisce dei metodi conformi agli standard
dell’OGC per la manipolazione dei dati geospaziali. Tramite questa libreria è possibile quindi costruire un
GIS. GeoTools è utilizzato da molti progetti inclusi Web Feature Servers, Web Map Servers, e applicazioni
desktop o web clients.
Lo sviluppo delle librerie procede includendo nuovi formati di file supportati e funzionalità sempre più
avanzate facendo riferimento alle specifiche dell’OGC , lo sviluppo procede in stratta collaborazione con gli
altri progetti GeoAPI e GeoWidgets che offrono funzionalità geospaziali basandosi anch’essi sulle librerie
GeoTools.
GeoTools è gestito dal Project Management Committee (PMC) (un gruppo di volontari che ha dato un
contributo significativo allo sviluppo del progetto).
Il progetto esiste da 7 anni circa, la prima versione GT1 (GeoTools-Lite) è stata abbandonata in favore della
versione GT2 semplicemente chiamata GeoTools, alla data odierna è scaricabile dal sito la versione 2.3.3.
Pagina 4
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
GeoTools è sviluppato mediante un processo aperto , pubblica collaborazione su nuove idee. Tutto lo
sviluppo del progetto è accessibile a tutti e coloro i quali vogliono contribuire sono i benvenuti.
Inoltre GeoTools è un progetto membro dell’ Open Source Geospatial Foundation .
Funzionalità di GeoServer
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Interamente conforme alle specifiche WMS e WFS, come testato dal CITE.
Semplice da configurare tramite un interfaccia WEB, non necessita di file di configurazione.
Supporto dei formati PostGIS, Shapefile, ArcSDE, DB2 e Oracle.
VPF, MySQL, MapInfo, e Cascading WFS sono anch’essi supportati (in beta release).
“On the fly” reprojection con un incorporato database EPSG che supporta centinaia di proiezioni
default.
Web Map output come jpeg, gif, png, SVG, e KML.
Dati vettoriali “grezzi” disponibili come GML o Shapefiles zippati attraverso il WFS.
Anti-aliasing sulle immagini.
Conforme agli standard per default – non è necessario effettuare complesse configurazioni solo
per utilizzare I dati di base.
Lettura dei dati in streaming : non ci sono limiti di memoria alla quantità di dati che viene
restituita.
Full SLD support, entrambi definite dall’utente (POST e GET), utilizzate anche nelle funzionalità di
impostazione degli stili.
Pieno supporto dei filtri nei formati dati WFS (ottimizzati dove possibile).
Supporto per le transazioni atomiche dei database attraverso lo standard WFS-T protocol,
disponibile su tutti i formati di dati.
Supporto delle Long Transactions attraverso una implementazione completa delle specifiche
contenute nel la sezione Locking del WFS.
Innovativo Validation Engine che controlla le features inserite in un insieme topologico con degli
attributi basati su regole , per preservare la backend integrity.
Java (J2EE) servlet-based, può essere eseguito in ogni servlet container.
Progettato per future estensioni , il codice sorgente è semplice da leggere.
Possibilità di gestire nuovi formati di dati con GeoTools DataStore interfaces e helper classes,
facendo di GeoServer una interfaccia standard di connessione ai dati.
Non necessita di ricompilazione per supportare nuovi formati di dati, i GeoTools DataStores
vengono inseriti come dei plug-in in GeoServer, e visualizzati come opzione nell’interfaccia di
configurazione grafica.
Reale sviluppo open source, tramite una grande community, sempre aperta a nuove collaborazioni,
modificando GeoServer per nuove funzionalità.
MapBuilder incorporato , AJAX-style web mapping client, per la visualizzazione istantanea.
Documentazione dettagliata e esaustiva in linguaggio semplice da capire.
Disponibilità di email lists per supporto veloce.
Possibilità di un servizio assistenza e sviluppo a pagamento , fornito da varie società e consulenti .
Molto altro....
Pagina 5
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Requisiti di sistema
E possibile installare GeoServer su macchine Windows, Unix / Linux e Apple Mac OSX.
GeoServer è realizzato mediante linguaggio Java 1.4, e prima di procedere con l’installazione è necessario
installare il JDK ultima versione disponibile (alla data di scrittura di questa relazione è il JDK 6u1)
Installazione
1. Prima di tutto occorre scaricare installare l’ultimo SUN JDK, qualora non fosse già presente sulla
macchina in questione.
2. Successivamente si scarica il file di installazione geoserver-1.5.4.exe (nel caso di sistemi windows) o
alternativamente geoserver-1.5.4.bin e si procede all’installazione del pacchetto.
3. Si fa partire il server, nei sistemi windows l’installazione avrà creato un percorso Programmi>GeoServer 1.5.1 -> Start GeoServer, per linux si utilizza la cartella $GEOSERVER_HOME/bin.
4. Si effettua un piccolo test per vedere se l’installazione è andata a buon fine aprendo l’indirizzo :
http://localhost:8080/geoserver/wfs/GetCapabilities
Viene visualizzato un file XML se tutto è andato a buon fine.
Configurazione
Aprendo la pagina : http://localhost:8080/geoserver/ si ottiene la pagina web di configurazione, dove si
possono subito testare anche alcune demo che illustrano le varie possibilità di utilizzo del server.
Per configurare o amministrare il server è necessario l’utilizzo di username/password che di default
saranno : User: admin, Password: geoserver, se selezioniamo config notiamo una panoramica di varie
opzioni configurabili divise per servizio :
Namespace
I namespace si utilizzano per discriminare i vocabolari XML uno dall’altro. I WFS utilizzano tre
namespace standard #WFS - http://www.opengis.net/wfs
#GML - http://www.opengis.net/gml
#Filter - http://www.opengis.net/ogc
In aggiunta ogni WFS utilizzerà uno o più 'Application Schemas'. GML è il meta-linguaggio utilizzato per
decrivere nello specifico varie entità. Un WFS utilizza uno o più di questi specifici linguaggi per descrivere I
Pagina 6
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
propri schemi – restituiti dalla DescribeFeatureType. Lo schema XML definisce più nello specifico la feature,
quello che una 'strada' rappresenta, per esempio. Questi schemi devono avere ognuno un proprio
namespace. GeoServer viene installato con alcuni namespace preimpostati a scopo dimostrativo , ma è
necessario tenere ben presente che si tratta solo di esempi. E se si sta realizzando un applicazione con
GeoServer è essenziale definire un proprio namespace.
DataStore
Dopo il settaggio dei namespace il passo successivo è configurare le sorgenti di dati.
Un datastore rappresenta una singola, fisica, sorgente di dati geospaziali. Può consistere in una o più
featureTypes (o layers). Una featureType può essere una tabella (come in un database), un singolo file (del
caso degli shapefile), o una directory (come in una VPF library). Il DataStore construct è utilizzato quando
bisogna definire I parametri di connessione per ogni tabella in un grande database, invece di definirle nel
DataStore, ed in ogni FeatureType (table) che si riferisce al DataStore che definisce questi parametri. Nel
caso degli Shapefiles, dove ogni singolo file può contenere una FeatureType, può sembrare eccessivamente
laborioso, ma per uniformità con I parametri di connessione lo definiamo nello Store e il resto nelle
FeatureType. Ogni DataStore disponibile è discusso separatamente ,ognuno ha I propri parametri e
settaggi, probabilmente nella realtà se ne utilizzerà solo un paio. Ad ogni modo tutti hanno alcuni parametri
in comune.
Per aggiungere un DataSet al nostro server basta selezionare: Config -> Data -> DataStores -> New
E’ importante notare che non compaiono tutti i DataStore che si possono collegare, ad esempio Oracle
essendo un DB commerciale e non di libera distribuzione viene visualizzato solo se i relativi plug-in jar sono
installati nella directory /bin altrimenti non verranno installati in automatico in quanto non possono essere
distribuiti liberamente.
Inoltre sono disponibili dei datastore extra da scaricare, previa verifica della compatibilità con la versione di
GeoServer installata.
Bisogna inoltre definire un DataStore ID. Viene usato solo internamente, e deve essere unico.
Opzioni aggiuntive
Per utilizzare propriamente I dati spaziali in GeoServer, occorre configurare correttamente le coordinate
spaziali del sistema di riferimento in cui i dati sono creati.
In base al tipo di dato che viene reso disponibile, la configurazione può essere semplice o molto complessa.
A volte GeoServer può recuperare un numero EPSG analizzando I dati, a volte non ci riesce, a volte i dati
non dispongono di alcuna informazione CRS e quindi bisogna specificarla in maniera diretta.
Pagina 7
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Gestire dati Raster ( Coverage )
Prima di tutto occorre specificare che con il termine coverage store si intende il luogo (tipicamente una
directory) dove si immagazzinano i dati raster (simile a Data Store per i dati vettoriali) , quindi un immagine
o un set di immagini, mentre il termine coverage si riferisce al file raster vero e proprio.
Ecco alcuni dei tipi di dati raster gestiti da GeoServer:
Formato
ArcGrid
WorldImage
ImageMosaic
ImagePyramid
GeoTIFF
Gtopo30
Descrizione
Arc Grid Coverage Format
File raster unito a un file di dati spaziali
Image mosaicking plugin
Image pyramidal plugin
Tagged Image File Format con Inform. Geografica
Gtopo30 Coverage Format
Estensione del file
.asc
.png
.shp
pyramid.properties
.tiff
.dem
Formati di Output di GeoServer
GeoServer supporta vari formati di output per le funzionalità WMS e WFS. Ecco una lista dei formati :
Per specificare un particolare format di output per una richiesta WMS/WFS è sufficiente inserire
"format=..." come parametro nella richiesta.
WMS
•
•
•
•
•
•
•
•
JPEG - (format=image/jpeg) –
GIF - (format=image/gif) PNG - (image/png)SVG - (format=image/svg)PDF - (format=application/pdf)KML - (format=KML)- (utilizzato da Google Earth )
KMZ - (format=KMZ)Openlayers - (format=application/openlayers)-
Per I formati GIF e PNG l’output è controllato dal parametro palette , che forza le imagini a 256 colori,
con una maggiore velocità di generazione e minore occupazione di memoria ma viene disattivato l’antialiasing, è conveniente utilizzarla per le immagini provenienti da layer vettoriali.
WFS
•
•
•
•
GML2 - (format=GML2)
GML2 gZipped - (format=GML2-GZIP)
Shapefile - (format=SHAPE-ZIP)
JSON - (format=json) (http://geojson.org)
Pagina 8
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Lato client
Per poter fruire delle funzionalità offerte dal server è necessario un client che sia conforme agli standard
WFS e/o WMS, a questo punto la conformità di GeoServer agli standard OGC rende possibile sia lo sviluppo
di un client partendo da zero ma a patto che sia costruito secondo le specifiche del consorzio, oppure si
possono utilizzare una delle tante soluzioni client open source disponibili, alcune delle quali possono essere
inserite in pagine web e customizzate con le funzionalità richieste.
“Closed Source” Desktop Client
E’ possibile utilizzare anche ArcGIS come client non open source, ma ve ne sono diversi – la connessione a
un WMS sta diventando un funzionalità base di ogni pacchetto desktop GIS che si rispetti.
Open Source Clients : OpenLayers
OpenLayers è una libreria in puro Javascript che permette di visualizzare dati geografici (e ovviamente
mappe) tramite i recenti web-browser , è indipendente dal lato server e supporta WMS e WFS.
OpenLayers implementa una API Javascript che permette di creare applicazioni geografiche basate sul web
di grande impatto, simili a Google Maps , con una fondamentale differenza, OpenLayers è un software
libero sviluppato da una comunità open source. Sono supportate alcune funzionalità come lo zoom, il
trascinamento, la gestione di layer multipli, l’indicazione delle cordinate spaziali di ogni pixel rappresentato
e quindi la possibilità di lanciare interrogazioni con un semplice click del puntatore.
Esempio
I seguente codice mostra come inserire un layer WMS da GeoServer in una mappa OpenLayers in una
pagina web :
<html>
<head>
<script src="http://openlayers.org/api/OpenLayers.js"></script>
</head>
<body>
coverage
...
<script defer="defer" type="text/javascript">
var map = new OpenLayers.Map('map');
var wms = new OpenLayers.Layer.WMS("Curva de Nivel",
"http://sig.cas.gov.co:9999/geoserver/wms?service=wms",
{layers:
'basica25:capa_6101_curva_de_nivel'}
);
map.addLayer(wms);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.zoomToFullExtent();
</script>
...
</body>
</html>
In realtà viene installata una copia delle librerie javascript di OpenLayers anche localmente a GeoServer,
quindi non è necessario il collegamento al sito OpenLayers per utilizzare la libreria. Basta quindi modificare
Pagina 9
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
la terza riga sopra con l’indirizzo locale delle librerie, ad ogni modo sono presenti svariati esempi di utilizzo
di OpenLayers nei demo installati di default con GeoServer.
GeoServer & Google Earth
Tra i vari formati possibili di output del server troviamo il KML , che è il formato utilizzato dal programma
Google Earth. In sostanza quando facciamo una richiesta con uscita formato KML al nostro server, sia che
esso risponda con dati vettoriali o dati raster, viene richiesto di aprire il file con il programma Google Earth
e l’output viene sovrapposto (sempre correttamente georeferenziato con l’opportuno sistema di
riferimento) alla porzione di globo terrestre indicato dalle coordinate spaziali presenti nel file in uscita dal
server. Ma questa interoperabilità fa si che sia anche possibile prelevare dati direttamente dal server
Google Earth e mescolarli con i dati in nostro possesso per fonderli in un'unica applicazione, magari tramite
OpenLayers.
Funzionalità avanzate
GeoServer ha la potente funzionalità di selezionare I dati da restituire basandosi su una query impostata
dall’utente. Praticamente tramite un parametro ‘FILTER' or 'CQL_FILTER" si pongono dei vincoli sui dati che
verranno forniti in uscita. Questi filtri sono in sostanza delle traduzioni dello statement SQL 'WHERE'
tramite formato web , e consentono la piena Potenza espressiva dell’ SQL, con la limitazione dell’utilizzo di
una sola tabella. Sono possibili l’utilizzo di filtri logici come AND e OR per la realizzazione di query
complesse mediante l’utilizzo di comparazioni sui tipi di dato numerici e stringa, ma soprattutto query di
tipo geometrico (ad es. bbox, touch, intersect, disjoint), LIKE statement, valori NULL, e molte altre.
Inoltre tali interrogazioni possono essere inviate come url, oppure inviate come file xml all’indirizzo del
server.
Chiaramente il set di istruzioni utilizzabili nelle interrogazioni si sviluppa procedendo di pari passo con le
migliorie apportate alle librerie GeoTools.
OGC Filters
GeoServer supporta oltre che le documentate funzioni base di visualizzazione dei dati spaziali, anche delle
richieste di interrogazione, modifica e locking sulle feature. Questo sempre seguendo le linee guida delle
specifiche del OGC, ovvero una particolare funzione che si chiama GetFeature().
Il filtro OGC è un open standard proposto dall’ Open Geospatial Consortium chiamato 'Filter Encoding’
GeoServer ne implementa completamente le specifiche , per utilizzarlo è sufficiente leggerne le specifiche
complete che riportano alcuni esempi.
Il filtro più semplice è facile da scrivere. E’chiamato 'featureid' filter, e permette di selezionare una singola
feature fornendo il suo id:
http://localhost:8080/geoserver/wms/kml_reflect?layers=topp:states&featureid=states.5
Questo filtro visualizzerà lo stato del Maryland in quanto corrisponde a quello che corrisponde ad una
feature ID uguale a 5 ,utilizzando i dati demo forniti con GeoServer e Google Earth. Piu semplicemente è
possibile utilizzare il fitro su una richiesta di tipo WFS ed esaminando la risposta in formato GML. L’output
in KML includerà tutte le featureid se non specificato altrimenti.
In generale per ogni interrogazione effettuata tramite http si avranno 3 attori:
1. DataSet
2. Richiesta
3. Risposta
Pagina 10
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
DataSet
Il dataset è in sostanza l’insieme dei dati che saranno oggetto della richiesta.
Richiesta
Una richiesta può essere inviata al server come GET o come POST, entrambe sono gestite in maniera simile
dal server.
Risposta
La risposta può essere fornita come WFS e quindi un file ad esempio GML contenete le feature risultanti
dall’interrogazione, oppure tramite WMS e quindi avremo un file immagine con le feature selezionate.
Interrogazioni mediante Common Query Language CQL
Quando le interrogazioni tramite filtro OGC si fanno complesse si perde parecchio in comprensibilità, ad
esempio l’interrogazione in OGC :
http:/localhost:8080/geoserver/wms/kml_reflect?layers=topp:states&FILTER=%3CFilter%3E%3CProperty
IsBetween%3E%3CPropertyName%3Etopp:LAND_KM%3C/PropertyName%3E%3CLowerBoundary%3E%3
CLiteral%3E100000%3C/Literal%3E%3C/LowerBoundary
%3E%3CUpperBoundary%3E%3CLiteral%3E150000%3C/Literal%3E%3C/UpperBoundary%3E%3C/Property
IsBetween%3E%3C/Filter%3E
Diventa utilizzando il CQL molto più succinta e leggibile :
http://localhost:8080/geoserver/wms/kml_reflect?layers=topp:states&CQL_FILTER=LAND_KM+BETWEE
N+100000+AND+150000
Il CQL (Common Query Language) è un linguaggio formale sviluppato dalla libreria del congresso degli stati
uniti per descrivere interrogazioni a sistemi informativi in genere come ad esempio motori di ricerca,
cataloghi ecc. . La semantica del linguaggio è stata specificata dal gruppo Z39.50 che fa parte della libreria
del congresso degli stati uniti. Le linee guida di questo progetto sono quelle di realizzare un linguaggio
facilmente comprensibile dal punto di vista degli utilizzatori finali ma mantenendo la ricchezza e
l’espressività dei linguaggi di query più complessi.
GeoServer supporta questo linguaggio dalla versione 1.5.0 RC1, e consente di effettuare alcune tipologie di
filtraggi sulle features e sulle mappe che vengono gestite.
Come è noto GeoServer può rispondere alle richieste sia come WFS e quindi genera un file GML con le
feature, oppure in modalità WMS generando in output un file in qualche formato grafico che deve essere
gestito da una applicazione opportuna.
Pagina 11
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Negli esempi che seguono il DataSet corrisponde ad un insieme di Poligoni con typename “terreni” definiti
con coordinate EPSG:4326 nel namespace “lignano”, ogni poligono oltre all’insieme delle coordinate dei
punti che lo definisce ha anche i campi numerici Particella e MWShapeID.
Consideriamo il primo caso, mediante la richiesta :
http://localhost:8080/geoserver/wfs?request=GetFeature&typeName=lignano:TERRENI
Otteniamo un file GML che contiene al suo interno tutte le feature che sono state collegate
precedentemente con il nome terreni.
Supponiamo ora di volere recuperare solo le feature contenute in un dato bounding box (WINDOW QUERY)
, la richiesta sarà effettuata come prima con l’aggiunta alla fine del comando CQL evidenziato in rosso:
http://localhost:8080/geoserver/wfs?service=WFS&request=GetFeature&typename=lignano:TERRENI&
CQL_FILTER=BBOX(GEOM,13.09051,44.4039,13.96132,45.70060)
Ed ecco una parte dell’ output, troncato per comodità alla prima feature :
<?xml version="1.0" encoding="UTF-8" ?>
- <wfs:FeatureCollection xmlns="http://www.opengis.net/wfs"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:topp="http://www.openplans.org/topp"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.openplans.org/topp
http://localhost:8080/geoserver/wfs/DescribeFeatureType?typeName
=topp:terreni http://www.opengis.net/wfs
http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
- <gml:boundedBy>
- <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="."
cs="," ts="">13.14112624,45.69312214
13.14444251,45.69643827</gml:coordinates>
</gml:Box>
</gml:boundedBy>
- <gml:featureMember>
- <topp:terreni fid="terreni.1">
- <topp:the_geom>
- <gml:MultiPolygon
srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
- <gml:polygonMember>
- <gml:Polygon>
- <gml:outerBoundaryIs>
- <gml:LinearRing>
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="."
cs="," ts="">13.1433477,45.69583201 13.14375631,45.69585162
13.14410936,45.69525014 13.14350134,45.69489383
13.14336731,45.69510304 13.1432954,45.69516515
13.14319079,45.6952338 13.1431581,45.69528283
13.1433477,45.69583201</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:polygonMember>
</gml:MultiPolygon>
Pagina 12
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
</topp:the_geom>
<topp:MWShapeID>1</topp:MWShapeID>
<topp:Particella>412</topp:Particella>
</topp:terreni>
</gml:featureMember>
- <gml:featureMember>
Supponiamo ora di voler effettuare una interrogazione che all’interno dell’insieme delle feature terreni
restituisca solo le feature che hanno associato un attributo Particella (tipo intero) superiore a 411.
http://localhost:8080/geoserver/wfs?service=WFS&request=GetFeature&typename=terreni&CQL_FILTER
=Particella>411
Lanciato il comando su un insieme di feature in cui il Max valore del campo Particella è 412 il risultato sarà
la sola forma geometrica con il campo ‘Particella’ settato a 412 :
<?xml version="1.0" encoding="UTF-8" ?>
- <wfs:FeatureCollection xmlns="http://www.opengis.net/wfs"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:topp="http://www.openplans.org/topp"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.openplans.org/topp
http://localhost:8080/geoserver/wfs/DescribeFeatureType?typeName
=topp:terreni http://www.opengis.net/wfs
http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
- <gml:boundedBy>
- <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="."
cs="," ts="">13.1431581,45.69489383
13.14410936,45.69585162</gml:coordinates>
</gml:Box>
</gml:boundedBy>
- <gml:featureMember>
- <topp:terreni fid="terreni.1">
- <topp:the_geom>
- <gml:MultiPolygon
srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
- <gml:polygonMember>
- <gml:Polygon>
- <gml:outerBoundaryIs>
- <gml:LinearRing>
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="."
cs="," ts="">13.1433477,45.69583201 13.14375631,45.69585162
13.14410936,45.69525014 13.14350134,45.69489383
13.14336731,45.69510304 13.1432954,45.69516515
13.14319079,45.6952338 13.1431581,45.69528283
13.1433477,45.69583201</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</gml:polygonMember>
</gml:MultiPolygon>
</topp:the_geom>
Pagina 13
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
<topp:MWShapeID>1</topp:MWShapeID>
<topp:Particella>412</topp:Particella>
</topp:terreni>
</gml:featureMember>
</wfs:FeatureCollection>
Adesso effettuiamo una selezione sulla tabella STRADE che ritorni I nomi e le corsie delle strade che hanno
tra le 1 e 1 corsie.
http://localhost:8080/geoserver/wfs?request=GetFeature&typeName=lignano:STRADE&propertyName=
NOME,CORSIE&outputFormat=GML2&CQL_FILTER=CORSIE%20BETWEEN%201%20AND%201
Ed ecco il risultato :
<?xml version="1.0" encoding="UTF-8" ?>
- <wfs:FeatureCollection xmlns="http://www.opengis.net/wfs"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:lignano="http://localhost/"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://localhost/
http://localhost:8080/geoserver/wfs/DescribeFeatureType?typeName
=lignano:STRADE http://www.opengis.net/wfs
http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
- <gml:boundedBy>
- <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="."
cs="," ts="">13.139177,45.683935
13.148467,45.697082</gml:coordinates>
</gml:Box>
</gml:boundedBy>
- <gml:featureMember>
- <lignano:STRADE fid="STRADE.1">
<lignano:NOME>Lungomare marin</lignano:NOME>
<lignano:CORSIE>1</lignano:CORSIE>
</lignano:STRADE>
</gml:featureMember>
- <gml:featureMember>
- <lignano:STRADE fid="STRADE.2">
<lignano:NOME>Lungomare Trieste</lignano:NOME>
<lignano:CORSIE>1</lignano:CORSIE>
</lignano:STRADE>
</gml:featureMember>
- <gml:featureMember>
- <lignano:STRADE fid="STRADE.8">
<lignano:NOME>Darsena</lignano:NOME>
<lignano:CORSIE>1</lignano:CORSIE>
</lignano:STRADE>
</gml:featureMember>
</wfs:FeatureCollection>
Pagina 14
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Passiamo ora ad una query spaziale in formato .xml , vogliamo ottenere i poligoni intersecati dal punto di
coordinate lat e long : 13.1437,45.6956.
La URL sarà :
http://localhost:8080/geoserver/wfs
e il corpo del messaggio xml :
<wfs:GetFeature service="WFS" version="1.0.0"
outputFormat="GML2"
xmlns:topp="http://www.openplans.org/topp"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns="http://www.opengis.net/ogc"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.opengis.net/wfs
http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
<wfs:Query typeName="lignano:TERRENI">
<Filter>
<Intersects>
<PropertyName>GEOM</PropertyName>
<gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates>13.1437,45.6956</gml:coordinates>
</gml:Point>
</Intersects>
</Filter>
</wfs:Query>
</wfs:GetFeature>
Quanto sopra è equivalente alla richiesta url di seguito :
http://localhost:8080/geoserver/wfs?request=GetFeature&typeName=lignano:TERRENI&outputFormat=
GML2&CQL_FILTER=INTERSECT(GEOM,%20POINT%20(13.1437%2045.6956))
E questo sarà il risultato corretto (ovvero la particella numero 412 con tutti i campi visibili, in quanto non è
stato impostato nessun filtro :
<?xml version="1.0" encoding="UTF-8" ?>
- <wfs:FeatureCollection xmlns="http://www.opengis.net/wfs"
xmlns:wfs="http://www.opengis.net/wfs"
xmlns:lignano="http://localhost/"
xmlns:gml="http://www.opengis.net/gml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://localhost/
http://localhost:8080/geoserver/wfs/DescribeFeatureType?typeName
=lignano:TERRENI http://www.opengis.net/wfs
http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-basic.xsd">
- <gml:boundedBy>
- <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="."
cs="," ts="">13.143158,45.694894
13.144109,45.695852</gml:coordinates>
</gml:Box>
Pagina 15
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
</gml:boundedBy>
- <gml:featureMember>
- <lignano:TERRENI fid="TERRENI.1">
<lignano:PARTICELLA>412</lignano:PARTICELLA>
<lignano:NOME>Mediacasa sas</lignano:NOME>
<lignano:CF_P_IVA>1654213213</lignano:CF_P_IVA>
<lignano:EDIFICABIL>SI</lignano:EDIFICABIL>
<lignano:FABBRICATO>NO</lignano:FABBRICATO>
<lignano:INDIRIZO>via ROSA DEI VENTI 3</lignano:INDIRIZO>
- <lignano:GEOM>
- <gml:Polygon
srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">
- <gml:outerBoundaryIs>
- <gml:LinearRing>
<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="."
cs="," ts="">13.143348,45.695832 13.143158,45.695283
13.143191,45.695234 13.143295,45.695165 13.143501,45.694894
13.144109,45.69525 13.143756,45.695852
13.143348,45.695832</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</lignano:GEOM>
</lignano:TERRENI>
</gml:featureMember>
</wfs:FeatureCollection>
In questo caso abbiamo calcolato l’intersezione di un punto con un poligono, nel caso dell’ intersezione di
un punto con una linea invece è conveniente invece di prendere come argomento dell’interrogazione il
punto, prendere un poligono o un punto calcolando attorno un buffer per calcolare l’intersezione,
altrimenti la query probabilmente non produrrà nulla in output.
Che è quello che accade nell’ esempio pratico descritto di seguito in cui con dalle coordinate di un punto
vengono selezionate strade e terreni, se si trattasse di un singolo punto probabilmente si riuscirebbe a
selezionare solamente i poligoni dei terreni perché le linee non sarebbero selezionabili.
Elenco delle funzioni supportate
Di seguito sono riportate le funzioni matematiche supportate dal server e anche le funzioni spaziali, queste
ultime nel caso siano operazioni spaziali tra oggetti non elementari , ad esempio una interrogazione che
esegue una query di tipo touch su un insieme di feature, vengono eseguite recuperando con un
interrogazione il file GML che descrive la feature oggetto della query, e poi viene mandata una richiesta in
xml sul set da verificare che conterrà anche la feature recuperata in precedenza.
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
nArgs="1">abs</ogc:Function_Name>
nArgs="1">abs_2</ogc:Function_Name>
nArgs="1">abs_3</ogc:Function_Name>
nArgs="1">abs_4</ogc:Function_Name>
nArgs="1">acos</ogc:Function_Name>
nArgs="1">Area</ogc:Function_Name>
nArgs="1">asin</ogc:Function_Name>
nArgs="1">atan</ogc:Function_Name>
nArgs="2">atan2</ogc:Function_Name>
nArgs="3">between</ogc:Function_Name>
Pagina 16
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
<ogc:Function_Name nArgs="1">boundary</ogc:Function_Name>
<ogc:Function_Name
nArgs="1">boundaryDimension</ogc:Function_Name>
<ogc:Function_Name nArgs="2">buffer</ogc:Function_Name>
<ogc:Function_Name
nArgs="3">bufferWithSegments</ogc:Function_Name>
<ogc:Function_Name nArgs="1">ceil</ogc:Function_Name>
<ogc:Function_Name nArgs="1">centroid</ogc:Function_Name>
<ogc:Function_Name
nArgs="1">Collection_Average</ogc:Function_Name>
<ogc:Function_Name nArgs="1">Collection_Bounds</ogc:Function_Name>
<ogc:Function_Name nArgs="1">Collection_Count</ogc:Function_Name>
<ogc:Function_Name nArgs="1">Collection_Max</ogc:Function_Name>
<ogc:Function_Name nArgs="1">Collection_Median</ogc:Function_Name>
<ogc:Function_Name nArgs="1">Collection_Min</ogc:Function_Name>
<ogc:Function_Name nArgs="1">Collection_Sum</ogc:Function_Name>
<ogc:Function_Name nArgs="1">Collection_Unique</ogc:Function_Name>
<ogc:Function_Name nArgs="2">contains</ogc:Function_Name>
<ogc:Function_Name nArgs="1">convexHull</ogc:Function_Name>
<ogc:Function_Name nArgs="1">cos</ogc:Function_Name>
<ogc:Function_Name nArgs="2">crosses</ogc:Function_Name>
<ogc:Function_Name nArgs="2">difference</ogc:Function_Name>
<ogc:Function_Name nArgs="1">dimension</ogc:Function_Name>
<ogc:Function_Name nArgs="2">disjoint</ogc:Function_Name>
<ogc:Function_Name nArgs="2">distance</ogc:Function_Name>
<ogc:Function_Name nArgs="1">double2bool</ogc:Function_Name>
<ogc:Function_Name nArgs="1">endPoint</ogc:Function_Name>
<ogc:Function_Name nArgs="1">envelope</ogc:Function_Name>
<ogc:Function_Name nArgs="2">EqualInterval</ogc:Function_Name>
<ogc:Function_Name nArgs="2">equalsExact</ogc:Function_Name>
<ogc:Function_Name
nArgs="3">equalsExactTolerance</ogc:Function_Name>
<ogc:Function_Name nArgs="2">equalTo</ogc:Function_Name>
<ogc:Function_Name nArgs="1">exp</ogc:Function_Name>
<ogc:Function_Name nArgs="1">exteriorRing</ogc:Function_Name>
<ogc:Function_Name nArgs="1">floor</ogc:Function_Name>
<ogc:Function_Name nArgs="1">geometryType</ogc:Function_Name>
<ogc:Function_Name nArgs="1">geomFromWKT</ogc:Function_Name>
<ogc:Function_Name nArgs="1">geomLength</ogc:Function_Name>
<ogc:Function_Name nArgs="2">getGeometryN</ogc:Function_Name>
<ogc:Function_Name nArgs="1">getX</ogc:Function_Name>
<ogc:Function_Name nArgs="1">getY</ogc:Function_Name>
<ogc:Function_Name nArgs="1">getZ</ogc:Function_Name>
<ogc:Function_Name nArgs="2">greaterEqualThan</ogc:Function_Name>
<ogc:Function_Name nArgs="2">greaterThan</ogc:Function_Name>
<ogc:Function_Name nArgs="2">IEEEremainder</ogc:Function_Name>
<ogc:Function_Name nArgs="3">if_then_else</ogc:Function_Name>
<ogc:Function_Name nArgs="11">in10</ogc:Function_Name>
<ogc:Function_Name nArgs="3">in2</ogc:Function_Name>
<ogc:Function_Name nArgs="4">in3</ogc:Function_Name>
<ogc:Function_Name nArgs="5">in4</ogc:Function_Name>
<ogc:Function_Name nArgs="6">in5</ogc:Function_Name>
<ogc:Function_Name nArgs="7">in6</ogc:Function_Name>
<ogc:Function_Name nArgs="8">in7</ogc:Function_Name>
Pagina 17
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
<ogc:Function_Name
nArgs="9">in8</ogc:Function_Name>
nArgs="10">in9</ogc:Function_Name>
nArgs="1">int2bbool</ogc:Function_Name>
nArgs="1">int2ddouble</ogc:Function_Name>
nArgs="1">interiorPoint</ogc:Function_Name>
nArgs="2">interiorRingN</ogc:Function_Name>
nArgs="2">intersection</ogc:Function_Name>
nArgs="2">intersects</ogc:Function_Name>
nArgs="1">isClosed</ogc:Function_Name>
nArgs="1">isEmpty</ogc:Function_Name>
nArgs="2">isLike</ogc:Function_Name>
nArgs="1">isNull</ogc:Function_Name>
nArgs="1">isRing</ogc:Function_Name>
nArgs="1">isSimple</ogc:Function_Name>
nArgs="1">isValid</ogc:Function_Name>
nArgs="3">isWithinDistance</ogc:Function_Name>
nArgs="1">length</ogc:Function_Name>
nArgs="2">lessEqualThan</ogc:Function_Name>
nArgs="2">lessThan</ogc:Function_Name>
nArgs="1">log</ogc:Function_Name>
nArgs="2">max</ogc:Function_Name>
nArgs="2">max_2</ogc:Function_Name>
nArgs="2">max_3</ogc:Function_Name>
nArgs="2">max_4</ogc:Function_Name>
nArgs="2">min</ogc:Function_Name>
nArgs="2">min_2</ogc:Function_Name>
nArgs="2">min_3</ogc:Function_Name>
nArgs="2">min_4</ogc:Function_Name>
nArgs="1">not</ogc:Function_Name>
nArgs="2">notEqualTo</ogc:Function_Name>
nArgs="1">numGeometries</ogc:Function_Name>
nArgs="1">numInteriorRing</ogc:Function_Name>
nArgs="1">numPoints</ogc:Function_Name>
nArgs="2">overlaps</ogc:Function_Name>
nArgs="1">parseBoolean</ogc:Function_Name>
nArgs="1">parseDouble</ogc:Function_Name>
nArgs="1">parseInt</ogc:Function_Name>
nArgs="2">pointN</ogc:Function_Name>
nArgs="2">pow</ogc:Function_Name>
nArgs="1">PropertyExists</ogc:Function_Name>
nArgs="2">Quantile</ogc:Function_Name>
nArgs="0">random</ogc:Function_Name>
nArgs="2">relate</ogc:Function_Name>
nArgs="3">relatePattern</ogc:Function_Name>
nArgs="1">rint</ogc:Function_Name>
nArgs="1">round</ogc:Function_Name>
nArgs="1">round_2</ogc:Function_Name>
nArgs="1">roundDouble</ogc:Function_Name>
nArgs="1">sin</ogc:Function_Name>
nArgs="1">sqrt</ogc:Function_Name>
nArgs="2">StandardDeviation</ogc:Function_Name>
nArgs="1">startPoint</ogc:Function_Name>
nArgs="2">strConcat</ogc:Function_Name>
Pagina 18
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
<ogc:Function_Name nArgs="2">strEndsWith</ogc:Function_Name>
<ogc:Function_Name
nArgs="2">strEqualsIgnoreCase</ogc:Function_Name>
<ogc:Function_Name nArgs="2">strIndexOf</ogc:Function_Name>
<ogc:Function_Name nArgs="2">strLastIndexOf</ogc:Function_Name>
<ogc:Function_Name nArgs="1">strLength</ogc:Function_Name>
<ogc:Function_Name nArgs="2">strMatches</ogc:Function_Name>
<ogc:Function_Name nArgs="4">strReplace</ogc:Function_Name>
<ogc:Function_Name nArgs="2">strStartsWith</ogc:Function_Name>
<ogc:Function_Name nArgs="3">strSubstring</ogc:Function_Name>
<ogc:Function_Name nArgs="2">strSubstringStart</ogc:Function_Name>
<ogc:Function_Name nArgs="1">strTrim</ogc:Function_Name>
<ogc:Function_Name nArgs="2">symDifference</ogc:Function_Name>
<ogc:Function_Name nArgs="1">tan</ogc:Function_Name>
<ogc:Function_Name nArgs="1">toDegrees</ogc:Function_Name>
<ogc:Function_Name nArgs="1">toRadians</ogc:Function_Name>
<ogc:Function_Name nArgs="2">touches</ogc:Function_Name>
<ogc:Function_Name nArgs="1">toWKT</ogc:Function_Name>
<ogc:Function_Name nArgs="2">union</ogc:Function_Name>
<ogc:Function_Name nArgs="1">UniqueInterval</ogc:Function_Name>
<ogc:Function_Name nArgs="2">within</ogc:Function_Name>
GeoServer & Oracle
GeoServer supporta come fonte di dati spaziali oltre ai classici shapefile , il cui uso è sconsigliato per utilizzi
pesanti, ovvero che vadano oltre a dei semplici test o applicazioni leggere, in quanto possono verificarsi
problemi causati dal meccanismo di locking dei file da parte del sistema operativo sottostante.
Per questo motivo si consiglia a chi vuole realizzare un sistema GIS robusto di utilizzare un database esterno
che possa fornire un adeguato controllo e stabilità durante le operazioni di lettura, scrittura o
aggiornamento dei dati.
Tra i database supportati in modalità stabile troviamo : PostGIS, Oracle, ArcSDE, DB2 mentre tra quelli
supportati ma in via di sviluppo : MySQL, VPF, MapInfo, WFS.
Installazione del supporto Oracle
Per motivi legati alla licenza e ridistribuzione su alcuni componenti necessari al funzionamento del
collegamento al database Oracle, GeoServer non viene installato di default con questa funzionalità inclusa,
ma deve essere aggiunta come PLUG-IN, per fare ciò occorre scaricare due componenti sotto forma di
archivi jar: uno chiamato ojdbc14.jar che può essere liberamente scaricato dal sito della Oracle all indirizzo:
http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html
mentre l’altro file gt2-oracle-spatial.jar è disponibile sulla pagina del sito geoserver.org dove si tratta la
connessione al database Oracle.
Entrambi i file vanno copiati nella directory [GEOSERVER_HOME]/server/geoserver/WEB-INF/lib/.
Successivamente occorre riavviare il server e per effettuare un test che ci assicuri che l’installazione del
plug-in sia andata a buon fine occorre aprire la pagina di configurazione di GeoServer selezionare Config ->
Data -> DataStores -> New, e se il plug-in è installato correttamente si noteranno nel box a tendina le voci
Oracle e Oracle(OCI), in aggiunta alle voci di default come postgres, properties, shapefile, shapefile
(indexed).
Pagina 19
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Nel caso la copia dei plug-in sia stata effettuata correttamente ma non vengono visualizzate le estensioni
Oracle nel menù, è possibile reinstallare GeoServer che a questo punto dovrebbe comprendere le nuove
voci.
Oracle & GeoServer in esecuzione sulla stessa macchina
Qualora si debba installare il database Oracle e GeoServer sulla sessa macchina occorre rimediare al
problema che viene a crearsi in quanto tutte e due i server che andranno in esecuzione
contemporaneamente, offriranno la funzionalità di configurazione tramite HTTP all’indirizzo 127.0.0.1
porta 8080 con percorsi diversi, questo produrrà effetti indesiderati (in pratica nessuno dei due servizi sarà
funzionante) e quindi sarà necessario spostare la porta di accesso a uno dei servizi di configurazione. Tale
problema non si presenta quando viene installato prima geoserver e successivamente Oracle, in quanto
quest’ultimo rileva il conflitto sulle porte in fase di installazione e propone una porta alternativa libera.
Per effettuare il cambio porta http manualmente, nel caso di Oracle Express e macchina windows basterà
lanciare il comando seguente nella console in c:\windows\system32> sqlplus
SQL> -- set http port and ftp port
SQL> begin
2
dbms_xdb.sethttpport('80');
3
dbms_xdb.setftpport('2100');
4 end;
5 /
PL/SQL procedure successfully completed.
SQL> select dbms_xdb.gethttpport as "HTTP-Port"
, dbms_xdb.getftpport as "FTP-Port" from dual;
HTTP-Port
FTP-Port
---------- ---------80
2100
Pagina 20
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Caricamento dei dati spaziali su Oracle
Per popolare un database spaziale su Oracle si possono utilizzare i comandi SQL direttamente fornendo le
coordinate e le tipologie degli oggetti spaziali che andremo a trattare, oppure è possibile utilizzare degli
shapefile (formato file geospaziale vettoriale sviluppato da ESRI ) che in realtà sono una terna di file con
estensione .shp .dbf e .shx che contengono gli oggetti spaziali e eventualmente dati “classici” associati agli
oggetti spaziali. Fondamentale è la possibilità di creare e gestire tali dati con programmi simili a comuni
programmi di grafica vettoriale che permettono la copia, la modifica, il trascinamento e eventualmente la
possibilità di utilizzare una mappa georiferita sullo sfondo per ricavare i dati spaziali degli oggetti vettoriali
da una foto della realtà sottostante in modo molto immediato. Uno dei programmi open source per poter
creare shapefiles con la possibilità di integrare (e georiferire) immagini è MapWindow GIS, ma anche
Quantum GIS seppure sia solo alla versione 0.9 è molto ricco di funzioni.
Per non parlare poi della possibilità di digitalizzare delle planimetrie cartacee che possono essere convertite
in formato vettoriale e poi utilizzate previa conversione nel formato shapefile.
Una volta ottenuti gli shapefile possiamo utilizzare il programma console fornito direttamente dalla Oracle
shp2sdo (disponibile per ambiente windows e Solaris + linux) che dai singoli shapefile genera altri file: uno
con estensione .sql che dopo aver lanciato sqlplus ( e fatto il login con le credenziali dell’ utente) servirà a
creare le tabelle necessarie alla memorizzazione dei dati, tramite il comando : @<nomefile>.sql .
Una volta terminato correttamente il comando precedente possiamo uscire dalla console SQL e eseguire la
seconda fase che servirà per caricare i dati nelle tabelle con il comando da console sqlldr
<username>/<password> <nomefile>.
Una volta andato a buon fine il caricamento dei dati spaziali e solo per i tipi poligono, è indispensabile
dopo aver fatto il login tramite sqlplus eseguire il seguente comando :
EXECUTE SDO_MIGRATE.TO_CURRENT('STATES','GEOM');
(valido solo per versioni Oracle 9.1 e succ.)
Questo comando esegue dei fix rispetto ai dati geometrici contenuti nella tabella di nome ‘STATES’ su
SDO_GTYPES ed etypes oltre che alcuni ordinamenti .
Senza questo comando quando si andrà a caricare i dati delle features con GeoServer si otterrà un risposta
dal server che indica una tabella vuota o un tipo di geometria non definito, più precisamente la risposta
sarà questa :
The FeatureType '<FEATURE_NAME>'
'<FEATURE_NAME>' has a NULL extent. HINT: the dataset is empty or has no default
geometry attribute.
Tale risposta del server è particolarmente inaspettata in quanto i dati geospaziali senza l’ultimo comando
sopra menzionato possono venire rappresentati graficamente senza problemi tramite l’applicativo
Mapbuilder di Oracle.
Una volta che abbiamo caricato correttamente I dati spaziali e il nostro server Oracle è correttamente in
funzione possiamo configurare GeoServer perché possa accedere ai dati.
Pagina 21
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Collegamento a GeoServer di una sorgente di dati spaziali Oracle
Per collegare una sorgente di dati spaziali Oracle a GeoServer occorre eventualmente creare un nuovo
namespace GML, altrimenti si può utilizzare uno esistente.
Una volta effettuato il login nella homepage del server si seleziona Config -> Data -> DataStores -> New
A questo punto si inserisce il nome dell’ identificatore che vogliamo dare al nostro DataStore e si clicca su
New, successivamente appare questa schermata dove vengono chieste ulteriori informazioni sui dati da
collegare :
Pagina 22
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Alcune precisazioni:
Nella casella host va inserito il nome della macchina su cui gira Oracle, nel caso di windows si fa riferimento
al nome del computer, quindi “localhost” o 127.0.0.1 probabilmente non funzioneranno (anzi sicuramente
non funzionerà con Oracle 10g e windows XP) , per vedere quale nome inserire possiamo usare l’utility
lsnrctl lanciata da console che ci fornirà il nome corretto da inserire e anche alcune informazioni sulle porte
utilizzate.
Port 1521 è la porta di default utilizzata da Oracle per l’accesso ai dati, ma potrebbe essere stata modificata
su alcuni sistemi.
User e Password sono quelli dell’utente Oracle proprietario della base si dati.
Instance può essere orcl nella versione completa di Oracle, oppure xe se si utilizza Oracle Express.
Schema non è un campo obbligatorio ma serve per specificare quale schema collegare, non mettendo nulla
si collega tutto relativamente all’user indicato.
Osservando la finestra di output di GeoServer, si vede come compaia quello che viene trovato all’interno
della base dati oppure eventuali messaggi di errore che compariranno anche nell’interfaccia web.
Premendo su Submit se non vengono visualizzati errori si torna alla schermata iniziale e nel menù a tendina
sarà disponibile il nuovo DataStore, questo però significa solo che abbiamo collegato una sorgente di dati e
non che tali dati siano effettivamente fruibili. A questo punto per rendere effettive le modifiche bisogna
selezionare i bottoni Apply e Save in alto a sx, altrimenti le modifiche andranno perse al prossimo riavvio di
GeoServer .
Impostazione delle FeatureTypes
A questo punto possiamo utilizzare i dati che sono rappresentati all’interno del nostro database, per fare
questo dobbiamo creare un nuovo featuretype seguendo il percorso:
Config -> Data -> FeatureTypes -> New
Pagina 23
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Dal menù a tendina selezioniamo il nome della tabella contenente i dati delle feature che dobbiamo
utilizzare, nell’ esempio sopra la tabella con nome COUNTIES, poi dando conferma si apre la seconda pagina
di configurazione. Qui dobbiamo selezionare uno stile che servirà per rappresentare le feature (stile che
può essere uno esistente oppure uno che andremo a creare ex novo), il sistema di riferimento nel quale
sono espresse le coordinate spaziali delle feature presenti nel database ( talvolta GeoServer è in grado di
rilevare il SRS da solo premendo il testo LOOKUP SRS, altrimenti si dovrà procedere all’ inserimento
manuale), il nome da associare alle feature, e poi è obbligatorio riempire il bounding box dell’insieme delle
feature presenti nel database.
A questo punto possiamo farlo in automatico premendo Generate, questo è anche un primo test per
vedere se il server ha recepito bene i dati e la loro rappresentazione. Se i campi si popolano allora il server
è riuscito a leggere correttamente gli oggetti spaziali contenuti nel database, altrimenti viene segnalato un
errore , il più frequente è :
The FeatureType '<FEATURE_NAME>' has a NULL extent. HINT: the dataset is empty or has no default
geometry attribute.
Questo errore può essere causato da una scorretta procedura di conversione per shapefile o dalla
mancanza di indici nelle tabelle, quasi sempre risiede nei dati spaziali contenuti nel database o nelle
proprietà ad essi associate.
Se al contrario non viene generato nessun errore possiamo avere immediatamente un riscontro grafico
andando nella homepage di configurazione e selezionando demo e poi map preview, a questo punto
avremo un elenco delle feature collegate al server e la possibilità di visualizzarle in vari formati, come
mappe OpenLayers (Zoomabili e scorrevoli ) , ma anche PDF o SVG .
Pagina 24
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Un esempio pratico
Supponiamo di voler realizzare un GIS per un comune del FVG, per poter dimostrare alcune delle
funzionalità di GeoServer andremo a creare un applicazione banale che tramite interfaccia web visualizza
alcuni dati del catasto come la corrispondenza delle particelle del catasto con i relativi proprietari, alcune
infrastrutture pubbliche come le strade e le immagini raster provenienti da telerilevamento.
Chiaramente questo esempio non vuole essere una base per uno sviluppo applicativo reale ma
semplicemente un esempio di come presentare delle funzionalità offerte dal pacchetto mediante dati
pseudo-reali. Segue che non sono oggetto di questo esempio problematiche complesse che si presentano
in casi reali quali l’acquisizione dei dati con le relativa precisione in termini di coordinate e in termini di
oggetti vettoriali che vengono anche essi referenziati nello spazio, piuttosto che modelli di basi di dati
sufficientemente ricchi da rappresentare una buona modellazione della realtà per un utilizzo reale.
Neppure si vuole offrire una proposta di approccio metodologico al problema della realizzazione di un GIS
reale, ma una semplice presentazione applicativa di alcune delle procedure da seguire e delle funzionalità
offerte dai pacchetti open source. Nel caso si debba implementare realmente un GIS occorrono delle
valutazioni e assunzioni su aspetti complessi che non sono nello scopo di questo esempio.
Per questo specifico esempio è stata scelta la porzione EST del comune di Lignano Sabbiadoro, che ha la
particolarità di essere delimitata su tre lati dal mare.
Requisiti
Si vuole realizzare un sistema che sia in grado di visualizzare un immagine del territorio in oggetto,
zoomabile e traslabile, che visualizzi le coordinate spaziali di ogni singolo punto del territorio, e che sia
possibile sovrapporre a questa immagine i confini dei terreni come risultano dai dati della particella riferita
al catasto oltre che i tracciati delle strade. Deve essere possibile selezionando un punto dei terreni
recuperare le informazioni riguardo al proprietario, l’edificabilità, la presenza di fabbricati sul terreno , e il
numero di particella. Selezionando invece un punto della strada si vuole recuperare il nome, numero di
corsie, larghezza in metri.
Modello Concettuale
Al livello superiore abbiamo l’entità comune che è composta da una collezione di oggetti spaziali ,
consideriamo come parte dell’entità comune, l’entità spaziale “strada” che può essere in overlap ad
esempio quando due strade si incrociano, e anche l’entità “terreno” che al contrario non può sovrapporsi .
Entrambe le entità hanno la chiave numerica SHAPE_ID e alcuni attributi, inoltre l’entità “terreno” è
associata alla relazione di possesso da parte del proprietario. Ovviamente tale relazione in questo schema
di esempio è impostata a 1:1 sul primo arco, ovvero ogni terreno ha un proprietario mentre lo stesso
proprietario può possedere più terreni, naturalmente nei casi reali un terreno può avere più proprietari e
qualche proprietario potrebbe non avere nessun terreno al momento. Così come si può notare che
normalmente le strade possono cambiare il numero di corsie a seconda del tratto, così pure per la
larghezza pur mantenendo lo stesso nome.
Pagina 25
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Schema Logico
Dallo schema sopra esposto cerchiamo di ricavare una soluzione per rappresentare il tutto in un database
reale.Per semplicità
tà optiamo per la creazione di sole due differenti tabelle una per il tipo di dato “terreno”
e l’altra per il tipo di dato “strada” , quindi il numero di righe della tabella terreni è pari al numero dei
terreni e i dati del proprietario verranno replicati in più righe nel caso una persona sia proprietaria
p
di più
terreni. In entrambe la tabelle si possono notare i campi GEOM che rappresentano la vera e propria
informazione spaziale, e i campi SHAPE_ID che sono invece le chiavi delle rispettive tabelle.
CREATE TABLE TERRENI (
SHAPE_ID
NUMBER(38)
PRIMARY KEY,
Particella
NUMBER,
Nome
VARCHAR2(16),
CF P.IVA
VARCHAR2(13),
Edificabile
VARCHAR2(10),
Fabbricato VARCHAR2(10),
Indirizzo
VARCHAR2(30),
GEOM
MDSYS.SDO_GEOMETRY);
CREATE TABLE STRADE (
SHAPE_ID
NUMBER(38)
PRIMARY KEY,
Nome
VARCHAR2(20),
Corsie
NUMBER,
Larghezza
NUMBER,
GEOM
MDSYS.SDO_GEOMETRY);
Pagina 26
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Elementi utilizzati
Per realizzare questa applicazione utilizziamo ovviamente GeoServer , un database spaziale in questo caso
Oracle Express Edition 10g e come client per rappresentare i dati un browser web che utilizza le librerie
OpenLayers. Il tutto installato su una stessa macchina che utilizza windows XP come sistema operativo.
Quindi a parte il sistema operativo della macchina il resto è tutto di libero utilizzo, fatte salve le limitazioni
che sono applicate alla versione express di Oracle.
GeoServer
1.5.4
Browser WEB + Librerie
javascript OpenLayers
SI
Database
Oracle XE
10g
Scelta di un sistema di riferimento spaziale SRS
Prima di iniziare occorre scegliere un sistema di riferimento per le coordinate che utilizzeremo , tale
sistema di coordinate permetterà di collocare correttamente tutti gli oggetti che verranno utilizzati nel
nostro esempio siano essi vettoriali come linee e punti, oppure anche immagini del territorio, quindi dati
tipo raster. Nel caso specifico dell’esempio si è scelto di utilizzare il sistema più diffuso di coordinate
spaziali, quello terrestre in gradi di latitudine e longitudine, nello specifico corrisponde all’ ID EPSG : 4326
basato sui dati WGS 84.
Creare un immagine georeferenziata, per il livello raster
Per realizzare un livello raster (chiamato coverage nell’ambito del server) è necessaria un immagine aerea
della zona che andiamo ad inserire, ma l’immagine nel puro formato grafico non può essere caricata sul
server, prima occorre georeferenziarla in un formato accettato da GeoServer. A tal proposito sono
supportati vari formati commerciali come ArcGrid, ma la scelta è caduta su un formato libero che può
essere ottenuto mediante l’immagine e un software che consente di georeferenziare un immagine
fornendo alcuni punti e le relative coordinate spaziali in gradi di latitudine e longitudine.
, inoltre l’immagine raster vera e propria è stata ottenuta mediante immagini più piccole catturate dal
server Google Earth dove la zona in oggetto era rappresentata con un livello di dettaglio buono rispetto ad
altre zone della regione.
Successivamente i vari frammenti sono stati ricomposti mediante software PaintShopPro per generare un
immagine unica che comprende il territorio oggetto di questo esempio.
Pagina 27
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Immagine non orientata con il nord verso l’alto.
A questo punto l’immagine ottenuta è priva di riferimenti spaziali ma anche priva di orientamento , c’è da
specificare che allo stato attuale le immagini possono essere georeferenziate sia quando esse sono
orientate con il nord verso l’alto aggiungendo un file di informazione che comprende informazioni su come
interpretare spazialmente i singoli pixel dell’immagine ( valori di scala e coordinate di partenza dei pixel) ,
oppure si può utilizzare anche un informazione in più che lascia l’immagine orientata in qualsiasi direzione
ma viene aggiunta l’informazione riguardo alla rotazione da effettuare per avere il nord verso l’alto.
In questo ultimo caso GeoServer non sembra supportare allo stato attuale la rotazione delle immagini,
perciò è stato necessario un programma di georeferenziazione che operasse anche una rotazione
dell’immagine in modo da posizionarla con il nord verso l’alto.
Per questa operazione è stato utilizzato il software Quantum GIS, che tra le varie funzioni ha anche la
possibilità di georeferenziare le immagini e ruotarle in modo da porre il nord verso l’alto.
A questo punto si sono presi in considerazione degli specifici punti nell’immagine dei quali si è ottenuto il
riferimento di latitudine e longitudine, sempre tramite le funzionalità offerte da Google Earth
Sicuramente questo procedimento ha introdotto degli errori che sono dovuti alla deformazione
dell’immagine e alla interpolazione che è stata sviluppata dal software per fondere le informazioni dei vari
punti di riferimento.
Il contenuto del file lignano.wld associato all’immagine lignano.tif che contiene tutti i dati necessari per la
georeferenziazione è il seguente :
0.000014577594452
0
0
-0.000014577594452
13.084252787449108
45.790244291824777
Creare degli shapefiles
Per realizzare delle forme geometriche vettoriali che hanno un rifermento nel sistema di coordinate
terrestri, il procedimento in se è simile al disegno di elementi grafici vettoriali con i numerosi pacchetti , in
questo caso visto che gli appezzamenti di terreno sono visibili dall’immagine del satellite e l’immagine è
Pagina 28
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
stata georeferenziata possiamo utilizzare tale immagine come sfondo e disegnarci sopra i nostri oggetti
vettoriali (poligoni, linee , punti) , eventualmente separandoli per tipologia in differenti layer che verranno
salvati con le coordinate corrispondenti.
Una funzionalità molto comoda è quella di poter associare durante l’inserimento dei dati vettoriali anche
dei campi non vettoriali tipo stringa, integer, o float che vengono associati agli oggetti visibili graficamente
in modo molto immediato. Per questo procedimento si può utilizzare ad esempio sia MapWindow che
Quantum GIS , entrambi hanno funzionalità simili per quanto riguarda le gestione sia dei raster che dei
layer vettoriali.
Ogni livello ha un tipo di dato predefinito, ad es. Punto , Linea, Poligono , ed ha delle proprietà che possono
essere cambiate anche successivamente all’inserimento degli oggetti.
Tali livelli layer corrisponderanno ad altrettanti shapefile che possono essere utilizzati come tali oppure,
convertiti e caricati su un database spaziale . In questo esempio sono stati convertiti tramite shp2sdo e
caricati su database Oracle Express Edition.
Ecco nella foto sottostante i terreni etichettati con il loro numero di particella, le strade rappresentate
come linee spezzate e il tutto sovrapposto all’immagine raster del territorio sottostante, in questo caso il
nord è già impostato verso l’alto. Tramite lo stesso software è possibile aggiungere attributi associati alle
forme geometriche ed eventualmente inserire anche dei valori.
Pagina 29
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Pagina 30
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Convertire gli shapefile e caricarli sul DB Oracle
A questo punto ottenuti gli shapefile terreni e strade non rimane che convertirli tramite l’utility
shp2sdo.exe e in uscita avremo un file con le istruzioni per creare la tabella che ospiterà i dati più un file
che contiene i dati che verranno caricati, ecco il file terreni.sql :
-- terreni.sql
--- This script creates the spatial table.
--- Execute this script before attempting to use SQL*Loader
-- to load the terreni.ctl file.
--- This script will also populate the USER_SDO_GEOM_METADATA table.
-- Loading the .ctl file will populate the TERRENI table.
--- To load the .ctl file, run SQL*Loader as follows
-- substituting appropriate values:
-sqlldr username/password terreni.ctl
--- After the data is loaded in the TERRENI table, you should
-- migrate polygon data and create the spatial index
--- Creation Date : Mon Dec 03 20:13:08 2007
-- Copyright 1999, 2004 Oracle Corporation
-- All rights reserved
-DROP TABLE TERRENI;
CREATE TABLE TERRENI (
SHAPE_ID
NUMBER(38)
PRIMARY KEY,
Particella
NUMBER,
Nome
VARCHAR2(16),
CF_P_IVA
VARCHAR2(13),
Edificabile
VARCHAR2(10),
Fabbricato VARCHAR2(10),
Indirizzo
VARCHAR2(30),
GEOM
MDSYS.SDO_GEOMETRY);
DELETE FROM USER_SDO_GEOM_METADATA
WHERE TABLE_NAME = 'TERRENI' AND COLUMN_NAME = 'GEOM' ;
INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)
VALUES ('TERRENI', 'GEOM',
MDSYS.SDO_DIM_ARRAY
(MDSYS.SDO_DIM_ELEMENT('X', 13.139379662, 13.151123667, 0.000000050),
MDSYS.SDO_DIM_ELEMENT('Y', 45.685847731, 45.698387437, 0.000000050)
),
NULL);
COMMIT;
Ed il file strade.sql:
-- strade.sql
--- This script creates the spatial table.
--- Execute this script before attempting to use SQL*Loader
Pagina 31
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
-- to load the strade.ctl file.
--- This script will also populate the USER_SDO_GEOM_METADATA table.
-- Loading the .ctl file will populate the STRADE table.
--- To load the .ctl file, run SQL*Loader as follows
-- substituting appropriate values:
-sqlldr username/password strade.ctl
--- After the data is loaded in the STRADE table, you should
-- migrate polygon data and create the spatial index
--- Creation Date : Mon Dec 03 20:12:24 2007
-- Copyright 1999, 2004 Oracle Corporation
-- All rights reserved
-DROP TABLE STRADE;
CREATE TABLE STRADE (
SHAPE_ID
NUMBER(38)
PRIMARY KEY,
Nome
VARCHAR2(20),
Corsie
NUMBER,
Larghezza
NUMBER,
GEOM
MDSYS.SDO_GEOMETRY);
DELETE FROM USER_SDO_GEOM_METADATA
WHERE TABLE_NAME = 'STRADE' AND COLUMN_NAME = 'GEOM' ;
INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)
VALUES ('STRADE', 'GEOM',
MDSYS.SDO_DIM_ARRAY
(MDSYS.SDO_DIM_ELEMENT('X', 13.135910673, 13.148466720, 0.000000050),
MDSYS.SDO_DIM_ELEMENT('Y', 45.683935230, 45.697081945, 0.000000050)
),
NULL);
COMMIT;
A questo punto possiamo lanciare questi due file di comando sql per generare le tabelle che ospiteranno i
dati spaziali e non.
A questo punto prima di procedere con il comando sqlldr occorre tassativamente cambiare settaggio per il
sparatore dei decimali se il sistema windows che si sta usando non è impostato sull’americano:
c:> SET NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
Ora è possibile caricare i dati, altrimenti verrebbe generato un file di errore perché i valori con decimali non
vengono correttamente riconosciuti e la tabella resterebbe vuota.
Come è altrettanto indispensabile eseguire il comando (valido per Oracle 9i o successivi) per poter accedere
ai tipi di dato poligoni :
EXECUTE SDO_MIGRATE.TO_CURRENT('TERRENI','GEOM');
Per ogni tabella di Oracle che contiene i dati spaziali occorre definire un indice spaziale, altrimenti
nonostante il caricamento di dati avvenga quando viene eseguita una richiesta non viene recuperata
nessuna feature. Per creare l’indice spaziale:
Pagina 32
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
CREATE INDEX TERRENI_IDX
ON TERRENI(GEOM)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
A questo punto i dati sono pronti per essere utilizzati da GeoServer.
Caricamento dell’immagine raster
Una volta ultimato è il caricamento dei dati è necessario configurare GeoServer perché possa utilizzare tali
dati, la prima cosa da fare è creare un namespace per evitare conflitti con settaggi relativi alle demo
installate assieme al server. Nell’esempio si utilizzerà il namespace lignano con il URI settato a localhost.
A questo punto copiamo l’immagine georeferenziata con il world file associato nella directory
geoserver/datadir/coverages/lignano e seguiamo la procedura per l’aggiunta di un nuovo coverage, si
seleziona “A raster file accompanied by a spatial data file”.
Successivamente si forniscono il tipo ed il percorso del file raster, come di consueto il file spaziale deve
differire solo per l’estensione.
L’ultimo passo richiede di inserire le coordinate di riferimento, ma di solito vengono recuperate in
automatico :
Pagina 33
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Se non vengono segnalati errori possiamo selezionare Apply e Save in alto a sx, e l’immagine
georeferenziata sarà visibile nella pagina demo del server.
Configurazione di GeoServer per l’utilizzo dei dati del DB Oracle
Per questa fase è sufficiente seguire la procedura descritta in precedenza per collegare un database, quindi
creare un nuovo datastore associato al namespace lignano per ognuna delle due tabelle “STRADE” e
“TERRENI”.
Successivamente due nuove featuretype con due stili associati, uno tipo poligono per i terreni e l’altro tipo
linea per le strade.
Creazione di un client mediante l’utilizzo di OpenLayers
Una volta settato correttamente il server si può accedere ai servizi offerti tramite interfaccia web, per
questo scopo ci viene in aiuto la libreria javascript OpenLayers .
Tramite questa libreria, realizzata per supportare le più comuni funzioni di gestione mappe, si possono
visualizzare, modificare e perfino eseguire interrogazioni sui dati gestiti dal server.
La libreria può essere prelevata in remoto sul sito openlayers.org oppure semplicemente si utilizza la copia
installata in locale assieme a GeoServer .
Per avere rapidamente un po’ di codice HTML che ci illustri come utilizzare la libreria possiamo aprire la
pagina demo e visualizzare il codice delle pagine che vengono generate.
<?xml version="1.0" encoding="utf-8"?>
Pagina 34
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>OpenLayers map preview</title>
<style type="text/css">
#map {
width: 600px;
height: 550px;
border: 1px solid black;
}
</style>
<script src="http://localhost:8080/geoserver/openlayers/OpenLayers.js" type="text/javascript">
</script>
<script defer="defer" type="text/javascript">
var map;
var untiled;
var untiled2;
var untiled3;
var tiled;
function setHTML(response) {
OpenLayers.Util.getElement('nodelist').innerHTML = response.responseText;
};
function init(){
map = new OpenLayers.Map('map', {controls:[], 'projection': 'EPSG:4326', 'units':'degrees'});
OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
// setup untiled layer
// untiled corrisponde al livello raster
untiled = new OpenLayers.Layer.WMS.Untiled(
"lignano:lignano", "http://localhost:8080/geoserver/wms",
{
height: '750',
width: '800',
layers: 'lignano:lignano',
styles: '',
srs: 'EPSG:4326',
format: 'image/png'
},
{maxExtent: bounds, maxResolution: 1.1357243322099309E-4, projection: "EPSG:4326"}
);
untiled.ratio=1;
untiled.setVisibility(true, true);
// viene aggiunto
map.addLayer(untiled);
// untiled2 corrisponde al livello dei poligoni terreno
untiled2 = new OpenLayers.Layer.WMS.Untiled(
"lignano:TERRENI", "http://localhost:8080/geoserver/wms",
{
Pagina 35
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
height: '750',
width: '800',
layers: 'lignano:TERRENI',
transparent:'true',
styles: '',
srs: 'EPSG:4326',
format: 'image/png'
},
{maxExtent: bounds, maxResolution: 1.1357243322099309E-4, projection: "EPSG:4326"}
);
untiled2.ratio=1;
untiled2.setVisibility(false, false);
untiled2.setIsBaseLayer(false);
map.addLayer(untiled2);
// untiled 3 corrisponde al livello delle linee strade
untiled3 = new OpenLayers.Layer.WMS.Untiled(
"lignano:STRADE", "http://localhost:8080/geoserver/wms",
{
height: '750',
width: '800',
layers: 'lignano:STRADE',
transparent:'true',
styles: '',
srs: 'EPSG:4326',
format: 'image/png'
},
{maxExtent: bounds, maxResolution: 1.1357243322099309E-4, projection: "EPSG:4326"}
);
untiled3.ratio=1;
untiled3.setVisibility(false, false);
untiled3.setIsBaseLayer(false);
map.addLayer(untiled3);
// setup controls and initial zooms
map.addControl(new OpenLayers.Control.PanZoomBar({div:$('nav')}));
map.addControl(new OpenLayers.Control.MouseDefaults());
map.addControl(new OpenLayers.Control.Scale($('scale')));
map.addControl(new OpenLayers.Control.MousePosition({element: $('position')}));
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.OverviewMap());
map.zoomToExtent(bounds);
// support GetFeatureInfo
map.events.register('click', map, function (e) {
OpenLayers.Util.getElement('nodelist').innerHTML = "Caricamento... attendere...";
// Interrogazione sul layer TERRENI
var url = map.layers[1].getFullRequestString({
REQUEST: "GetFeatureInfo",
EXCEPTIONS: "application/vnd.ogc.se_xml",
BBOX: map.getExtent().toBBOX(),
X: e.xy.x,
Y: e.xy.y,
Pagina 36
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
INFO_FORMAT: 'text/html',
QUERY_LAYERS: map.layers[1].params.LAYERS,
FEATURE_COUNT: 50,
layers: 'lignano:TERRENI,lignano:STRADE',
styles: '',
srs: 'EPSG:4326',
WIDTH: map.size.w,
HEIGHT: map.size.h},
"http://localhost:8080/geoserver/wms"
);
OpenLayers.loadURL(url, '', this, setHTML,setHTML);
// Interrogazione sul layer STRADE
var url = map.layers[2].getFullRequestString({
REQUEST: "GetFeatureInfo",
EXCEPTIONS: "application/vnd.ogc.se_xml",
BBOX: map.getExtent().toBBOX(),
X: e.xy.x,
Y: e.xy.y,
INFO_FORMAT: 'text/html',
QUERY_LAYERS: map.layers[2].params.LAYERS,
FEATURE_COUNT: 50,
layers: 'lignano:TERRENI,lignano:STRADE',
styles: '',
srs: 'EPSG:4326',
WIDTH: map.size.w,
HEIGHT: map.size.h},
"http://localhost:8080/geoserver/wms"
);
OpenLayers.loadURL(url, '', this, setHTML,setHTML);
OpenLayers.Util.getElement('nodelist').innerHTML = "Caricamento... attendere.";
Event.stop(e);
});
}
</script>
</head>
<body onload="init()">
<table>
<tr>
<td style="width:40px" valign="middle">&nbsp;</td>
<td colspan="3" align="right"><!-- Switch layers when links are pressed -->
<a id="untiledLink" href="#" onclick="map.removeLayer(tiled);map.addLayer(untiled)">Untiled</a> <a
id="tiledLink" href="#" onclick="map.removeLayer(untiled);map.addLayer(tiled);">Tiled</a> </td>
</tr>
<tr>
<td style="width:40px" valign="middle">&nbsp;</td>
<td colspan="3"><div id="map"></div></td>
</tr>
<tr>
<td style="width:40px" valign="middle"><div id="nav"></div></td>
<td><div id="scale"></div></td>
Pagina 37
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
<td/></td>
<td align="right"><div id="position"></div></td>
</tr>
<tr>
<td style="width:40px" valign="middle">&nbsp;</td>
<th>&nbsp;</th>
<td/></td>
<td align="right">&nbsp;</td>
</tr>
</table>
<div id="nodelist">Click on the map to get feature infos</div>
</body>
</html>
A questo punto otteniamo nella finestra del browser una mappa che è possibile zoomare, trascinare con il
mouse. Inoltre a destra possiamo notare due ulteriori controlli, uno per selezionare i layer da sovrapporre
all’immagine raster, e l’altro che presenta una vista di insieme e la posizione della finestra attualmente
visualizzata. Inoltre in basso a destra si possono notare le coordinate spaziali (del sistema di riferimento
scelto) del puntatore del mouse in ogni istante.
Facendo click con il mouse sopra un qualsiasi punto della mappa viene lanciata una richiesta di
interrogazione al server che richiede quali sono gli oggetti geometrici che intersecano il punto indicato dal
cursore sulla mappa. In realtà l’intersezione viene valutata su un poligono attorno al punto ricavato dalla
posizione del mouse, altrimenti utilizzando solo un punto sarebbe molto difficile selezionare le strade.
Se la richiesta individua uno o più oggetti geometrici vengono riportati il nome della tabella e tutti i valori
contenuti nei campi associati all’oggetto geometrico.
Alcune funzionalità cambiano da browser a browser, per esempio Explorer 6.0 non supporta i livelli di
trasparenza nei png, mentre il Firefox non gestisce connessioni distinte per ogni layer.
Explorer 7 sembra il Browser che crea meno problemi di gestione delle funzionalità. Ecco un immagine del
risultato finale:
Pagina 38
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Pagina 39
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Glossario
CITE
Compliance & Interoperability Testing & Evaluation, Un iniziativa del OGC per testare la conformità
alle specifiche del consorzio e in particolar modo l’interoperabilità. Se superati i processi di testing,
il software può utilizzare il logo che ne garantisce la conformità :
Coverage
Sono dei dati raster, in altre parole un immagine o un set di immagini.
Coverage Store
Il luogo dove GeoServer immagazzina i dati raster, di solito una directory.
CRS
coordinate reference system
Datastore
Una fonte di dati spaziali, può essere un file o un insieme di files o una connessione a un database
(ev. remoto)
EPSG
European Petroleum Survey Group, comunità scientifica che ha messo a punto l’ EPSG Geodetic
Parameter Set
GML
Geographical Markup Language, tipo di documento in formato XML che rappresenta informazione
geografica.
OGC
Open Geospatial Consortium , la principale organizzazione che gestisce gli standard nel panorama
geospaziale, simile al più famoso W3C per il web ma focalizzato sulle applicazioni geospaziali. Le
due principali specifiche sono il WFS e il WMS, e GeoServer rappresenta un implementazione di
riferimento sia del WFS che del WMS.
JDK
Java Development Kit , tool free di sviluppo applicazioni java scaricabile dal sito www.java.com
KML
È un formato di file per visualizzare dati geografici in un Earth browser, come Google Earth, Google
Maps, e Google Maps for mobile. KML utilizza una struttura basata sui tag con elementi annidati e
attributi ed è basata sullo standard XML .
OWS
OGC Web Services Shapefile
SHP
Lo Shapefile ESRI è un popolare formato vettoriale per sistemi informativi geografici.
Il formato è stato sviluppato e regolato da ESRI ed emesso come (quasi) Open Source, allo scopo di
accrescere l'interoperabilità fra i sistemi ESRI e altri GIS. Di fatto è diventato uno standard per il
dato vettoriale spaziale, e viene usato da una grande varietà di sistemi GIS.
Con "shapefile" si indica di norma un insieme di file con estensione .shp, .dbf, .shx, altre che hanno
in comune il prefisso dei nomi (per es. "laghi.*"). Spesso con shapefile si indica però solo i file
".shp". Tuttavia questo file da solo è incompleto poiché interpretazione ed utilizzo dipendono
dagli altri file.
Gli shapefile descrivono spazialmente punti, poligoni, polilinee utilizzabili, ad es., per rappresentare
stagni, laghi e fiumi, rispettivamente. A ciascun elemento possono essere associati ulteriori attributi
che descrivono le voci (ad es. nome o temperatura).
Pagina 40
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
SRID
Spatial Reference IDentifier, specifica il sistema di coordinate spaziali per un sistema GIS.
WCS
Web Coverage Service, supporta l’interscambio di dati geospaziali come "coverages" che
contengono valori o proprietà di dati geospaziali. Diversamente dal Web Map Service, che ritorna
mappe statiche (renderizzate dal lato server come immagini), il Web Coverage Service fornisce
l’accesso alle informazioni spaziali intatte (unrendered), come necessarie per un client-side
rendering, multi-valued coverages, e come ingressi nei modelli scientifici e altri clients oltre i
semplici visualizzatori. Il Web Coverage Service composto da tre operazioni: GetCapabilities ritorna
la descrizione del servizio con elementi che descrivono le collezioni di elementi multidimensionali
richiesti; GetCoverage ritorna valori o proprietà di una zona geografica, impacchettati in un formato
bben noto di coverage; DescribeCoverageType ritorna u a descrizione della struttura dei coverages
che il WCS restituisce.
WFS
Web Feature Service ,un WFS permette l’accesso alle features archiviate sul server. Utilizzare un
WFS quando si vuole effettuare operazioni come queste:
•
•
•
•
•
•
esecuzione di query su un dataset e recupero delle features
recupero delle definizioni delle feature (feature's property names and types)
aggiunta di features al dataset
cancellazione di feature dal dataset
update feature in un dataset
lock delle features per impedirne la modifica
Quali sono le differenze tra WFS-T e WFS
un WFS-T ("WFS-Transactional") è un WFS che supporta le transazioni - add, delete,
o update delle features.
Il Web Feature Service (WFS) è praticamente una delle principali specifiche dell’ OGC. Fornisce un
metodo generico per accedere ai dati geografici in formato “raw” attraverso il web. All’utente
generico può fornire una varietà di informazioni incorporate nelle mappe a visualizzare. Parte delle
specifiche WMS cercano di implementare questa funzionalità,ma utilizzando un WFS si ottiene un
maggior controllo sui metodi di accesso ai dati. I Complex Filters funzionano come l’ equivalente in
OWS dello statement SQL WHERE, permettendo ad esempio di selezionare tutte le strade che
hanno più di Quattro corsie , sono lunghe più di 2 km e il cui nome inizia per D.
Un altra funzione interessante è la gestione delle transazioni, con la possibilità di inserire,
aggiornare e cancellare delle feature su una mappa. L’esempio GeoServer UserMap è proprio un
applicazione di questo concetto, gli utenti possono zoomare e selezionare’Add User' su uno
specifico punto, e verrà inserito nel backend database. I meccanismi di locking aggiungono un
controllo sulle transazioni, in modo che gli utenti non sovrascrivano quello che gli altri utenti
stanno modificando.
In breve, WFS porta ad una maggiore trasparenza ed apertura delle applicazioni che manipolano
mappe. Invece di offrire semplicemente la vista dell’immagine della mappa, come il fornitore dei
dati decide preventivamente, la grande innovazione è che è l’utente a decidere come e quanta
informazione visualizzare. I dati possono essere scaricati e analizzati successivamente, oppure
integrati con altri dati, o possono essere utilizzati in cascata con altri web services per realizzare
altre soluzioni su web. La possibilità di gestire le transazioni permette ad utenti diversi di lavorare
ad uno stesso progetto attraverso internet. Non sono più necessari per gli utenti i privilegi di
accesso al database geospaziale, essi possono usare l’interfaccia standard WFS-T. Mediante questo
Pagina 41
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
sistema è possibile gestire soluzioni aperte per I geo-dati, simili a quanto già accade per lo sviluppo
di codice open-source attraverso internet.
WMS
Web Map Service, visualizza dati geografici come immagini raster (mappe) , dalla versione 1.1.0
GeoServer integra il supporto per il Web Map Service, questo permette agli utenti di visualizzare i
dati sia come GML ( attraverso WFS) sia tramite immagini (tramite WMS) .
Pagina 42
Introduzione a GeoServer
Corso di Basi di Dati Spaziali
Bibliografia
Sito ufficiale GeoServer :
http://www.geoserver.org
Dove è possibile scaricare il pacchetto applicativo GeoServer e consultare specifiche e
manuali
Sito ufficiale OGC :
http://www.opengeospatial.org
Sito ufficiale GeoTools:
http://www.geotools.org
Sono le librerie utilizzate per lo sviluppo di geoserver
Sito ufficiale OpenLayers:
http://www.openlayers.org
Sito OpenSourceGis:
http://opensourcegis.org
Sono contenuti numerosi Link ad applicazioni, librerie, utility per il mondo GIS.
Sito MapWindow GIS:
http://www.mapwindow.org
Il programma MapWindow GIS offre numerose funzionalità per la gestione delle immagini
raster, vettoriali e delle sorgenti di dati che vengono poi utilizzate all’interno dei GIS.
Pagina 43