Indice Indice....................................................................................................................................................i Introduzione.........................................................................................................................................1 1. Analisi dei Requisiti.........................................................................................................................3 1.1 Distretti Venatori........................................................................................................................3 1.2 Riserve di Caccia........................................................................................................................5 1.3 Azienda faunistico-venatoria .....................................................................................................5 1.4 Azienda agri-turistico-venatoria.................................................................................................6 1.5 Zone cinofile .........................................................................................................................6 2. Progettazione Concettuale................................................................................................................7 3. Progettazione Logica......................................................................................................................19 4. Creazione ed Istanziazione della BD Oracle..................................................................................24 5. Visualizzazione dei dati con GeoServer.........................................................................................28 1.6 Alcune Implementazioni..........................................................................................................28 30 Bibliografia........................................................................................................................................42 i ii Introduzione Lo scopo di questo laboratorio è quello di progettare e modellare un sistema informativo informatizzato per la gestione venatoria della Regione Friuli Venezia Giulia. Un sistema informativo ha la capacità di raccogliere, elaborare e archiviare dati, per produrre e distribuire informazioni a tutti gli utenti che ne hanno bisogno. La gestione venatoria è l’insieme di tutte quelle attività necessarie all’attuazione di un prelievo venatorio programmato e funzionale con lo scopo di conseguire gli obiettivi stabiliti dal Piano Faunistico Regionale. Il Piano Faunistico Regionale si occupa della tutela, della conservazione e della riproduzione della fauna selvatica e anche della gestione del patrimonio faunistico e della gestione venatoria. Per realizzare questo sistema informativo, è necessario considerare le seguenti tre fasi. La prima fase si compone in: • analisi e raccolta dei requisiti; • progettazione concettuale; • progettazione logica; L’analisi e la raccolta dei requisiti identificherà tutte le peculiarità e caratteristiche che l’utente si aspetta quando interagirà con il sistema. La progettazione concettuale costruirà, a partire dai requisiti individuati, uno schema concettuale. Di solito, il modello utilizzato per costruire uno schema concettuale è il modello ER. Poiché il problema preso in esame usa componenti spaziali, noi utilizzeremo un modello spaziale come il modello CGG [4], un’estensione spaziale (temporale) del modello ER. La progettazione logica costruirà uno schema a partire dallo schema prodotto durante la progettazione concettuale. A causa della presenza di componenti spaziali, il classico modello relazionale verrà esteso con l’inserimento di oggetti spaziali. La progettazione concettuale e logica saranno implementate utilizzando il tool ChronoGeoGraph. Tale tool permette di costruire schemi CGG [4] e, allo stesso tempo, possiede tutte le funzionalità necessarie per la loro traduzione in schemi logici basati sul modello di Oracle. La seconda fase consiste nell’implementare lo schema su un DBMS, nel nostro caso Oracle, e successivamente, popolare le tabelle con i vari dati acquisiti nella prima fase. 1 La terza fase sarà quella della visualizzazione e per fare ciò utilizzeremo la tecnologia GeoServer[7]. GeoServer[7] è un server che ci permette di visualizzare, inserire e modificare oggetti geografici tramite una semplice interfaccia web. 2 1. Analisi dei Requisiti La Regione Friuli Venezia Giulia si estende su una superficie di 7856,50 Kmq ed è suddivisa in quattro provincie: Gorizia 466,00 Kmq, Pordenone 2273,20 Kmq, Trieste 211,80 Kmq e Udine 4905,40 Kmq. La Regione ha una superficie di 6725,50 Kmq di territorio agro-silvo-pastorale, che consiste in tutto quel territorio usato dalla fauna per poter vivere e riprodursi. Per una gestione venatoria seria e sostenibile, la Giunta Regionale emana leggi e direttive. L’ultima legge in materia di disposizioni per la programmazione faunistica e per l’esercizio dell’attività venatoria è la Legge Regionale del 6 Marzo 2008 [2]. Insieme a questa legge, è stata approvato il Piano Faunistico Regionale, allegato al DGR 26.06.2008, n.1264 [1], che istituisce i Distretti Venatori, le Riserve di Caccia che sono destinate alla caccia pubblica, le Aziende venatorie e le Zone cinofile che sono destinate a caccia riservata a gestione privata. Le competenze in materia venatoria sono esercitate dai Distretti Venatori. 1.1 Distretti Venatori I Distretti Venatori sono unità territoriali omogenee dal punto di vista ambientale e di vocazione faunistico, di usi e consuetudini locali e sono istituiti con delibere dalla Giunta Regionale. Un Distretto Venatorio è composto dall’insieme delle riserve di caccia, delle aziende faunisticovenatorie, delle aziende agri-turistico-venatorie e delle zone cinofile. Ogni distretto venatorio ha un Presidente, un VicePresidente e un’assemblea ed un codice che identifica univocamente ogni singolo distretto. La superficie e il perimetro di ogni Distretto Venatorio vengono calcolatati in base alle diverse tipologie agro-ambientale e alle diverse tradizioni socio-culturali delle comunità che vivono in regione. 3 Nella Figura 1, possiamo vedere che il territorio regionale è suddiviso in 15 distretti. Ad ogni distretto è associata sia la sua superficie territoriale che il numero delle riserve di caccia. In definitiva, la Regione Friuli Venezia Giulia ha 237 riserve di caccia su una superficie distrettuale totale di 7826,02 Kmq. Sempre in Figura 1, le città di Gorizia e di Trieste sono escluse dall’attività venatoria. Figura 1-1: Distretti Venatori e Riserve di Caccia 4 1.2 Riserve di Caccia Il territorio Regionale destinato a gestione venatoria pubblica è suddiviso in unità territoriali chiamate riserve di caccia. Le riserve di caccia sono composte da associazioni di cacciatori che operano secondo le direttive e le leggi emanate dallo Stato, dalla Regione e dalla stessa Riserva di Caccia. I naturali confini della riserva di caccia possono essere modificati attraverso accorpamenti di territori confinanti se e solo se essi sono necessari per un miglioramento dell’attività venatoria. Ogni riserva di caccia è diretta da un Direttore che è il rappresentante della riserva. Il suo lavoro è quello di attuare il Piano Venatorio Distrettuale, attuare il regolamento dell’attività venatoria e trasmettere al rispettivo Distretto Venatorio di appartenenza tutte le analisi e consuntivi di gestione venatoria. Ogni Riserva di Caccia viene identificata da un codice. La Giunta Regionale definisce la superficie territoriale e l’indice venatorio di ogni riserva di caccia. Per un elenco di tutte le riserve di caccia della Regione, si rimanda al Paragrafo 4.2.1 del Piano Faunistico Regionale (PFR) [2]. Ogni Riserva di Caccia, in base alla Massima Produzione Sostenibile (MPS), può determinare il numero massimo di cacciatori che possono operare nella riserva. La MPS corrisponde al massimo prelievo venatorio compatibile con la conservazione delle risorse faunistiche e cioè tali da non indurre la diminuzione della fauna (definizione tratta dal PFR). A questo valore di applica un Indice Teorico di Soddisfazione Specifica (ITSS) che individua il numero di soggetti abbattibili per ogni singola specie. Per avere un elenco del numero massimo di cacciatori per ogni Distretto Venatorio e per ogni singola Riserva di Caccia, si rimanda alla Tabella t1 dell’allegato al Piano Faunistico Regionale [2]. 1.3 Azienda faunistico-venatoria Queste aziende hanno lo scopo di ripristinare e migliorare l’ambiente naturale per la protezione e l’incremento della fauna. Le aziende sono istituite a favore di uno o più proprietari o cacciatori che utilizzano i loro terreni per una sana attività venatoria. Ogni azienda viene identificata da un codice e possiede una determinata superficie. 5 1.4 Azienda agri-turistico-venatoria Queste aziende sono istituite con lo scopo di consentire un’integrazione del reddito delle imprese agricole. Ogni azienda viene identificata da un codice e possiede una determinata superficie. Sia le aziende faunistico-venatoria che le aziende agri-turistico-venatoria, in base alla legge regionale attuale, devono costituire non più del 10% del territorio cacciabile di ogni riserva di caccia. Quando i territori cessino di far parte di un’azienda, essi saranno inclusi direttamente nella riserva di caccia confinante. Per un elenco di tutte le aziende venatorie, si rimanda al Piano Faunistico Regionale, Paragrafo 4.41. 1.5 Zone cinofile Le zone cinofile vengono istituite per l’addestramento, l’allevamento, le prove cinofile e le gare per i cani da caccia. Queste zone, in base alla legge regionale attuale, non devono interessare più del 20% del territorio di ciascuna riserva di caccia. Ogni zona cinofila viene identificata da un codice e possiede una determinata superficie. Anche in questo caso, per un elenco di tutte le zone cinofile della Regione, si rimanda al Piano Faunistico Regionale, Paragrafo 4.5. 6 2. Progettazione Concettuale La fase di Progettazione Concettuale consiste nella costruzione di uno schema CGG [4], a partire dai requisiti precedentemente raccolti. Per costruire il nostro sistema informativo, utilizzeremo il territorio di schema, che risulta essere costituito dalla regione Friuli Venezia Giulia (FVG), e sei entità principali. Poiché la regione è organizzata in provincie, introduciamo l’entità Provincia. L’entità Provincia è un’entità spaziale con una geometria di tipo multi-polygon. Questa entità viene identificata univocamente da un attributo chiave, Prv_Cod, e oltre ad esso, abbiamo individuato altri attributi: Denominazione, Prv-Sigla e SuperficieKmq. L’attributo Denominazione memorizza il nome della provincia, l’attributo Prv_Sigla memorizza la sigla della provincia e l’attributo SuperficieKmq è un attributo derivato dall’entità spaziale Provincia. La Figura 2-1 mostra tale entità. Figura 2-2: L'entità spaziale Provincia Una Provincia è composta da vari comuni e perciò, abbiamo individuato un’altra entità, l’entità Comune. Anche questa è un’entità spaziale con una geometria di tipo multi-polygon. In questa entità abbiamo definito un solo attributo, Denominazione, che è anche l’attributo chiave. Questo attributo memorizza il nome di ogni singolo Comune. 7 Tra l’entità Provincia e l’entità Comune esiste una relazione di aggregazione spaziale, come in Figura 2-2. Figura 2-3: La relazione di aggregazione tra Provincia e Comune Poiché la Regione è suddivisa in distretti venatori, l’entità che ci interessa adesso modellare è il Distretto Venatorio. Tale entità, spaziale, ha una geometria di tipo multi-polygon e un attributo chiave CodiceDistretto, che la identifica univocamente. Questa entità ha altri attributi: Presidente, VicePresidente, Perimetro, Denominazione, NumRiserCaccia e SuperficieKmq. Sia l’attributo Presidente e sia l’attributo VicePresidente sono attributi composti, rispettivamente formati da NomePresidente, CognomePresidente, NomeVicePresidente e CognomeVicePresidente. L’attributo Denominazione e l’attributo Perimetro vengono utilizzati per memorizzare il nome e il perimetro di ciascun distretto. Ogni Distretto può comprendere un numero massimo di riserve di caccia e ciò viene definito utilizzando l’attributo NumRiserCaccia. Infine, la SuperficieKmq è un attributo derivato dall’entità spaziale Distretto Venatorio. La Figura 2-3 mostra la definizione dell’entità spaziale Distretto Venatorio. 8 Figura 2-4: L'entità Distretto Venatorio Un Distretto Venatorio è composto da riserve di caccia e quindi abbiamo definito un’altra entità spaziale, anch’essa con una geometria di tipo multi-polygon, chiamata Riserva di caccia. La relazione esistente tra Distretto Venatorio e Riserva di Caccia è una relazione di aggregazione spaziale. 9 La Figura 2-4 mostra tale relazione. Figura 2-5: La relazione di aggregazione tra Distretto Venatorio e Riserva di Caccia Come possiamo vedere in Figura 2-4, una Riserva di Caccia viene identificata univocamente da un codice, Cod_Riserva. Ognuna di esse ha alcuni attributi: Direttore, IndiceVenatorio, MaxSoci, Denominazione, AreaCatastale, MPSUngulati e SuperficieKmq. L’attributo Direttore è un attributo composto, formato da NomeDirettore e CognomeDirettore. Ogni Riserva di Caccia ha un attributo Denominazione, che definisce il nome della riserva, un attributo MaxSoci, per il numero massimo di cacciatori per ogni riserva di caccia, un attributo AreaCatastale, per definire l’area di ogni riserva di caccia memorizzata nelle mappe catastali, un attributo MPSUngulati, utilizzato per rappresentare il numero massimo di prelievo venatorio per ogni tipo di animale e un attributo IndiceVenatorio, utilizzato per definire un indice venatorio per ogni riserva di caccia. 10 Infine, la SuperficieKmq è un attributo derivato dall’entità spaziale Riserva di caccia. Una riserva di caccia può anche contenere delle aziende di caccia privata a gestione privata e per questo, abbiamo definito un’altra entità spaziale con una geometria di tipo multi-polygon, chiamata Azienda, messa successivamente in relazione con Riserva di Caccia. La figura 2-5 mostra tale relazione. Figura 2-6: La relazione tra Riserva di Caccia e Azienda La nuova entità Azienda viene identificata univocamente da un codice, CodiceAzienda, e possiede anche altri attributi, Denominazione e SuperficieKmq. L’attributo Denominazione memorizza il nome dell’azienda e invece l’attributo SuperficieKmq è un attributo derivato dall’entità spaziale Azienda. La relazione include tra Azienda e Riserva di caccia è una relazione topologica di tipo contains, Figura 2-5, che indica che una Riserva di caccia può contenere molte aziende e che un’azienda può essere in una sola Riserva di caccia. La relazione include possiede anche un attributo ScadConcessione, che indica il termine di scadenza della concessione per l’attività venatoria privata. Dalla fase di analisi e raccolta dei requisiti, un’azienda può essere di tipo faunistico-venatoria, agrituristico-venatoria e una zona cinofila. Per definire questo vincolo, abbiamo deciso di fare una specializzazione totale e disgiunta dell’entità Azienda. 11 La figura 2-6 mostra tale specializzazione. Figura 2-7: La relazione di specializzazione per l'entità Azienda Poiché una riserva di caccia può corrispondere o alla dimensione di un comune o un comune può avere più di una riserva o una riserva di caccia può contenere più comuni, abbiamo deciso di fare due specializzazioni totali e disgiunti, una per il Comune e una per la Riserva di Caccia. Nella prima specializzazione, figura 2-7, abbiamo specializzato Comune in Comune Standard, che rappresenta tutti i comuni il cui territorio è uguale a quello di una riserva, Comune multiriserva, che memorizza tutti i comuni che comprendono più riserve, e Comune sottoriserva, dove il suo territorio è compreso in una riserva che contiene più comuni. 12 Figura 2-8: Specializzazione totale e disgiunta dell'entità spaziale Comune Invece, per la seconda specializzazione, Figura 2-8, abbiamo specializzato l’entità Riserva di Caccia in Riserva standard, che rappresenta le riserve il cui territorio è uguale a quello del comune di appartenenza, Riserva multicomune, che rappresenta tutte le riserve che consistono di più comuni, e Riserva sottocomune, che rappresenta tutte le riserve il cui territorio è più piccolo del territorio del comune di appartenenza. 13 Figura 2-9: La specializzazione totale e disgiunta dell’entità spaziale Riserva di caccia Successivamente abbiamo individuato delle relazione tra Comune sottoriserva e Riserva multicomune, tra Comune standard e Riserva standard e tra Comune multiriserva e Riserva sottocomune. La prima relazione è una relazione topologica di tipo contains, Figura 2-9, che indica che una Riserva multicomune può contenere da due a molte istanze di Comune sottoriserva, invece ogni Comune sottoriserva è contenuto in una sola Riserva multicomune. Figura 2-10: Relazione di tipo contains tra Comune sottoriserva e Riserva multicomune 14 La seconda relazione è una relazione topologica di tipo equals, Figura 2-10, che indica che ogni Comune standard è in relazione di uguaglianza con esattamente una sola Riserva standard, e ogni Riserva standard è in relazione di uguaglianza con esattamente un solo Comune standard. Figura 2-11: Relazione di tipo equals tra Comune standard e Riserva standard La terza e ultima relazione è ancora una relazione topologica di tipo contains, Figura 2-11, che indica che un Comune multiriserva contiene da due a molte Riserve sottocomune, e una Riserva sottocomune è contenuta in un solo Comune multiriserva. Figura 2-12: Relazione di tipo contains tra Comune multi riserva e Riserva sottocomune 15 L’ultima entità del nostro modello è quella che prende il nome di Cacciatore. L’entità Cacciatore è identificata univocamente da un codice, CodiceFiscale, ed ha alcuni attributi. Gli attributi dell’entità Cacciatore sono: Nome, Cognome e Indirizzo. L’attributo Indirizzo è un attributo composto, formato dall’attributo Via, Numero e CAP. La Figura 2-12 mostra tale definizione. Figura 2-13: L'entità Cacciatore L’entità Cacciatore si mette in relazione con altre due entità, rispettivamente l’entità Comune e l’entità Riserve di caccia. Con l’entità Comune, definisce la relazione risiede, Figura 2-13, che indica che un Cacciatore risiede in un solo comune, e che in un Comune risiedono molti cacciatori. Figura 2-14: La relazione "risiede" tra l'entità Cacciatore e l'entità Comune 16 Con l’entità Riserva di caccia, definisce la relazione caccia, Figura 2-14, che indica che in una Riserva di caccia possono cacciare molti cacciatori e che un cacciatore può cacciare in una sola Riserva di caccia. Figura 2-15: La relazione "caccia" tra l'entità Cacciatore e l'entità Riserva di caccia Mettendo insieme tutte le entità e le relazioni analizzate precedentemente, otteniamo lo schema globale come visualizzato in Figura 2-15. 17 Figura 2-16: Diagramma completo per la gestione venatoria del Friuli Venezia Giulia 18 3. Progettazione Logica La fase di Progettazione Logica rappresenta la base di dati come una collezione di relazioni. Partendo da uno schema concettuale, si arriva a costruire uno schema logico equivalente utilizzando un opportuno algoritmo di traduzione. L’algoritmo di traduzione è implementato nello stesso tool utilizzato per costruire lo schema concettuale. L’algoritmo di fronte ad un’entità E dello schema concettuale, costruisce una relazione R che contiene tutti gli attributi semplici di E. Se esiste un attributo composto, allora inserisce nella relazione solo gli attributi componenti semplici. Per definire la chiave primaria di R, si sceglie uno degli attributi chiave di E. Se nella progettazione concettuale sono state definite più chiavi per E, le informazioni che descrivono gli attributi che formano ogni ulteriore chiave vengono mantenute al fine di specificare le chiavi secondarie di R. Nel progetto in esame, sono state identificate sette relazioni: Distretto_Venatorio, Riserve_di Caccia, Cacciatore, Provincia, Azienda, Comune e uno schema di Territorio . La Figura 3-1 illustra le relazioni con i propri attributi. Figura 3-17: Le sette relazioni con i propri attributi. 19 Dallo schema concettuale ci accorgiamo che l’entità spaziale Azienda, l’entità spaziale Riserve_di_Caccia e l’entità spaziale Comune vengono specializzate mediante una specializzazione totale disgiunta. In questo caso l’algoritmo di traduzione inserirà nell’entità padre un attributo type, che indicherà la sottoclasse a cui appartiene ciascuna tupla, solo se essa è specificata. La Figura 3-2 indica le tre relazione con l’attributo type che indica il tipo di specializzazione. Figura 3-18: La traduzione della specializzazione totale e disgiunta usando l'attributo type. Dalla Figura 2-13 ci accorgiamo che esiste una relazione uno-a-molti tra l’entità Cacciatore e l’entità spaziale Comune, chiamata risiede. L’algoritmo del tool traduce questa relazione inserendo nella tabella Cacciatore l’attributo DenominazionerisiedeComune che sarà successivamente una chiave esterna della relazione Comune. Allo stesso modo ci accorgiamo che tra l’entità Cacciatore e l’entità spaziale Riserve_di_Caccia esiste una relazione caccia di tipo uno-a-molti, come in Figura 2-14. Come nel caso precedente, l’algoritmo traduce la relazione inserendo nella tabella Cacciatore l’attributo Cod_RiservacacciaRiserve_di_Caccia che sarà successivamente una chiave esterna della relazione Riserve_di_Caccia. La Figura 3-3 ne mostra il risultato della traduzione. Figura 3-19: La nuova relazione Cacciatore 20 Dalla Figura 2-5 vediamo che esiste una relazione topologica di tipo contains con cardinalità uno-amolti tra l’entità spaziale Azienda e l’entità spaziale Riserve_di_Caccia. In questo caso il tool traduce la relazione inserendo nella tabella Azienda l’attributo Cod_RiservaincludeRiserva_di_Caccia che sarà una chiave esterna della tabella Riserve_di_Caccia. La relazione include ha anche una attributo ScadConcessione che nel processo di traduzione sarà inserito nella tabella Azienda. La Figura 3-4 mostra la nuova tabella Azienda dopo aver eseguito questo nuovo passo di traduzione. Figura 3-20: La nuova tabella Azienda La traduzione continua prendendo in esame le tre relazioni esistenti tra le sottoclassi dell’entità spaziale Comune e le sottoclassi dell’entità spaziale Riserve_di_Caccia. La prima relazione è tra la sottoclasse Comune_standard che è in relazione topologica di tipo equals con la sottoclasse Riserva_standard, come in Figura 2-10. Questa relazione è di tipo uno-a-uno e l’algoritmo di traduzione inserisce nella tabella Comune l’attributo CodRiservacorrisponde_aRiserva_standard che sarà una chiave esterna della tabella Riserve_di_Caccia. La seconda relazione è tra la sottoclasse Comune sottoriserva che è in relazione topologica di tipo contains con la sottoclasse Riserva multicomune. Questa è una relazione di tipo uno-a-molti e l’algoritmo di traduzione inserisce nella tabella Comune l’attributo Cod_RiservacontieneRiserva_multicomune che sarà una chiave esterna della tabella Riserve_di_Caccia. La Figura 3-5 mostra la nuova tabella Comune, dopo la traduzione di queste due relazioni. Figura 3-21: La nuova tabella Comune La terza relazione è tra Comune multiriserva che è in relazione topologica di tipo contains con Riserva sottocomune, come in Figura 2-11. Questa è una relazione di tipo molti-a-uno e l’algoritmo di traduzione inserisce nella tabella Riserve_di_Caccia l’attributo Denominazioneè_situata_inComune_multiriserva che sarà una chiave esterna della tabella Comune. 21 La Figura 3-6 mostra la nuova tabella Riserve_di_Caccia dopo la traduzione di quest’ultima relazione. Figura 3-22: La nuova tabella Riserve_di_Caccia Dalla Figura 2-2 ci accorgiamo che esiste una relazione di aggregazione spaziale tra l’entità spaziale Provincia e l’entità spaziale Comune. In questo caso l’algoritmo di traduzione traduce questa relazione inserendo nella tabella Comune l’attributo Prv_Cod2Provincia che sarà una chiave esterna dell’entità spaziale Provincia. La Figura 3-7 mostra la nuova tabella Comune. Figura 3-23: La nuova tabella di Comune Allo stesso tempo esiste un’altra relazione di aggregazione spaziale tra l’entità spaziale Distretto_Venatorio e l’entità spaziale Riserve_di_Caccia, come in Figura 2-4. In questo caso l’algoritmo di traduzione inserisce nella tabella Riserve_di_Caccia due nuovi attributi, CodiceDistretto0Distretto_Venatorio e CodiceDistretto0Distretto_Venatorio, che saranno due chiavi esterne della tabella Distretto_Venatorio. La Figura 3-8 mostra la nuova tabella Riserve_di_Caccia. Figura 3-24: La nuova tabella Riserve_di_Caccia Fino adesso abbiamo parlato di entità spaziale senza mai far riferimento a come l’algoritmo di traduzione del tool ChronoGeoGraph traduce una simile entità. Il metodo usato è quello di 22 aggiungere ad ogni entità di tipo spaziale l’attributo geometry, indispensabile per inserire successivamente il dato spaziale. La Figura 3-9 mostra lo schema logico finale. Figura 3-25: Lo schema logico finale 23 4. Creazione ed Istanziazione della BD Oracle Dopo aver completato la fase di progettazione logica, possiamo adesso passare alla fase di implementazione della base di dati. Di solito questo compito spetta al DBA che grazie ad istruzioni SQL, compila e crea gli schemi e i file (vuoti) della base di dati. In seguito, il database può essere poi riempito con i dati. Prima di compilare ed eseguire le istruzioni SQL necessarie alla creazione delle nostre tabelle, abbiamo bisogno di recuperare dei dati, soprattutto quelli spaziali, memorizzati in altre due basi di dati di tipo Access, LimitiRegionali.mdb e SAGFV_V.mdb. Per far questo, è necessario utilizzare un tool che ci dà la possibilità di connetterci ai nostri database e di esportare i dati nel modello Oracle. Il tool che abbiamo utilizzato è GeoMedia Professional 5.2 [5] che appunto permette di connettersi a database esistenti, di mostrare i dati e di interrogarli. Prima di spiegare come avviene la connessione e la visualizzazione dei dati, è necessario definire che cosa si intende per feature e feature class. Una feature è un’entità geografica rappresentata su una mappa da una geometria e definita da attributi alfanumerici, mentre una feature class è la classificazione alla quale è assegnata ogni istanza di feature. Ritornando ai nostri dati, le feature class sono i Comuni, le Province, le Riserve_di_Caccia, la Regione e i Distretti_Venatori, mentre Udine è una feature della feature class Comuni e Province, la Carnia è una feature della feature class Distretti_Venatori, ecc.. Adesso spiegheremo come connettersi al database LimitiRegionali.mdb e come esaminare i dati. Per connettersi ad un database, è necessario eseguire i seguenti passi: 1. Selezioniamo Warehouse dal menu e successivamente New Connection Questo ci mostra i diversi warehouse ai quali è possibile connettersi 2. Selezioniamo Access e premiamo Next 3. Premiamo Browse per scegliere il database voluto 4. Selezioniamo LimitiRegionali.mdb e premiamo Apri 5. Premiamo Next 6. Selezioniamo l’opzione Access all feature in the warehouse e premiamo Next 7. Selezioniamo l’opzione Let the wizard open the connection as read-only 8. Selezioniamo Fine 24 A questo punto siamo connessi al database scelto ed ora possiamo aggiunge le nostre feature class per esaminare i dati. Per fare ciò, dobbiamo effettuare i seguenti passi: 1. Selezioniamo Legend dal menu e successivamente clicchiamo su Add Feature Class Questo aprirà una finestra di dialogo contenete la lista delle feature class presenti nel nostro database 2. Selezioniamo quale feature class vogliamo visualizzare 3. Premiamo il pulsante OK Questo aggiungerà la voce scelta nella legenda e l’entità geografica verrà visualizzata nella map window. Allo stesso modo possiamo connetterci ad un altro database e visualizzare nella stessa map window feature class appartenenti a database diversi. Adesso siamo pronti ad esportare nel modello Oracle i dati presenti nella map window compiendo i seguenti passi: 1. Selezioniamo Warehouse dal menu e successivamente selezioniamo da sottomenu Export to l’opzione Oracle Object Model. Questo aprirà una finestra di dialogo con la lista delle feature class salvate nel database a cui siamo connessi 2. Selezioniamo la feature class che vogliamo esportare 3. Premiamo Browse per scegliere la cartella dove vogliamo che i file esportati siano salvati 4. Selezioniamo o deselezioniamo l’opzione Export 3D coordinates 5. Premiamo Apply Alla fine, la cartella di esportazione conterrà, per ogni feature class esportata, i file: • FeatureClassName.pre: è il file che contiene le istruzioni SQL necessarie per creare la tabella • FeatureClassName.ctl: è il file di controllo per il caricamento dei dati • FeatureClassName.dat: è il file di dati • FeatureClassName.pos: è il file che popola la tabella dei metadati di Oracle • Import.bat: è il file che contiene tutti i file descritti precedentemente • Export.log: è il file che memorizza o la causa di un fallimento o il numero di valori per ogni tabella esportata 25 Prima di importare i dati creati dall’Export to Oracle Object, è necessario creare lo schema GDOSYS. Per creare questo schema, dobbiamo eseguire lo script CreateGDOSYS.sql che di solito si trova nella cartella GeoMediaProfessional\Program. Affinché l’esecuzione di questo script vada a buon fine, dobbiamo definire alcuni parametri importanti. Per fare ciò, o ci posizioniamo all’interno dello script alla riga di definizione dei parametri e modifichiamo quelli originali con quelli da noi definiti, come in Figura 4-1, oppure li possiamo passare come un solo parametro. DEFINE gserver =&1 DEFINE gpassword =&2 DEFINE gprofile =&3 DEFINE gserver = localhost DEFINE gpassword = ******** DEFINE gprofile = GDOSYS DEFINE userspace =&4 DEFINE userspace = USER DEFINE tempspace =&5 DEFINE tempspace = TEMP Figura 4-26: La definizione dei parametri Se optiamo per la seconda scelta, sarà sufficiente usare la seguente sintassi: @CreateGDOSYS <NET_SERVICE> <GDOSYS_PSWD> <ORA_PROFILE> <USER_TABLESPACE> <TEMP_TABLESPACE> dove • <NET_SERVICE> è il nome usato per il servizio Oracle • <GDOSYS_PSWD> è la password da usare per l’utente GDOSYS • <ORA_PROFILE> è il profilo da usare quando si crea l’account dell’utente • <USER_TABLESPACE> è il tablespace dove sarà creato lo schema • <TEMP_TABLESPACE> è il temporary tablespace da usare Quindi, per esempio: @CreateGDOSYS LOCALHOST ******** GDOSYS USER TEMP L’esecuzione di questo script produrrà la creazione di un nuovo utente, GDOSYS, con tabelle, view, trigger e sequence. Per ulteriori informazioni e chiarimenti su ciò che crea questo script, si rimanda sia al manuale di GeoMedia Professional che alle connessione con Oracle [5,6]. A questo punto possiamo mandare in esecuzione sia lo script FeatureClassName.pre che lo script FeatureClassName.pos. Successivamente possiamo popolare le tabelle appena create con i valori 26 memorizzati nel file Import.bat. Per eseguire questo file, dobbiamo aprire la finestra del prompt dei comandi, posizionarci sulla cartella dove si trova il file e scrivere la seguente istruzione: IMPORT GDOSYS/LOGO@LOCALHOST A questo punto, creiamo le nostre personali tabelle prodotte nella fase di progettazione logica dentro l’utente GDOSYS. Il passo successivo è quello di popolare le nostre ultime tabelle create con i dati già memorizzati. Per far questo, è necessario una semplice istruzione SQL che inserisce in una tabella, dei dati che provengono da altre tabelle. Per spiegare meglio, facciamo un esempio di inserimento dati dalla tabella Distretti_Venatori alla tabella da noi creata, chiamata Distretto_VenatorioMIO: INSERT INTO DISTRETTO_VENATORIOMIO(CODICEDISTRETTO,GEOMETRY,DENOMINAZIONE) SELECT CODICEDISTRETTO,SPATIALAREA,DENOMINAZIONE FROM DISTRETTI_VENATORI; Riusando questa istruzione, con le necessarie modifiche, siamo in grado di popolare tutte le tabelle. 27 5. Visualizzazione dei dati con GeoServer GeoServer [7] prevede uno GeoSpatial Web, come WWW, dove l’utente può cercare e scaricare dati, o semplicemente può cercare o leggere dati spaziali sul web. I dati possono essere pubblicati sul web e gli utenti possono accedere ad essi senza sapere chi è il fornitore di questi dati. Quando il progetto GeoServer ebbe inizio, l’OpenGis Consortium stava lavorando sullo standard Web Feature Service (WFS). Questo standard specifica un protocollo per rendere i dati disponibili sul web. WFS dà la possibilità all’utente di decidere che cosa fare dei dati o, se è necessario, fare un qualche tipo di analisi prima della loro visualizzazione. Questo standard utilizza il formato dati GML (Geographic Markup Language), un linguaggio basato su XML, che dà una chiara struttura su come i dati sono formati e descritti. Mentre si lavorava al progetto GeoServer, nasceva e si sviluppava il lavoro su PostGis, un database open source, che alla fine diventerà il primo database spaziale su cui correrà la prima release di GeoServer. Con il passare del tempo, il progetto GeoServer diventa cosi importante e conosciuto a livello mondiale, che i maggiori sistemi commerciali di database, come Oracle, Db2 e successivamente MySql, richiesero che GeoServer funzionasse anche con i loro sistemi. Successivamente si sviluppò lo standard Web Map Service (WMS). Questo standard si occupa principalmente di fornire all’utente, una picture di una mappa. È importante sottolineare che, in una WMS, l’utente ha una limitata interattività con la mappa a differenza di una WFS, dove l’utente interagisce e personalizza i dati che vuole visualizzare. Per visualizzare i dati memorizzati nella nostra base di dati, utilizzeremo la nuova versione di GeoServer, GeoServer 1.7.0. Per installare e configurare il tool con il database Oracle, si rimanda alla relazione di Paolo Gallo [7]. 1.6 Alcune Implementazioni Questo paragrafo illustrerà dettagliatamente come costruire una WMS con la libreria OpenLayers. La libreria può essere scaricata dal sito www.openlayers.org o utilizzare una sua copia che si trova già su GeoServer. Per utilizzare la libreria è necessario inserire un’istruzione javascript nel modulo head del file html che andremo a costruire. L’istruzione utilizzata è la seguente: <script src=http://localhost:8080/geoserver/openlayers/OpenLayers.js></script> 28 Questa istruzione dice al browser dove si trova il file javascript su cui corre OpenLayers. Successivamente, la prima cosa da fare è dire ad OpenLayers quali layer vogliamo caricare e visualizzare. Prima di far ciò, è necessario definire la mappa su cui andremo a caricare i nostri layer. L’istruzione che utilizzeremo è la seguente: var map = OpenLayers.Layer(‘map’); Questa istruzione dice ad OpenLayers di costruire una nuova mappa e questa sarà il posto dove i nostri layer saranno caricati. Per definire un layer dobbiamo modificare la sezione che definisce l’oggetto OpenLayers.Layer.WMS. OpenLayers.Layer.WMS prende i seguenti argomenti: - name : il nome del layer - url: l’indirizzo dove si trova il nostro layer - params: i parametri necessari al programma per lavorare - options: opzioni di visualizzazione del layer I due pezzetti di codice che definiscono i due nuovi layer e le opzioni che può prendere OpenLayers.Layer.WMS sono: var distretto_wms = new OpenLayers.Layer.WMS( "topp:DISTRETTO_VENATORIONEW", "http://localhost:8080/geoserver/wms", {layers: 'topp:DISTRETTO_VENATORIONEW', srs:'EPSG:4326', format: "image/png" }, {singleTile:true, ratio:1}); var riserve_wms= new OpenLayers.Layer.WMS("topp:RISERVE_DI_CACCIANEW", "http://localhost:8080/geoserver/wms", {layers:'topp:RISERVE_DI_CACCIANEW', srs:'EPSG:4326', format: "image/png" },{'isBaseLayer': false}); OpenLayers assume che i layer WMS sono tutti layer di base. Questo è un problema se noi vogliamo vedere i diversi layer uno alla volta e cosi sarà necessario aggiungere l’opzione isBaseLayer:false a quel layer che sarà visualizzato sopra il layer di base. A questo punto dobbiamo aggiungere i due layer sopra la mappa e per fare questo utilizzeremo la seguente istruzione map.addLayers([distretto_wms,riserve_wms]); 29 Quello che sarà visualizzato all’apertura del file è mostrato nella Figura 5-1. Questa figura ci mostra come si dispongono nel territorio i 15 Distretti Venatori individuati e decisi dall’Amministrazione Regionale del Friuli Venezia Giulia. Figura 5-27: La mappa dei Distretti Venatori Cliccando adesso sul pulsante +, è possibile visualizzare il layer riguardante le Riserve di Caccia. La Figura 5.2 mostra il layer Riserve di Caccia sopra al layer Distretto Venatorio. Figura 5-28: La mappa delle Riserve sopra la mappa dei Distretti 30 Quello che adesso vogliamo fare è ottenere informazione cliccando sulla mappa visualizzata. Questo lo possiamo fare utilizzando il seguente pezzo di codice: // support GetFeatureInfo map.events.register("click", map, function(e) { document.getElementById('nodelist').innerHTML = "Loading... please wait..."; var url = map.layers[0].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[0].params.LAYERS, FEATURE_COUNT:1, WIDTH: map.size.w, HEIGHT: map.size.h }, "http://localhost:8080/geoserver/wms" ); OpenLayers.loadURL(url, '', this, setHTML, setHTML); Questo “register” registra la funzione che viene chiamata quando avviene un click, cioè quando l’utente clicca sulla mappa. Per prima cosa, la funzione cambia l’inneHTML del nodelist a “Loading…Please wait…” in modo da dare al’utente l’impressione che si sta facendo qualcosa. Successivamente viene costruito un nuovo URL basato sull’URL di uno dei nostri layer. Quando si definisce la richiesta “GetFeatureInfo”, è indispensabile settare alcuni parametri importanti come il BBOX, che definisce l’estensione corrente della mappa, il width e l’height, per definire la dimensione della mappa. Successivamente, aggiungiamo in X eY la posizione del click del mouse, il layer richiesto e l’INFO_FORMAT. Finalmente, con la chiamata alla funzione loadURL, inizia la richiesta al server e questa chiamata ci dice che è indispensabile una funzione setHTML per maneggiare il risultato dell’URL. Quindi quello che noi abbiamo, è una funzione setHTML che faccia qualcosa quando ritorna il risultato dal server. In cima al file, inseriamo il seguente pezzettino di codice: 31 function setHTML(response) { document.getElementById('nodelist').innerHTML = response.responseText; }; Questa funzione si prende la risposta del server e copia il testo nell’elemento nodelist del documento HTML. A questo punto salviamo il file e lo carichiamo nel browser Internet Explorer 7. Se si usa questa versione di GeoServer, il browser Mozilla Firefox versione 3.0.0 e successive è in grado di visualizzare la mappa ma non di interrogarla. Quindi, dopo averla caricata su Internet Explorer 7, proviamo a vedere se funziona quando clicchiamo su una feature. Per esempio, clicchiamo su un qualche distretto, come evidenziato dal puntino rosso della Figura 5-1. Dopo un momento di attesa, la risposta che ci viene restituita è uguale quella della Figura 5-3. Figura 5-29: La risposta del server su un Distretto Se adesso clicchiamo su una qualsiasi Riserva di Caccia, come evidenziato dal puntino rosso della Figura 5-2, la risposta che ci viene restituita è uguale a quella della figura 5-4. Figura 5-30: La risposta del server su una Riserva 32 Un altro esempio di implementazione è dato dal layer di base FVG e dall’overlay Riserve di Caccia. Per definire questo esempio, è necessario eseguire gli stessi passi fatti precedentemente cambiando soltanto l’istruzione che indica la definizione dei layer. Se noi clicchiamo sul primo layer, come evidenziato dal puntino rosso della Figura 5-5, la risposta che ci viene restituita è come quella della Figura 5-6. Figura 5-31: La Regione Friuli Venezia Giulia Figura 5-32: La risposta del server sulla Mappa Regionale A questo punto possiamo cliccare sul pulsante +, in alto a destra, e possiamo selezionare l’overlay Riserve di Caccia, ottenendo la Figura 5-7. 33 Figura 5-33: L'overlay Riserve di Caccia Anche in questo caso, cliccando sul puntino rosso, come evidenziato nella Figura 5-7, possiamo ottenere le seguenti informazioni, Figura 5-8. Figura 5-34: La risposta del server su una data Riserva 34 L’ultimo esempio è quello di un layer di base Provincia con due overlays Distretto e Riserve. Per ottenere questo esempio basta aggiungere all’esempio precedente un nuovo overlay. Al caricamento del file, la mappa che ci viene visualizzata è quella Figura 5-9. Figura 5-35: Le Province del Friuli Venezia Giulia Cliccando sul puntino rosso, come mostrato nella Figura 5-9, la risposta restituita dal server è come quella della Figura 5-10. Figura 5-36: La risposta sulla Provincia cliccata Adesso aggiungiamo il layer Distretto e quello che andremo a visualizzare è quello mostrato in Figura 5-11. 35 Figura 5-37: L'overlay Distretto Allo stesso modo, cliccando sul puntino rosso della Figura 5-11, la risposta che verrà restituita dal server è quella mostrata nella Figura 5-12. Figura 5-38: La risposta del server dopo il click Allo stesso modo possiamo aggiungere il layer Riserve e togliere il layer Distretto e così la mappa che ci viene visualizzata è come quella della Figura 5-13. 36 Figura 5-39: L'overlay Riserve di Caccia Anche in questo caso cliccando sul puntino rosso, come mostrato nella Figura 5-13, la risposta che giunge dal server è uguale a quella della Figura 5-14. Figura 5-40: La risposta del server al click 37 In questa nuova versione, è stato aggiunto un toolbar, capace di eseguire, in modalità WMS, semplici interrogazioni di Filter, generando nella mappa il risultato della richiesta. Proviamo adesso ad eseguire qualche interrogazione con questo nuovo strumento. Carichiamo sul brower una mappa, nel nostro caso WMS COMUNENEW, Figura 5-15, e cliccando sul pulsante rosso si apre la finestra come in Figura 5-16. Figura 5-41: Il pulsante per il toolbar nella WMS Comune Figura 5-42: L'interrogazione con CQL Filter 38 La prima interrogazione sarà quella di ricercare i Comuni con un numero di residenti minore di 700. Prima di eseguire questa interrogazione, dobbiamo scegliere il giusto Filter. I FILTER che possiamo utilizzare, sono tre: CQL, OGC e FeatureId. Il primo filtro, CQL Filter, permette di selezionare le feature che soddisfano particolari vincoli sui dati e, in sostanza, questo filtro risponde alla traduzione dell’istruzione SQL WHERE. Il secondo filtro, OGC Filter, è un open standard, proposto dall’Open Geospatial Consortium, e per utilizzarlo è sufficiente leggerne le specifiche. Quando le interrogazioni diventano più complesse, l’uso del OGC Filter fa perdere molta comprensibilità e per ovviare a questo problema, si usa il CQL Filter. Il terzo e ultimo filtro è il FeatureID che permette di selezionare una singola feature fornendo il suo id. Scegliamo il filtro CQL e nell’apposita casella, possiamo inserire la nostra interrogazione, NUMRESIDENTI < 700. La risposta sarà come quella della Figura 5-17. Figura 5-43: I Comuni con NUMRESIDENTI < 700 Per ottenere informazioni sui Comuni visualizzati sulla mappa, è necessario cliccare su uno di esso. La seconda interrogazione sarà quella di recuperare tutte le feature dei Comuni contenute in un dato bounding box. Per effettuare questa richiesta, è necessario inserire nell’apposita casella questa istruzione: 39 BBOX(GEOMETRY,23558386611.87773,512812636.59414,235609810.62070,514803741.05076) La risposta sarà come quella della Figura 5-18. Figura 5-44: I Comuni in un dato Bounding Box Anche in questo caso, possiamo ottenere le informazioni cui Comuni cliccando uno di essi. La terza interrogazione sarà quella di richiedere i soli Distretti Venatori il cui numero di soci è tra 300 e 500. Dopo aver caricato la mappa WMS DISTRETTO_VENATORIONEW e inserito l’istruzione MAXSOCI BETWEEN 300 AND 500, la risposta restituita dal server è uguale a quella della Figura 5-19. 40 Figura 5-45: I Distretti con MAXSOCI tra 300 e 500 Anche in questo caso, per ottenere informazioni sui Distretti, è necessario cliccare su uno di essi. La quarta e ultima interrogazione sarà quella di richiedere i Distretti il cui numero di soci è tra 300 e 500 e che sono contenute in un dato bounding box. Per questa interrogazione è necessario inserire l’istruzione BBOX(GEOMETRY,23558386611.87773,512812636.59414,235609810.62070,514803741.05076) AND MAXSOCI BETWEEN 300 AND 500 La risposta ottenuta è uguale a quella della Figura 5-20. Figura 5-46: I Distretti ottenuti dopo aver eseguito l'interrogazione Anche in questo caso, per ottenere informazioni è necessario cliccare sulla feature restituita dal server. 41 Bibliografia [1] Piano Faunistico Regionale, allegato alla DGR 26.06.2008, n.1264. [2] Legge Regionale n.06/2008, Disposizioni per la programmazione faunistica e per l’esercizio dell’attività venatoria. [3] Legge Regionale n.30 del 31 dicembre 1999, Gestione ed esercizio dell’attività venatoria nella Regione Friuli-Venezia Giulia. [4] Tesi di Laurea, UNO STRUMENTO PER LA PROGETTAZIONE CONCETTUALE DI SISTEMI INFORMATIVI GEOGRAFICI, Alberto Frappa. [5] Manuale di GeoMedia Professional 5.2, WORKING with GeoMedia Professional. [6] Come connettersi a Oracle da GeoMedia, Using Oracle Connections. [7] Introduzione a GeoServer, Una soluzione per GIS open-source, Paolo Gallo. Siti consultati - Friuli Venezia Giulia: http://www.regione.fvg.it - Caccia nel Friuli Venezia Giulia: http://www.caccia.fvg.it - Comuni Italiani http://www.comuni-italiani.it - Prodotto software GeoMedia Professional: http://imgs.intergraph.com - Oracle: http://www.oracle.com - Java, per l’ultimo SUN JDK, qualora non fosse già installato: http://java.sun.com - GeoServer: http://www.geoserver.org - OpenLayers: http://www.openlayers.org 42 - OGC, Open Geospatial Consortium: http://www.opengeospatial.org - OGC WMS Specification: http://portal.opengeospatial.org/files/?artifact_id=14416 - OGC WFS Specification: https://portal.opengeospatial.org/files/?artifact_id=7176 43