Introduzione a GeoServer Corso di Basi di Dati Spaziali



Documenti analoghi
Arch. Claudio Schifani 1

Corso di Basi di Dati Spaziali. WebGIS e GeoServer. Tipologie di WebGIS. Vantaggi e Svantaggi. Geography Markup Language (GML) Standard

Per chi ha la Virtual Machine: avviare Grass da terminale, andando su Applicazioni Accessori Terminale e scrivere grass

Manuale d uso Software di parcellazione per commercialisti Ver [05/01/2015]

Guida alla consultazione dei WMS

WebGis Comune di Novara

GEOPORTALE Arpa Piemonte Sistema Informativo Ambientale Geografico

GEOPORTALE Arpa Piemonte

FPf per Windows 3.1. Guida all uso

Introduzione a Quantum GIS (QGIS) - passaggio dal software ArcView 3.x a software GIS OpenSource

Registratori di Cassa

Componenti di un GIS 30/11/2009. Un GIS non è solamente un DB spaziale

Come modificare la propria Home Page e gli elementi correlati

PORTALE CLIENTI Manuale utente

Istruzioni di installazione di IBM SPSS Modeler Text Analytics (licenza per sito)

11/02/2015 MANUALE DI INSTALLAZIONE DELL APPLICAZIONE DESKTOP TELEMATICO VERSIONE 1.0

e/fiscali - Rel e/fiscali Installazione

Banca dati Professioniste in rete per le P.A. Guida all uso per le Professioniste

MANUALE PARCELLA FACILE PLUS INDICE

Airone Gestione Rifiuti Funzioni di Esportazione e Importazione

SOMMARIO... 3 INTRODUZIONE...

WEBGIS 1.0. Guida per l utente

Il web server Apache Lezione n. 3. Introduzione

GUIDA UTENTE PRIMA NOTA SEMPLICE

Integrazione InfiniteCRM - MailUp

Modulo. Programmiamo in Pascal. Unità didattiche COSA IMPAREREMO...

Scuola Digitale. Manuale utente. Copyright 2014, Axios Italia

Application Server per sviluppare applicazioni Java Enterprise

I MODULI Q.A.T. PANORAMICA. La soluzione modulare di gestione del Sistema Qualità Aziendale

Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise

Mac Application Manager 1.3 (SOLO PER TIGER)

Sistema operativo. Sommario. Sistema operativo...1 Browser...1. Convenzioni adottate

Manuale Utente Amministrazione Trasparente GA

OSSIF WEB. Manuale query builder

BMSO1001. Virtual Configurator. Istruzioni d uso 02/10-01 PC

Guida Migrazione Posta Operazioni da effettuare entro il 15 gennaio 2012

Manuale Utente Albo Pretorio GA

Servizi Remoti. Servizi Remoti. TeamPortal Servizi Remoti

DINAMIC: gestione assistenza tecnica

SOFTWARE. Aprendo il SW la prima schermata che appare è la seguente:

19. LA PROGRAMMAZIONE LATO SERVER

Il sofware è inoltre completato da una funzione di calendario che consente di impostare in modo semplice ed intuitivo i vari appuntamenti.

Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)

MANUALEDIUTILIZZO MODULO CRM POSTVENDITA

Guida alla registrazione on-line di un DataLogger

TERMINALE. Creazione e gestione di una postazione terminale di Eureka

SOSEBI PAPERMAP2 MODULO WEB MANUALE DELL UTENTE

Direzione Centrale per le Politiche dell Immigrazione e dell Asilo

FISH Sardegna ONLUS. Manuale Utente.

File, Modifica, Visualizza, Strumenti, Messaggio

Manuale per la configurazione di AziendaSoft in rete

Guida all uso di Java Diagrammi ER

Il menu File contiene tutti i comandi relativi alle seguenti operazioni:

Il calendario di Windows Vista

INSTALLAZIONE NUOVO CLIENT TUTTOTEL (04 Novembre 2014)

ImporterONE Export Plugin Magento

MICHELANGELO Piattaforma autorizzativa per la gestione di interventi riservata ai fornitori

FAQ DI INSTALLAZIONE DI INAZIENDA Rev.2

Istruzioni di installazione di IBM SPSS Modeler Text Analytics (utente singolo)

L amministratore di dominio

MANUALE D'USO DEL PROGRAMMA IMMOBIPHONE

Libero Emergency PC. Sommario

Guida all installazione di Easy

Utilizzo dei geoservizi in QGIS

Manuale Operativo per l utilizzo della piattaforma E-Learning@AQ. Versione 1.1

Manuale servizio Webmail. Introduzione alle Webmail...2 Webmail classica (SquirrelMail)...3 Webmail nuova (RoundCube)...8

ELENCO CLIENTI FORNITORI Patch1

COMUNICAZIONE UTENTI SISTEMI-PROFIS INSTALLAZIONE GE.RI.CO e PARAMETRI2015

Esercizio data base "Biblioteca"

Guida alla registrazione on-line di un NovaSun Log

ATOLLO BACKUP GUIDA INSTALLAZIONE E CONFIGURAZIONE

CONTENT MANAGEMENT SY STEM

MArine Coastal Information SysTEm

Database 1 biblioteca universitaria. Testo del quesito

GUIDA ALL ACCESSO DEI WEB SERVICE. MEDIANTE Autocad Map 3D

La gestione documentale con il programma Filenet ed il suo utilizzo tramite la tecnologia.net. di Emanuele Mattei (emanuele.mattei[at] .

GUIDA UTENTE MONEY TRANSFER MANAGER

Indice generale. Il BACK-END...3 COME CONFIGURARE JOOMLA...4 Sito...4 Locale...5 Contenuti...5

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

LA GESTIONE DELLE VISITE CLIENTI VIA WEB

Database e reti. Piero Gallo Pasquale Sirsi

Guida all'uso del CMS (Content Management System, Sistema di Gestione dei Contenuti)

Capitolo 1 Installazione del programma

NOTE OPERATIVE. Prodotto Inaz Download Manager. Release 1.3.0

developed by Emanuele De Carlo

ISTRUZIONI AGGIORNAMENTO TARIFFARIO 2006

Progetto di Ingegneria del Software 2. SWIMv2

Il CMS Moka. Giovanni Ciardi Regione Emilia Romagna

ARCHIVIA PLUS VERSIONE SQL SERVER

Progetto SOLE Sanità OnLinE

SITI-Reports. Progetto SITI. Manuale Utente. SITI-Reports. ABACO S.r.l.

Gestione Filtri. InfoBusiness 2.8 Gestione Filtri Pag. 1/ 11

MANUALE D USO DEL SOFTWARE APPLICATIVO ADB-TOOLBOX (VERSIONE 1.7 E SUPERIORI) UTILIZZO DEI SERVIZI WMS-WFS-WCS E DEL CATALOGO CSW

Fattura Facile. In questo menù sono raggruppati, per tipologia, tutti i comandi che permettono di gestire la manutenzione degli archivi.

Wordpress. Acquistare un sito web. Colleghiamoci con il sito

2.1 Installazione e configurazione LMS [4]

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

PIANO DI TUTELA DELLE ACQUE DELLA SICILIA (di cui all'art. 121 del Decreto Legislativo 3 aprile 2006, n 152)

Transcript:

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

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

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

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

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

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

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

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 Descrizione Estensione del file ArcGrid Arc Grid Coverage Format.asc WorldImage File raster unito a un file di dati spaziali.png ImageMosaic Image mosaicking plugin.shp ImagePyramid Image pyramidal plugin pyramid.properties GeoTIFF Tagged Image File Format con Inform. Geografica.tiff Gtopo30 Gtopo30 Coverage Format.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

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

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

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

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

</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

<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

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

</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 nargs="1">abs</ogc:function_name> <ogc:function_name nargs="1">abs_2</ogc:function_name> <ogc:function_name nargs="1">abs_3</ogc:function_name> <ogc:function_name nargs="1">abs_4</ogc:function_name> <ogc:function_name nargs="1">acos</ogc:function_name> <ogc:function_name nargs="1">area</ogc:function_name> <ogc:function_name nargs="1">asin</ogc:function_name> <ogc:function_name nargs="1">atan</ogc:function_name> <ogc:function_name nargs="2">atan2</ogc:function_name> <ogc:function_name nargs="3">between</ogc:function_name> Pagina 16

<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

<ogc:function_name nargs="9">in8</ogc:function_name> <ogc:function_name nargs="10">in9</ogc:function_name> <ogc:function_name nargs="1">int2bbool</ogc:function_name> <ogc:function_name nargs="1">int2ddouble</ogc:function_name> <ogc:function_name nargs="1">interiorpoint</ogc:function_name> <ogc:function_name nargs="2">interiorringn</ogc:function_name> <ogc:function_name nargs="2">intersection</ogc:function_name> <ogc:function_name nargs="2">intersects</ogc:function_name> <ogc:function_name nargs="1">isclosed</ogc:function_name> <ogc:function_name nargs="1">isempty</ogc:function_name> <ogc:function_name nargs="2">islike</ogc:function_name> <ogc:function_name nargs="1">isnull</ogc:function_name> <ogc:function_name nargs="1">isring</ogc:function_name> <ogc:function_name nargs="1">issimple</ogc:function_name> <ogc:function_name nargs="1">isvalid</ogc:function_name> <ogc:function_name nargs="3">iswithindistance</ogc:function_name> <ogc:function_name nargs="1">length</ogc:function_name> <ogc:function_name nargs="2">lessequalthan</ogc:function_name> <ogc:function_name nargs="2">lessthan</ogc:function_name> <ogc:function_name nargs="1">log</ogc:function_name> <ogc:function_name nargs="2">max</ogc:function_name> <ogc:function_name nargs="2">max_2</ogc:function_name> <ogc:function_name nargs="2">max_3</ogc:function_name> <ogc:function_name nargs="2">max_4</ogc:function_name> <ogc:function_name nargs="2">min</ogc:function_name> <ogc:function_name nargs="2">min_2</ogc:function_name> <ogc:function_name nargs="2">min_3</ogc:function_name> <ogc:function_name nargs="2">min_4</ogc:function_name> <ogc:function_name nargs="1">not</ogc:function_name> <ogc:function_name nargs="2">notequalto</ogc:function_name> <ogc:function_name nargs="1">numgeometries</ogc:function_name> <ogc:function_name nargs="1">numinteriorring</ogc:function_name> <ogc:function_name nargs="1">numpoints</ogc:function_name> <ogc:function_name nargs="2">overlaps</ogc:function_name> <ogc:function_name nargs="1">parseboolean</ogc:function_name> <ogc:function_name nargs="1">parsedouble</ogc:function_name> <ogc:function_name nargs="1">parseint</ogc:function_name> <ogc:function_name nargs="2">pointn</ogc:function_name> <ogc:function_name nargs="2">pow</ogc:function_name> <ogc:function_name nargs="1">propertyexists</ogc:function_name> <ogc:function_name nargs="2">quantile</ogc:function_name> <ogc:function_name nargs="0">random</ogc:function_name> <ogc:function_name nargs="2">relate</ogc:function_name> <ogc:function_name nargs="3">relatepattern</ogc:function_name> <ogc:function_name nargs="1">rint</ogc:function_name> <ogc:function_name nargs="1">round</ogc:function_name> <ogc:function_name nargs="1">round_2</ogc:function_name> <ogc:function_name nargs="1">rounddouble</ogc:function_name> <ogc:function_name nargs="1">sin</ogc:function_name> <ogc:function_name nargs="1">sqrt</ogc:function_name> <ogc:function_name nargs="2">standarddeviation</ogc:function_name> <ogc:function_name nargs="1">startpoint</ogc:function_name> <ogc:function_name nargs="2">strconcat</ogc:function_name> Pagina 18

<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

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

Caricamento dei dati spaziali su Oracle Introduzione a GeoServer 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.) The Questo comando esegue dei fix rispetto ai dati geometrici contenuti nella tabella di nome STATES su geometry SDO_GTYPES FeatureType attribute. '<FEATURE_NAME>' AME>' has a NULL extent. HINT: the dataset is empty or has no default 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 : 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

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

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

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 The feature presenti nel database. geometry A FeatureType questo attribute. '<FEATURE_NAME>' has a NULL extent. HINT: the dataset is empty or has no default 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 è : 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

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

Schema Logico Dallo schema sopra esposto cerchiamo di ricavare una soluzione per rappresentare il tutto in un database reale.per semplicità 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 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

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. Browser WEB + Librerie javascript OpenLayers SI GeoServer 1.5.4 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

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

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

Pagina 30

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

-- 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 EXECUTE SDO_MIGRATE.TO_CURRENT('TERRENI','GEOM'); 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 : 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

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