SlideShare una empresa de Scribd logo
1 de 47
Descargar para leer sin conexión
Università degli Studi di Trieste
                       Facoltà di Ingegneria




   Tesi di Laurea Triennale in Ingegneria Informatica

   PROGETTO E SVILUPPO DI UN
 APPLICATIVO BASATO SU GOOGLE
 EARTH PER LA VISUALIZZAZIONE
 DI DATI DI EMISSIONI INQUINANTI




Relatore:                                              Laureando:
Ill.mo Prof. Maurizio FERMEGLIA                        Raffaele BERNARDI




                         Anno accademico 2009 – 2010
Indice


1.     Introduzione ................................................................................................................... 3
     1.1      Obiettivo della tesi .................................................................................................. 3
     1.2      Stato dell’arte .......................................................................................................... 3
     1.3      Risultato della tesi ................................................................................................... 4
     1.4      Motivazioni ............................................................................................................. 4
     1.5      Vincoli di progetto .................................................................................................. 5
2.     Analisi ............................................................................................................................ 6
     2.1      Google Earth ........................................................................................................... 6
     2.2      Google Earth Plugin................................................................................................ 6
     2.3      Google Earth API: Javascript vs COM ................................................................... 7
     2.4      Il progetto PRTR ..................................................................................................... 8
     2.5      Il database PRTR .................................................................................................... 9
       2.5.1         Legge dei coseni sferici ................................................................................. 10
3.     Progettazione ................................................................................................................ 11
     3.1      Use case diagram .................................................................................................. 11
     3.2      Activity diagram ................................................................................................... 12
     3.3      Class diagram ........................................................................................................ 14
4.     Interfaccia ..................................................................................................................... 21
     4.1      Form principale ..................................................................................................... 21
       4.1.1         Barra dei menu .............................................................................................. 22
       4.1.2         Barra di stato.................................................................................................. 23
       4.1.3         Dialog box per la ricerca tramite indirizzo .................................................... 23
       4.1.4         Dialog box per la ricerca tramite coordinate geografiche ............................. 24
       4.1.5         Google Earth Plugin integrato ....................................................................... 24
     4.2      Form informazioni ................................................................................................ 25
     4.3      Form emissioni ..................................................................................................... 26
       4.3.1         Scheda Regional emissions ........................................................................... 27
       4.3.2         Scheda Chemical info .................................................................................... 28
       4.3.3         Scheda Facility info ....................................................................................... 28
     4.4      Esempio d’utilizzo ................................................................................................ 29
     4.5      PRTR Google Earth Interface: requisiti per l’installazione .................................. 30

                                                                     1
5.     Implementazione .......................................................................................................... 31
     5.1     Tecnologie software utilizzate .............................................................................. 31
     5.2     Codice ................................................................................................................... 31
       5.2.1        Caricamento di Google Earth Plugin ............................................................. 31
       5.2.2        Integrazione di Google Earth Plugin ............................................................. 33
       5.2.3        Chiamata ad un metodo esterno .................................................................... 34
       5.2.4        Conversione di coordinate e aggiornamento della posizione del puntatore .. 35
       5.2.5        Connessione al database ed esecuzione di una query .................................... 38
       5.2.6        Esecuzione di una stored procedure .............................................................. 39
6.     Conclusioni .................................................................................................................. 42
     6.1     Risultati ottenuti .................................................................................................... 42
     6.2     Lavoro svolto ........................................................................................................ 42
     6.3     Sviluppi futuri ....................................................................................................... 43
7.     Bibliografia .................................................................................................................. 45




                                                                   2
1. Introduzione



                                 1. Introduzione


       1.1 Obiettivo della tesi

L’obiettivo che ci si è posti con questa tesi è la progettazione e lo sviluppo di un
applicativo stand-alone che presenti un’interfaccia user friendly per l’interrogazione del
database PRTR e la conseguente visualizzazione dei dati relativi alle emissioni inquinanti.
Più precisamente, si vuole che l’utente possa scegliere un arco temporale ed una regione
geografica per ottenere i relativi valori delle emissioni. La selezione avviene per porzioni
circolari di territorio, all’inserimento delle coordinate geografiche del punto desiderato
segue la determinazione di un raggio d’interesse. Questi costituiscono rispettivamente
centro e raggio dell’ideale circonferenza all’interno della quale si desidera estrarre le
informazioni dal database.




       1.2 Stato dell’arte

Al momento esiste ed è operativa un’applicazione1 web simile per funzionalità ma diversa
per struttura.




                                  Figura 1 - L'applicazione web

1
    http://prtr.units.it/

                                               3
1. Introduzione


L’inserimento delle coordinate geografiche è manuale, di conseguenza all’utente viene
implicitamente richiesta la conoscenza delle coordinate del punto d’interesse.




   1.3 Risultato della tesi

Il software creato, PRTR Google Earth Interface, rispetta i vincoli di progetto ed è
utilizzabile dopo una semplice installazione. Per i requisiti, si rimanda al capitolo 4.5.




                          Figura 2 - L'applicazione PRTR Google Earth Interface




   1.4 Motivazioni

L’applicazione web esistente prevede l’inserimento manuale delle coordinate geografiche
del punto d’interesse. L’operazione richiede quindi uno sforzo preventivo all’utente che di
questo non conosca già le coordinate, una ricerca tramite altri strumenti, esterni
all’applicazione, che gli permetta di scoprire i relativi valori di latitudine e longitudine. Di

                                                   4
1. Introduzione


conseguenza il sistema in uso introduce una probabilità d’errore nel momento in cui egli
riporta i dati nell’applicativo. L’utilizzo di una mappa che l’utente possa esplorare sino al
raggiungimento del punto d’interesse ovvia ad entrambi i problemi. All’utente non viene
richiesta la conoscenza preventiva delle coordinate geografiche, tantomeno lo costringe
all’inserimento manuale di tali valori e ciò comporta una sensibile riduzione della
probabilità d’errore.




   1.5 Vincoli di progetto

Sono stati imposti i seguenti vincoli di progetto:

   •   Al fine di integrare una vista del globo nell’applicativo, si utilizzano le API di
       Google Earth;
   •   L’applicativo è stand-alone;
   •   Il software usa il database PRTR già esistente ed operativo al quale si connette
       direttamente ed in locale per l’estrazione dei dati richiesti dall’utente;
   •   La query avviene per porzioni circolari di territorio, il cui centro è scelto dall’utente
       con un click del mouse sulla mappa.




                                               5
2. Analisi



                                                2. Analisi


Partendo dal presupposto di dover presentare all’interno del proprio applicativo
un’interfaccia di semplice utilizzo, ci si è concentrati sul vincolo relativo allo sfruttamento
delle API di Google Earth. In seguito, per l’interrogazione del database PRTR, sulle stored
procedure offerte dallo stesso e già utilizzate dall’applicazione web esistente.




       2.1 Google Earth

L’applicazione, creata con il nome di Keyhole dall’omonima società, divenne Google
Earth quando nel 2004 Google acquisì la Keyhole, Inc. Giunto alla versione 6, il software
consente all’utente l’esplorazione ‘in volo’ del globo terrestre, mediante foto satellitari ed
aeree è possibile infatti visualizzare ogni zona del pianeta a diversi livelli di zoom, il cui
livello massimo, conservando una risoluzione accettabile, varia a seconda del luogo. La
navigazione può avvenire semplicemente con l’ausilio del mouse o in alternativa, se si è
alla ricerca di un preciso punto, tramite inserimento delle sue coordinate geografiche o
dell’indirizzo (grazie all’integrazione con Google Maps).

Per rappresentare la superficie del pianeta, Google Earth utilizza la proiezione cilindrica
equirettangolare, in cui meridiani e paralleli sono linee rette equidistanti che si intersecano
ad angolo retto, con datum WGS84, elissoide geocentrico concepito per coprire l’intero
globo terrestre2.




       2.2 Google Earth Plugin

Accanto all’applicativo stand-alone, Google nel 2008 rilasciò il plugin del suddetto
software, consentendo in tal modo all’utente l’esplorazione del globo direttamente
all’interno del proprio browser web.




2
    http://earth.google.com/intl/it/userguide/v4/ug_importdata.html

                                                        6
2. Analisi


   2.3 Google Earth API: Javascript vs COM

In concomitanza al rilascio del plugin, Google mise a disposizione le API (Application
Programming Interface) Javascript necessarie agli sviluppatori che avessero voluto creare
applicazioni web proprie sfruttando le potenzialità di Google Earth. Queste andarono ad
affiancarsi alle API COM, fino a quel momento l’unico mezzo per chi avesse voluto
sviluppare codice su questo software, esistenti ancor prima che Keyhole divenisse Google
Earth. Sebbene quest’ultime fossero state mantenute anche dopo tale passaggio, non
godettero mai dello stesso supporto e documentazione che invece vantano le prime. La
difficoltà nel reperire informazioni e lo scarso supporto sono stati confermati dalla stessa
azienda statunitense, la quale nell’agosto 2010 ha annunciato che la versione 5.2 sarebbe
stata l’ultima a supportare le API COM:

“From the earliest days of Google Earth, (and even back when it was still called Keyhole,)
developers have wanted control over the globe to create their own 3D Earth applications.
In response to this need, the Keyhole team added a COM API to the Keyhole app, to allow
further customization of users’ Google Earth experience. When Keyhole became Google
Earth in 2005, this API was carried over. Though we never provided much support,
developers discovered the COM bindings and a few intrepid developers sorted through the
vagaries of COM programming. Eventually we had a small but committed development
community demanding documentation, which we released in 2007. We saw some
interesting uses for the COM API, particularly by Enterprise users and broadcasters.
Mostly, though, people wanted to put Earth in their web applications. In 2008, we released
the Google Earth API and browser plug-in. This robust JavaScript API is more powerful
than the COM API, and can be used on a variety of platforms to deliver compelling 3D
applications over the web based on the Google Earth technology. At the same time, we
stopped development on the COM API and began encouraging developers to migrate to
the Earth API instead. Today, more and more apps are being written in JavaScript, and
COM itself is no longer a widely used technology, so the time has come to retire the
Google Earth COM API. Today we’re announcing that the Google Earth 5.2 client will be
the last version that supports the COM API. […] We believe that the JavaScript API
provides the best mechanism for reaching the most developers. […] ” (Mano Marks, Geo
APIs Team).

Ai fini dell’applicativo quindi si è scelto di operare con le Javascript API. La
documentazione online è affiancata da numerosi esempi più o meno complessi, divisi per

                                             7
2. Analisi


categorie, e forum di supporto. Risalta l’assenza di indicazioni per lo sviluppatore che si
ponesse l’obiettivo di costruire applicazioni stand-alone anziché web.




   2.4 Il progetto PRTR

Il PRTR (Pollutant Release and Transfer Register) è un database contenente dati di
emissioni inquinanti. L’organizzazione responsabile del progetto è l’ICS (International
Centre for Science and High Technology) che agisce nell’ambito dell’UNIDO (United
Nations Industrial Development Organization). L’obiettivo dell’ente è sostenere le
comunità scientifiche nei Paesi in via di sviluppo e nei Paesi ad economia di transizione
attraverso attività di ricerca e formazione avanzata per la crescita industriale sostenibile. Le
competenze sviluppate al suo interno forniscono una serie di strumenti che trovano
applicazione in molteplici settori, quali: chimica pura ed applicata, scienze della terra
dell’ambiente e del mare, alta tecnologia e nuovi materiali.

Uno dei principali progetti dell’area ambientale dell’ICS/UNIDO è la distribuzione delle
conoscenze sui sistemi per il supporto decisionale. Lo scopo è la creazione di un centro di
raccolta di conoscenze atto a formare personale competente negli ambiti della simulazione
dei processi e nei sistemi di informazione geografici. In tal modo si sviluppa un
programma che possa favorire il monitoraggio dei sistemi, l’analisi e l’accertamento del
rischio, l’applicazione effettiva della tecnologia in risposta a problemi ambientali causati
da attività industriali. Rientra in questo ambito il progetto riguardante lo sviluppo di un
sistema pubblico per la raccolta e la divulgazione dei dati sugli inquinanti, il PRTR.
Progettato come un database ambientale, il Pollutant Release and Transfer Register
rappresenta un inventario di emissioni potenzialmente dannose riguardanti terra,
sottosuolo, acqua e aria, inoltre tiene conto del trasporto degli inquinanti in luoghi di
trattamento e discarica. Il PRTR si inserisce molto bene nella struttura organizzativa per lo
sviluppo industriale sostenibile, la conoscenza delle quantità delle sostanze emesse
consente di stimare l’equilibrio tra il materiale utilizzato per il processo e l’energia
impiegata per lo stesso, ottimo indicatore della sostenibilità di un processo industriale.
Inoltre i report registrando l’evoluzione delle emissioni nel tempo possono incoraggiare
l’introduzione di tecnologie più pulite al fine di ridurre il livello di inquinamento
ambientale.



                                               8
2. Analisi


I dati presenti nel Pollutant Release and Transfer Register presentano queste caratteristiche
principali:

    •   Riportati per ogni prodotto chimico;
    •   Riportati per ogni installazione industriale;
    •   Riportati per ogni emissione e trasferimento;
    •   Riportati per ogni elemento dell’ambiente (aria, acqua, terra);
    •   Periodici;
    •   Costantemente strutturati;
    •   Presenti su un database;
    •   Divulgati e costantemente disponibili al pubblico;
    •   Permettono il mantenimento dei segreti industriali.

Il progetto diffusosi su scala europea con il nome E-PRTR (European Pollutant Release
and Transfer Register) si identifica nel nostro Paese nell’INES (Inventario Nazionale delle
Emissioni e loro Sorgenti).




    2.5 Il database PRTR

Dal punto di vista tecnico, il DBMS utilizzato per il database PRTR contenente le
informazioni relative alle emissioni inquinanti è SQL Server 2005. Da precisare che il
laureando non ha partecipato alla stesura del relativo codice né a parte di esso, per quanto
riguarda il database ci si è soffermati sullo studio delle stored procedure, peraltro già
utilizzate dall’applicazione web esistente.

In particolare le seguenti:

    •   Statistics_GetByRegion: restituisce le emissioni chimiche in una determinata zona
        circolare del globo definita dalle coordinate geografiche del centro, dal raggio e dal
        periodo d’interesse;
    •   Statistics_GetByFacilityChemical: restituisce le emissioni di un determinato
        prodotto chimico di un determinato complesso in un determinato periodo;
    •   Statistics_GetByPeriod: analoga alla precedente, ma è possibile avere i dati relativi
        a tutti i complessi o a tutti i periodi inserendo NULL nei rispettivi parametri della
        procedura.


                                               9
2. Analisi


      2.5.1 Legge dei coseni sferici

Interessante inoltre la funzione GetDistance, utilizzata dalla prima delle procedure citate,
che torna la distanza d fra due punti sulla superficie terrestre definiti dalle rispettive
coordinate geografiche latitudine e longitudine mediante la legge dei coseni sferici3.




                      ∆ =              (                   +	                         ∆ )

                                                    = ∆




con

     : latitudine del punto 1

     : latitudine del punto 2

∆ : differenza delle longitudini

∆ : angolo centrale (il cui vertice è il centro della sfera e i cui lati intersecano la superficie
nei punti 1 e 2)

    : raggio della sfera




3
 Per ulteriori informazioni: (1) http://en.wikipedia.org/wiki/Great-circle_distance
(2) http://en.wikipedia.org/wiki/Spherical_law_of_cosines

                                                      10
3. Progettazione



                                  3. Progettazione


In questo capitolo si procede alla progettazione dell’applicativo mediante gli strumenti
forniti dal linguaggio UML. Creato con l’intento di unificare in un unico standard le
metodologie per il disegno nell’ambito della progettazione di sistemi software, l’UML
(Unified Modeling Language) stabilisce un insieme di notazioni e simboli, una collezione
di diagrammi composti da elementi grafici e testuali che consentono di descrivere il
sistema a più livelli d’astrazione.




   3.1 Use case diagram

Lo Use case diagram è lo strumento utilizzato per la descrizione delle funzionalità offerte
dal software dal punto di vista degli attori che interagiscono con il sistema stesso.




                                      Figura 3 - Use case diagram




Nel caso dell’applicativo in questione, si vuole che l’utente possa esplorare il globo alla
ricerca del punto d’interesse. Sono permesse diverse modalità di navigazione e ad egli
spetta la scelta di visualizzare o meno una serie di strumenti di supporto e di informazioni
aggiuntive. Una volta determinato il punto, procede alla selezione del periodo e del raggio


                                                 11
3. Progettazione


della circonferenza ideale di cui esso è il centro. Infine visualizza i dati relativi alle
emissioni inquinanti inerenti alla regione geografica prescelta.




   3.2 Activity diagram

L’Activity diagram descrive i processi alla base di una data funzionalità del software.
L’algoritmo pone in primo piano le singole attività evidenziando i sistemi responsabili che
intervengono nel corso dell’elaborazione.




         Figura 4 - Activity diagram riferito ai sistemi PRTR Google Earth Interface e Google Earth Server




Allo scopo di rendere il diagramma più comprensibile si è scelto di scinderlo nelle due
parti che caratterizzano l’algoritmo dell’applicativo. La prima di queste riguarda
l’interazione con il plugin di Google Earth (Figura 4),                       l’altra la connessione con il
database PRTR (Figura 5).

Nel dettaglio, la prima parte comprende le attività:

  i.   Ricerca per indirizzo/coordinate: l’utente inserisce nell’apposito campo l’indirizzo
       o, in alternativa, la coppia di coordinate geografiche della locazione desiderata;


                                                       12
3. Progettazione


     ii.   Verifica che indirizzo/coordinate e altezza della camera view4 siano ben formati:
           controllo sui dati immessi dall’utente. Nota: nel caso l’utente scelga di raggiungere
           il punto d’interesse mediante navigazione con il mouse, l’activity diagram non
           presenta tale attività;
    iii.   Rilocazione della camera view: vengono visualizzate le fotografie aeree o le
           immagini satellitari, a seconda del livello dello zoom, della località scelta
           dall’utente;
    iv.    Scelta del punto d'interesse: l’utente seleziona sulla mappa il punto d’interesse.




                Figura 5 - Activity diagram riferito ai sistemi PRTR Google Earth Interface e Prtr database




4
    Camera view : punto di vista dell’osservatore ideale.

                                                           13
3. Progettazione


La figura soprastante raffigura l’insieme delle attività riguardanti l’interazione con il
database PRTR, unita al primo diagramma rappresenta l’algoritmo completo alla base
dell’applicativo.

Tale parte si compone delle attività:

       i.   Apertura form emissioni inquinanti: una volta scelto il punto, si apre il form
            relativo alle emissioni inquinanti;
      ii.   Query: lista i periodi: per aiutare l’utente nella scelta si esegue una query sul
            database per visualizzare l’elenco dei periodi disponibili;
     iii.   Inserimento del raggio e selezione del periodo: egli procede all’inserimento del
            raggio ed alla scelta del periodo tra quelli presenti;
     iv.    Query: estrai prodotti chimici relativi a periodo e regione scelti: query per
            estrarre dal database i prodotti chimici relativi alla regione ed al periodo
            selezionati;
      v.    Scelta del prodotto chimico: l’utente seleziona tra i risultati della query
            precedente il prodotto chimico di cui desidera avere informazioni aggiuntive;
     vi.    Query: estrai lo storico del prodotto chimico scelto: in riferimento all’elemento
            chimico appena selezionato, tale query estrae i dati in relazione a tutti i periodi
            presenti nel database;
    vii.    Query: estrai lo storico dei relativi report: query per estrarre dal database
            l’elenco dei report, coppie impianto – periodo, dato il prodotto chimico;
   viii.    Scelta del report (coppia impianto - periodo): l’utente sceglie tra i risultati della
            query precedente il report d’interesse;
     ix.    Query: estrai i dati relativi a periodo, impianto e prodotto chimico scelti: dati il
            prodotto chimico ed il report, la query estrae dal database le informazioni
            riguardanti l’impianto, il report e ed il prodotto chimico dichiarato in esso.




   3.3 Class diagram

Utilizzando le strutture tipiche della programmazione ad oggetti, classi metodi ed attributi,
il Class diagram ritrae il sistema sotto l’aspetto delle entità che ne fanno parte.




                                               14
3. Progettazione




                                      Figura 6 - Class diagram




Al fine di non appesantire eccessivamente il diagramma, per ognuna delle classi sono stati
omessi gli attributi, per la cui lettura si rimanda al codice sorgente, ed i metodi, che si
analizzano qui di seguito.

Il progetto si compone di 5 classi:

   •   Program: entry point dell’applicativo.
   •   MainForm: form principale dell’applicazione, in esso l’utente può esplorare la
       mappa grazie al plugin di Google Earth integrato, scegliere se visualizzare o meno
       strumenti d’ausilio alla navigazione e informazioni aggiuntive in merito alla
       località inquadrata dalla camera view, e infine selezionare il punto. Sono presenti i
       controlli necessari a navigare sino al punto d’interesse tramite il suo indirizzo e
       strutture analoghe per farlo tramite coordinate geografiche. Dal form principale si
       può accedere agli altri.
   •   InfoForm: semplice form per la visualizzazione della versione di Google Earth
       Plugin installata sulla macchina e del programma.
   •   PointForm: classe del form relativo alle emissioni, da qui l’utente una volta
       selezionato il punto procede alla scelta del periodo e del raggio della regione
       circolare d’interesse. Quindi visualizza i risultati delle query mediante tabelle e
       grafici.
   •   DecimalToSexagesimal: converte le coordinate geografiche dalla forma decimale
       alla notazione sessagesimale e fornisce i metodi per la lettura dei nuovi valori. La
       conversione è necessaria dal momento che le API di Google Earth forniscono
       metodi i cui parametri e valori di ritorno sono decimali mentre sul database PRTR
       le coordinate dei punti sono memorizzate in forma sessagesimale. Quest’ultimo

                                                15
3. Progettazione


       formato è stato scelto per quanto riguarda la visualizzazione delle coordinate
       geografiche sull’interfaccia dell’applicativo, per favorire una lettura ed un
       inserimento dei valori più semplice per l’utente.

La classe Program presenta il metodo:

   •   Main() : void
       Apre il form principale.

La classe MainForm presenta i metodi:

   •   InternetConnection() : bool
       Verifica lo stato della connessione internet.
   •   exitToolStripMenuItem_Click(object sender, EventArgs e) : void
       Exit point dell’applicazione.
   •   MainForm_Load(object sender, EventArgs e) : void
       Carica il form principale.
   •   jsInitSuccess(object instance) : void
       L’istanza di Google Earth Plugin è stata creata correttamente, inizializza il plugin.
   •   jsInitFailure(String error) : void
       L’istanza di Google Earth Plugin non è stata creata, stampa un messaggio d’errore.
   •   bGo_Click(object sender, EventArgs e) : void
       Ricerca la locazione desiderata per indirizzo.
   •   eventLatLngAlt(float lat, float lng, float alt) : void
       Aggiorna sulla barra di stato le coordinate del cursore sulla mappa.
   •   validateCoord(TextBox i, int low, int up, String coord, String unit) : int
       Verifica che le coordinate immesse dall’utente siano ben formate.
   •   bGoCoord_Click(object sender, EventArgs e) : void
       Ricerca la locazione desiderata per coordinate.
   •   tAltAdd_TextChanged(object sender, EventArgs e) : void
       Verifica il valore dell’altezza della camera view (dialog box di ricerca per
       indirizzo).
   •   tAltCoord_TextChanged(object sender, EventArgs e) : void
       Verifica il valore dell’altezza della camera view (dialog box di ricerca per
       coordinate).
   •   tLatDeg_TextChanged(object sender, EventArgs e) : void

                                               16
3. Progettazione


    Verifica il valore dei gradi di latitudine.
•   tLatMin_TextChanged(object sender, EventArgs e) : void
    Verifica il valore dei minuti di latitudine.
•   tLatSec_TextChanged(object sender, EventArgs e) : void
    Verifica il valore dei secondi di latitudine.
•   tLngDeg_TextChanged(object sender, EventArgs e) : void
    Verifica il valore dei gradi di longitudine.
•   tLngMin_TextChanged(object sender, EventArgs e) : void
    Verifica il valore dei minuti di longitudine.
•   tLngSec_TextChanged(object sender, EventArgs e) : void
    Verifica il valore dei secondi di longitudine.
•   menuRoads_CheckedChanged(object sender, EventArgs e) : void
    Visualizza/nasconde il layer relativo alla rete stradale.
•   menuBorders_CheckedChanged(object sender, EventArgs e) : void
    Visualizza/nasconde il layer relativo ai confini internazionali.
•   menuTerrain_CheckedChanged(object sender, EventArgs e) : void
    Visualizza il terreno in 2D/3D.
•   menuNavControl_CheckedChanged(object sender, EventArgs e) : void
    Visualizza/nasconde il navigation control.
•   menuStatusBar_CheckedChanged(object sender, EventArgs e) : void
    Visualizza/nasconde la status bar.
•   menuGrid_CheckedChanged(object sender, EventArgs e) : void
    Visualizza/nasconde una griglia rappresentante meridiani e paralleli.
•   gotoProgressBar(float progress) : void
    Aggiorna la barra di progresso.
•   tAdd_KeyPress(object sender, KeyPressEventArgs e) : void
    Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
•   tAltAdd_KeyPress(object sender, KeyPressEventArgs e) : void
    Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
•   tLatDeg_KeyPress(object sender, KeyPressEventArgs e) : void
    Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
•   tLatMin_KeyPress(object sender, KeyPressEventArgs e) : void
    Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
•   tLatSec_KeyPress(object sender, KeyPressEventArgs e) : void

                                           17
3. Progettazione


       Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
   •   tLngDeg_KeyPress(object sender, KeyPressEventArgs e) : void
       Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
   •   tLngMin_KeyPress(object sender, KeyPressEventArgs e) : void
       Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
   •   tLngSec_KeyPress(object sender, KeyPressEventArgs e) : void
       Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
   •   tAltCoord_KeyPress(object sender, KeyPressEventArgs e) : void
       Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
   •   menuInfo_Click(object sender, EventArgs e) : void
       Apre il form informazioni.
   •   eventLatLng(float lat, float lng) : void
       Apre il form emissioni.
   •   cbEnablePoint_CheckedChanged(object sender, EventArgs e) : void
       Abilita/disabilita la navigazione sulla mappa.

La classe InfoForm presenta il metodo:

   •   bOkInfo_Click(object sender, EventArgs e) : void
       Chiude il form.

La classe PointForm presenta i metodi:

   •   loadEmissionPeriods() : void
       Carica la combobox con l’elenco dei periodi.
   •   bOkPoint_Click(object sender, EventArgs e) : void
       Chiude il form.
   •   bSubmitQuery_Click(object sender, EventArgs e) : void
       Carica la tabella relativa alle emissioni.
   •   dgvRegionalEmissionDesign() : void
       Disegna la tabella relativa alle emissioni.
   •   dgvRegionalEmission_CellMouseClick(object sender,
       DataGridViewCellMouseEventArgs e) : void
       Disegna i grafici e carica la seconda scheda del form.
   •   loadDataGridViewdgvPeriod() : void
       Carica la tabella relativa ai periodi.

                                                18
3. Progettazione


   •   dgvPeriodDesign() : void
       Disegna la tabella relativa ai periodi.
   •   loadDataGridViewdgvPeriodFacility() : void
       Carica la tabella relativa ai report.
   •   dgvPeriodFacilityDesign() : void
       Disegna la tabella relativa ai report.
   •   dgvPeriodFacility_CellMouseClick(object sender,
       DataGridViewCellMouseEventArgs e) : void
       Carica la terza scheda del form.
   •   tRange_KeyPress(object sender, KeyPressEventArgs e) : void
       Sposta il cursore nel controllo successivo alla pressione del tasto Invio.
   •   cbPeriod_KeyPress(object sender, KeyPressEventArgs e) : void
       Sposta il cursore nel controllo successivo alla pressione del tasto Invio.

La classe DecimalToSexagesimal presenta i metodi:

   •   getLatDeg() : int
       Restituisce il valore dei gradi di latitudine.
   •   getLatMin() : int
       Restituisce il valore dei minuti di latitudine.
   •   getLatSec() : int
       Restituisce il valore dei secondi di latitudine.
   •   getLngDeg() : int
       Restituisce il valore dei gradi di longitudine.
   •   getLngMin() : int
       Restituisce il valore dei minuti di longitudine.
   •   getLngSec() : int
       Restituisce il valore dei secondi di longitudine.

Infine, per quanto riguarda il form principale, questo contiene una pagina html con uno
script per il caricamento e la gestione di Google Earth Plugin.

Sono presenti le funzioni:

   •   init()
       Crea un’istanza di Google Earth Plugin.


                                                 19
3. Progettazione


•   success(instance)
    L’istanza di Google Earth Plugin è stata creata correttamente, inizializza il plugin.
•   failure(errorCode)
    L’istanza di Google Earth Plugin non è stata creata, restisuisce una stringa che
    descrive l’errore.
•   goToAddress(address, altitude)
    Ricerca la locazione desiderata per indirizzo.
•   goToCoordinates(latitude, longitude, altitude)
    Ricerca la locazione desiderata per coordinate.
•   geEventListener(kmlEvent)
    Restituisce le coordinate del cursore sulla mappa, funzione legata all’evento
    mousemove.
•   timerStreamingPercent()
    Restituisce la percentuale di caricamento dell’immagine attualmente inquadrata
    dalla camera view.
•   geEventPoint (kmlEvent)
    Restituisce le coordinate del cursore sulla mappa, funzione legata all’evento
    mouseup.




                                          20
4. Interfaccia



                                     4. Interfaccia


Nel presente capitolo si descrive l’interfaccia dell’applicativo, partendo dall’analisi dei
form che lo compongono, quindi dei rispettivi singoli componenti ed infine nel suo
complesso, mediante un esempio d’utilizzo.




   4.1 Form principale

Il form principale contiene gli strumenti per consentire all’utente di selezionare il punto di
suo interesse.




                              Figura 7 - Form principale dell'applicativo




                                                 21
4. Interfaccia


La struttura prevede:

    •    Barra dei menu
    •    Barra di stato
    •    Dialog box per la ricerca tramite indirizzo
    •    Dialog box per la ricerca tramite coordinate geografiche
    •    Google Earth Plugin integrato




    4.1.1 Barra dei menu

La barra dei menu è divisa in tre categorie File, View, ?. La prima rappresenta le funzioni
necessarie al caricamento ed alla chiusura dell’applicazione; la seconda fornisce un elenco
di strumenti d’ausilio alla navigazione; la terza riguarda le informazioni sull’applicativo.

    •    File
             o New: riavvia l’applicazione ricaricando il plugin ed i valori di default;
             o Exit: esce dall’applicazione;
    •    View
             o Navigation Control: visualizza/nasconde il controllo mediante il quale è
                  possibile variare i parametri di zoom, tilt5 e azimut6;
             o Status Bar: visualizza/nasconde il controllo che fornisce dati relativi alle
                  coordinate geografiche e all’altitudine del punto in corrispondenza del
                  puntatore sulla mappa e all’altezza della camera view;
             o Grid: visualizza/nasconde una griglia rappresentante meridiani e paralleli la
                  cui definizione varia a seconda dello zoom;
             o Roads: visualizza/nasconde il layer relativo alla rete stradale, maggiore è lo
                  zoom e migliore è il livello di dettaglio;
             o Borders: visualizza/nasconde il layer relativo ai confini internazionali;
             o Terrain: visualizza il territorio in 2D/3D;
    •    ?
             o Info: apre il form contenente informazioni sulla versione dell’applicativo e
                 di Google Earth Plugin.
5
 Tilt : distanza angolare compresa tra la verticale di un punto e la direzione della camera view.
6
 Azimut : distanza angolare compresa tra la direzione del Nord e la direzione in cui cade la perpendicolare di
un punto all’orizzonte, calcolata muovendosi in senso orario (cit. Wikipedia). Nello specifico, la distanza
angolare tra la direzione del Nord e la direzione della camera view.

                                                     22
4. Interfaccia




                                      Figura 8 - Barra dei menu




   4.1.2 Barra di stato

La barra di stato mostra la latitudine, la longitudine e l’altitudine del punto sulla mappa in
corrispondenza del puntatore del mouse.
Inoltre contiene una barra di caricamento visibile in fase di download delle immagini.




                                       Figura 9 - Barra di stato




   4.1.3 Dialog box per la ricerca tramite indirizzo

Una delle possibilità che l’utente può sfruttare per la localizzazione di un punto è la ricerca
per indirizzo. Sono presenti controlli per prevedere input errati nel textbox relativo
all’altezza da terra della camera view, ovverosia maggiori di 10.000 km e negativi. Per
semplificare e velocizzare la ricerca, è possibile passare da un controllo al successivo
mediante la pressione del tasto Invio.




                                 Figura 10 - Ricerca tramite indirizzo

                                                 23
4. Interfaccia


   4.1.4 Dialog box per la ricerca tramite coordinate geografiche

In alternativa al primo metodo, l’utente può rilocare la camera view mediante l’inserimento
delle coordinate del punto d’interesse. Anche in questo caso sono presenti controlli che
verificano la validità dei valori inseriti dall’utente. Come nel caso precedente, l’altezza da
terra della camera view deve essere compresa tra 0 e 10.000 km, i campi relativi ai minuti
ed ai secondi possono contenere interi da 0 a 59, quello della latitudine da -90 a 90, della
longitudine da -180 a 180. Inoltre vengono sottoposte a verifica anche le coordinate nel
loro complesso, per evitare che l’utente inserisca, ad esempio, una latitudine 90° 24’55”:
sebbene siano validi i singoli valori, questa è maggiore di 90°. Analogamente a quanto
accade nel primo dialog box, l’utente può spostarsi di controllo in controllo premendo
Invio.




                          Figura 11 - Ricerca tramite coordinate geografiche




   4.1.5 Google Earth Plugin integrato

Il componente principale del form è il plugin di Google Earth, su di esso l’utente ha la
facoltà di navigare e modificare parametri quali lo zoom e il tilt nello stesso modo in cui
può farlo nell’applicazione Google Earth. Una volta scelto il punto, per procedere alla
selezione di questo deve mettere la spunta sul checkbox a lato e quindi cliccare sulla
mappa.




                                                 24
4. Interfaccia




            Figura 12 - Google Earth Plugin e il checkbox per procedere con la selezione del punto




   4.2 Form informazioni

Nel form informazioni è possibile visualizzare la versione del programma, delle Javascript
API e del plugin di Google Earth attualmente installato sul pc.




                                        Figura 13 - Form informazioni

                                                     25
4. Interfaccia


   4.3 Form emissioni

Il form emissioni presenta i dati relativi alle emissioni inquinanti, ovvero i risultati delle
query sul database PRTR.




                                    Figura 14 - Form emissioni



La struttura prevede una navigazione per schede:
   •   Regional emissions: contiene il dettaglio delle emissioni nella regione circolare
       scelta dall’utente;
   •   Chemical info: presenta lo storico del prodotto chimico selezionato nella prima
       scheda ed i report in cui è presente;
   •   Facility info: elenca le informazioni relative al report selezionato nella scheda
       precedente.




                                               26
4. Interfaccia


   4.3.1 Scheda Regional emissions

Nella scheda Regional emissions è presente un dialog box in cui l’utente deve selezionare
da una combobox il periodo d’interesse ed inserire il raggio in chilometri della
circonferenza il cui centro è il punto scelto precedentemente sulla mappa. Il risultato della
query viene evidenziato in una tabella che elenca i prodotti chimici dichiarati nei report dei
complessi la cui locazione è all’interno dell’ideale circonferenza.

Per ogni prodotto si indica la quantità di emissioni (in kg) in:
   •   Aria
   •   Sottosuolo
   •   Acqua
   •   Terra
   •   Totale

In fondo alla scheda è visualizzato il grafico relativo al prodotto chimico del record
selezionato.




                         Figura 15 - Form emissioni, scheda Regional emissions


                                                 27
4. Interfaccia


    4.3.2 Scheda Chemical info

Nella scheda Chemical info l’utente può avere informazioni aggiuntive sul prodotto
chimico selezionato tramite una tabella che ne rappresenta lo storico. Sono infatti elencati i
valori delle emissioni divisi per i periodi dei report in cui il prodotto compare. Il risultato
di tale query è rappresentato anche da un diagramma a colonne, al di sotto del quale
un’altra tabella elenca i report, visualizzandoli mediante il nome del complesso che lo ha
stilato ed il periodo a cui il contenuto fa riferimento.




                            Figura 16 - Form emissioni, scheda Chemical info




    4.3.3 Scheda Facility info

La terza scheda, Facility info, evidenzia informazioni riguardanti il report selezionato
precedentemente, quindi sul complesso che lo ha stilato e sui valori delle emissioni del
prodotto chimico scelto dall’utente nella prima scheda.

Del complesso si forniscono:

                                                  28
4. Interfaccia


    •   Indirizzo
    •   Città
    •   E-mail
    •   Telefono
    •   Sito internet
    •   Nome della compagnia

Per quanto riguarda il prodotto chimico, il tipo di informazioni visualizzate ricalca quanto
visto finora, ovverosia i valori in kg delle emissioni nell’aria, nel sottosuolo, nell’acqua,
sulla terra e in totale.




                             Figura 17 - Form emissioni, scheda Facility info




    4.4         Esempio d’utilizzo

L’utente vuole avere informazioni riguardo alle emissioni inquinanti nel raggio di 100 km
dall’edificio centrale dell’Università di Trieste, dati riferiti all’anno 2000.

                                                   29
4. Interfaccia


    •   Eseguito l’applicativo e caricatosi il plugin di Google Earth, nel primo dialog box
        inserisce l’indirizzo, “P.le Europa, Trieste, Italia”, e l’altezza della camera view,
        400 metri. Quindi preme il bottone Fly to!;
    •   Una volta caricata la mappa, mette la spunta sul checkbox e procede alla selezione
        del punto con un click in corrispondenza dell’edificio centrale;
    •   Nella prima scheda del form che in seguito compare, seleziona “Year 2000” nella
        combobox relativa al periodo, inserisce “100” nella textbox riferita al raggio e
        preme Submit Query;
    •   La tabella sottostante elenca i dati riguardanti le emissioni, selezionando uno dei
        record può accedere alle informazioni della seconda e terza scheda del form.




    4.5       PRTR Google Earth Interface: requisiti per
            l’installazione

L’applicativo presenta i seguenti requisiti per l’installazione:

    •   Risoluzione dello schermo minima: 1024 x 768;
    •   Google Earth Plugin7 versione 6 preinstallato, nel caso fosse installato anche
        Google Earth8 assicurarsi che sia aggiornato alla stessa versione.
        Per i requisiti di tali applicazioni si rimanda ai rispettivi siti;
    •   Microsoft Chart Controls for Microsoft .NET Framework 3.59;
    •   Microsoft .NET Framework.




7
  Per il download: http://www.google.com/intl/it/earth/explore/products/plugin.html
8
  Per il download: http://www.google.com/earth/index.html
9
  Per il download: http://www.microsoft.com/downloads/en/details.aspx?FamilyId=130F7986-BF49-4FE5-
9CA8-910AE6EA442C

                                                 30
5. Implementazione



                               5. Implementazione


In questo capitolo viene descritta l’implementazione dell’applicativo, il cui codice è stato
scritto per intero dal laureando eccezion fatta per le righe generate automaticamente
dall’IDE utilizzato. Qui di seguito vengono presentate nel dettaglio le parti salienti
dell’applicativo, si tralasciano quelle riguardanti l’aspetto grafico o la gestione delle
eccezioni mediante blocchi try-catch-finally o funzioni di minor interesse, per la lettura
delle quali si rimanda al listato sorgente.




     5.1       Tecnologie software utilizzate

Dall’analisi dei vincoli di progetto si apprende che l’applicativo deve essere stand-alone ed
integrare le funzionalità di Google Earth, le cui API però nascono con l’obiettivo di
consentire agli sviluppatori di scrivere applicazioni web. Ne consegue la necessità di
scrivere due parti di codice distinte e quindi di integrarle mediante gli strumenti opportuni.
A tale scopo, si è scelto di utilizzare Javascript per quanto riguarda il plugin e C# per
l’applicativo stand-alone all’interno del quale il primo deve essere integrato. Quali
strumenti di supporto allo sviluppo sono stati utilizzati Notepad++ versione 5 e Visual
Studio 2008.




     5.2       Codice

     5.2.1 Caricamento di Google Earth Plugin

Il seguente codice è tratto dal file GEPlugin.html, include le istruzioni di caricamento del
plugin, le funzioni di inizializzazione e di gestione della camera view.




1.     <html>
2.     <head>
3.              <title>Google Earth Plugin</title>
4.              <script src="https://www.google.com/jsapi?key=ABCDEF"></script>
5.              <script type="text/javascript">

                                              31
5. Implementazione


6.          var ge;
7.          google.load("earth", "1");
8.          google.load("maps", "2");
9.
10.         function init() {
11.                 google.earth.createInstance('mapContainer', success,
      failure);
12.         }
13.
14.         function success(instance) {
15.                 ge = instance;
16.                 [...]
17.                 window.external.jsInitSuccess(instance);
18.         }
19.
20.         function goToAddress(address, altitude) {
21.                 var geocoder = new google.maps.ClientGeocoder();
22.                 geocoder.getLatLng(address, function(point) {
23.                         if (point) {
24.                               var lookAt = ge.createLookAt('');
25.                               lookAt.set(point.y, point.x, altitude,
      ge.ALTITUDE_RELATIVE_TO_GROUND, 0, 0, 0);
26.                               ge.getView().setAbstractView(lookAt);
27.                         }
28.                 });
29.         }
30.
31.         function goToCoordinates(latitude, longitude, altitude) {
32.                 var lookAt = ge.createLookAt('');
33.                 lookAt.set(latitude, longitude, altitude,
      ge.ALTITUDE_RELATIVE_TO_GROUND, 0, 0, 0);
34.                 ge.getView().setAbstractView(lookAt);
35.         }
36.
37.         [...]
38.
39.         </script>
40.   </head>
41.   <body onload="init()">
42.         <div id="mapContainer" style="width: 100%; height: 100%;"></div>
43.   </body>
44.   </html>




                                           32
5. Implementazione


Per poter caricare il plugin è necessario completare l’url con la propria Maps API Key
ottenibile gratuitamente sul sito, in questo caso è stata utilizzata una chiave d’esempio
“ABCDEF” (riga 4). Quindi vengono caricate le API di Google Earth (7) e di Google
Maps (8). Il metodo che consente di creare una nuova istanza del plugin (11) prevede tra i
suoi parametri il nome delle procedure da invocare nel caso l’operazione dovesse fallire o
avere successo (14). In quest’ultimo caso l’istanza viene passata al metodo esterno,
definito nell’applicativo, per permettere l’utilizzo dei metodi forniti dalle API anche in tale
sede. Le funzioni goToAddress (20) e goToCoordinates (31) vengono invocate
dall’esterno, si sottolinea l’utilizzo da parte della prima delle Google Maps API versione 2
per la creazione di un’istanza ClientGeocoder (21) e l’invocazione su questa del metodo
getLatLng (22).




      5.2.2 Integrazione di Google Earth Plugin

Il codice che segue è presente nella classe MainForm dell’applicativo, si evidenziano le
parti relative all’integrazione del plugin all’interno del form principale.




1.      String pluginUrl =
        Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetModules()[0].Full
        yQualifiedName) + "GEPlugin.html";
2.      private IGEPlugin ge = null;
3.
4.      private void MainForm_Load(object sender, EventArgs e)
5.      {
6.             [...]
7.             wbGE.Navigate(pluginUrl);
8.             wbGE.ObjectForScripting = this;
9.             [...]
10.     }
11.
12.     public void jsInitSuccess(object instance)
13.     {
14.            [...]
15.            ge = (IGEPlugin)instance;
16.            [...]
17.     }




                                              33
5. Implementazione


Il controllo WebBrowser consente di inserire una pagina web in un form, quindi si presta
ottimamente per l’applicativo in questione. Il metodo Navigate carica il documento
indicato come parametro (riga 7), il cui percorso viene composto runtime tramite reflection
(1). L’operazione successiva è impostare l’oggetto accessibile dal codice contenuto nella
pagina web caricata nel WebBrowser, in questo caso il form stesso, tramite la proprietà
ObjectForScripting10 (8). Il metodo jsInitSuccess (12) è invocato dalla pagina una volta
creata una nuova istanza del plugin.




      5.2.3 Chiamata ad un metodo esterno

Il seguente metodo, tratto anch’esso dalla classe MainForm, è legato all’evento pressione
del tasto Fly to! relativo al dialog box di ricerca per coordinate.




1.         private void bGoCoord_Click(object sender, EventArgs e)
2.         {
3.                 [...]
4.                 // validazione dei valori delle coordinate immessi dall’utente
5.                 // conversione dalle coordinate sessagesimali alle decimali
6.                 [...]
7.                 wbGE.Document.InvokeScript("goToCoordinates", new object[] { lat,
           lng, alt });
8.         }




10
     Proprietà WebBrowser.ObjectForScripting : Utilizzare questa proprietà per abilitare la comunicazione tra
una pagina Web inserita nel controllo WebBrowser e l'applicazione che contiene il controllo WebBrowser.
La proprietà consente di integrare codice HTML dinamico (DHTML) con il codice dell'applicazione client.
L'oggetto specificato per questa proprietà è disponibile per lo script della pagina Web come oggetto
window.external, che è un oggetto DOM incorporato fornito per l'accesso all'host. È possibile impostare
questa proprietà su qualsiasi oggetto visibile a COM le cui proprietà e i cui metodi pubblici devono essere
resi disponibili al codice di script (cit. http://msdn.microsoft.com/it-it/library).
COM (Component Object Model) : interfaccia per componenti software, permette la comunicazione tra
processi e creazione dinamica di oggetti con qualsiasi linguaggio di programmazione che supporta questa
tecnologia.

                                                         34
5. Implementazione


Si tralasciano le righe di codice riguardanti il controllo di validità dei valori immessi
dall’utente e la conversione dalla notazione sessagesimale, presente nell’interfaccia, a
quella decimale, richiesta dalle API di Google, nel codice rappresentata dalle variabili lat
lng. Si sottolinea il metodo InvokeScript (riga 7) il cui compito è l’esecuzione di una
funzione definita in una pagina web, in questo caso nel documento integrato nel form
tramite il controllo WebBrowser. I parametri del metodo sono rispettivamente il nome della
funzione esterna ed un array di object rappresentante i parametri di quest’ultima.




      5.2.4 Conversione di coordinate e aggiornamento della
            posizione del puntatore

Nella barra di stato del form principale sono visualizzati i valori di latitudine, longitudine e
altitudine relativi alla posizione del puntatore sulla mappa. Sfruttando le Google Earth API
è possibile risalire alle coordinate del punto in formato decimale, per la loro
visualizzazione sull’interfaccia si richiede una conversione. Di seguito vengono presentate
e descritte le classi e le funzioni che entrano in gioco in questo contesto.




1.      public class DecimalToSexagesimal
2.      {
3.             private int latDeg, latMin, latSec, lngDeg, lngMin, lngSec;
4.
5.             public DecimalToSexagesimal(float lat, float lng)
6.             {
7.                     latDeg = (int)Math.Truncate(lat);
8.                     latMin = (int)Math.Abs(Math.Truncate((lat - latDeg) * 60));
9.                     latSec = (int)Math.Truncate((Math.Abs((lat - latDeg) * 60) -
        latMin) * 60);
10.                    lngDeg = (int)Math.Truncate(lng);
11.                    lngMin = (int)Math.Abs(Math.Truncate((lng - lngDeg) * 60));
12.                    lngSec = (int)Math.Truncate((Math.Abs((lng - lngDeg) * 60) -
        lngMin) * 60);
13.            }
14.
15.            public int getLatDeg()
16.            {
17.                    return latDeg;
18.            }
19.


                                              35
5. Implementazione


20.            public int getLatMin()
21.            {
22.                     return latMin;
23.            }
24.
25.            public int getLatSec()
26.            {
27.                     return latSec;
28.            }
29.
30.            public int getLngDeg()
31.            {
32.                     return lngDeg;
33.            }
34.
35.            public int getLngMin()
36.            {
37.                     return lngMin;
38.            }
39.
40.            public int getLngSec()
41.            {
42.                     return lngSec;
43.            }
44.    }




La classe DecimalToSexagesimal è di supporto all’applicativo, dal quale viene utilizzata
nel momento in cui è necessaria una conversione di rappresentazione di coordinate. I
parametri del costruttore sono i valori decimali della latitudine e della longitudine, per
quanto riguarda i metodi forniti dalla classe sono semplici get sui singoli componenti delle
coordinate in formato sessagesimale. Si nota che l’applicativo tratta i secondi come numeri
interi, tale semplificazione non rappresenta un’approssimazione rilevante per i successivi
calcoli delle distanze, data la formula utilizzata dal database per il calcolo. Questa infatti
basandosi sulla legge dei coseni sferici introduce errori di approssimazione considerando la
Terra come una sfera.




1.     public void eventLatLngAlt(float lat, float lng, float alt)
2.     {
3.             DecimalToSexagesimal dts = new DecimalToSexagesimal(lat, lng);

                                             36
5. Implementazione


4.            [...]
5.            ssLat.Text = ssLat.Text + dts.getLatDeg() + "° " + dts.getLatMin() +
       "' " + dts.getLatSec() + """;
6.            ssLng.Text = ssLng.Text + dts.getLngDeg() + "° " + dts.getLngMin() +
       "' " + dts.getLngSec() + """;
7.            ssAlt.Text = Math.Round(alt, 2).ToString() + " meters";
8.     }




Il metodo eventLatLngAlt fa parte della classe MainForm, esso crea un oggetto di tipo
DecimalToSexagesimal ed un riferimento ad esso (riga 3), trasforma le coordinate ricevute
dall’esterno in formato decimale quindi le visualizza nelle label della barra di stato in
formato sessagesimale.




1.     function success(instance) {
2.            ge = instance;
3.            [...]
4.            google.earth.addEventListener(ge.getWindow(), "mousemove",
       geEventListener);
5.            [...]
6.     }
7.
8.     function geEventListener(kmlEvent) {
9.            var latitude = kmlEvent.getLatitude();
10.           var longitude = kmlEvent.getLongitude();
11.           var altitude = kmlEvent.getAltitude();
12.           window.external.eventLatLngAlt(latitude, longitude, altitude);
13.    }




Il codice è tratto dal file GEPlugin.html, la pagina web caricata nel form. La funzione
geEventListener è chiamata dall’evento mousemove sulla mappa (riga 4) e a sua volta
chiama il metodo eventLatLngAlt della classe MainForm (12), oggetto reso disponibile
precedentemente tramite la proprietà ObjectForScripting e raggiungibile ora come oggetto
window.external.




                                           37
5. Implementazione


      5.2.5 Connessione al database ed esecuzione di una query

Il seguente metodo è tratto dalla classe PointForm e provvede al popolamento della
combobox con l’elenco dei periodi presenti sul database PRTR.




1.        private void loadEmissionPeriods()
2.        {
3.               SqlConnection connection = new SqlConnection();
4.               connection.ConnectionString =
          ConfigurationSettings.AppSettings["connectionString"];
5.               connection.Open();
6.               String query = "SELECT * FROM ReportPeriod ORDER BY EndDate DESC";
7.               SqlCommand command = new SqlCommand(query, connection);
8.               SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
9.               DataTable tablePeriod = new DataTable();
10.              dataAdapter.Fill(tablePeriod);
11.              for (int i = 0; i < tablePeriod.Rows.Count; i++)
12.              {
13.                         String period = tablePeriod.Rows[i]["Title"].ToString();
14.                         cbPeriod.Items.Add(period);
15.              }
16.              cbPeriod.SelectedIndex = 0;
17.              [...]
18.              connection.Close();
19.       }




Per la connessione ad un database è necessaria una connection string che raccolga le
informazioni per la connessione, la cui formattazione dipende dal DBMS in cui risiede il
database, nel caso in questione SQL Server 2005. La stringa di connessione di
conseguenza prevede:

      •   Data Source
      •   Network Library
      •   Initial Catalog
      •   User Id
      •   Password



                                               38
5. Implementazione


Si tratta rispettivamente di: indirizzo del server e porta sulla quale è in ascolto, protocollo
utilizzato per la connessione, nome del database e credenziali dell’utente. Per far sì che
queste informazioni possano venire modificate senza la necessità di ricompilare il progetto,
sono state inserite in un file di configurazione a cui il programma accede nel momento in
cui deve impostare la proprietà ConnectionString ad un riferimento di tipo SqlConnection
(riga 4). DataTable rappresenta una tabella di dati in memoria, e grazie al metodo fill
invocato su un oggetto di tipo SqlDataAdapter, il tramite fra Sql Server e la tabella locale, i
dati locali vengono modificati per farli corrispondere a quelli originali, ovverosia la tabella
viene riempita (10).

Qui di seguito il contenuto del file di configurazione.




1.     <?xml version="1.0" encoding="utf-8" ?>
2.     <configuration>
3.             <appSettings>
4.                     <add key="connectionString" value="Data
       Source=140.105.127.92,1433; Network Library=DBMSSOCN; Initial
       Catalog=PRTR; User Id=********; Password=********;"/>
5.             </appSettings>
6.     </configuration>




     5.2.6 Esecuzione di una stored procedure

Il seguente codice rappresenta il metodo lanciato alla pressione del tasto Submit Query sul
form emissioni. Compito del metodo è stabilire una connessione con il database ed
eseguire la stored procedure Statistics_GetByRegion.




1.     private void bSubmitQuery_Click(object sender, EventArgs e)
2.     {
3.             SqlConnection connection = new SqlConnection();
4.             connection.ConnectionString =
       ConfigurationSettings.AppSettings["connectionString"];
5.             connection.Open();
6.             SqlCommand command = new SqlCommand("Statistics_GetByRegion",
       connection);



                                              39
5. Implementazione


7.               command.CommandType = CommandType.StoredProcedure;
8.               command.Parameters.Add("@LongitudeDeg", SqlDbType.Int).Value =
          lngDeg;
9.               command.Parameters.Add("@LongitudeMin", SqlDbType.Int).Value =
          lngMin;
10.              command.Parameters.Add("@LongitudeSec", SqlDbType.Int).Value =
          lngSec;
11.              command.Parameters.Add("@LatitudeDeg", SqlDbType.Int).Value =
          latDeg;
12.              command.Parameters.Add("@LatitudeMin", SqlDbType.Int).Value =
          latMin;
13.              command.Parameters.Add("@LatitudeSec", SqlDbType.Int).Value =
          latSec;
14.              command.Parameters.Add("@Range", SqlDbType.Float).Value =
          Int32.Parse(tRange.Text);
15.              command.Parameters.Add("@CultureCode", SqlDbType.NVarChar).Value =
          "en-US";
16.              command.Parameters.Add("@IDPeriod", SqlDbType.Int).Value =
          tablePeriod.Rows[cbPeriod.SelectedIndex].ItemArray[0];
17.              SqlDataAdapter dataAdapter = new SqlDataAdapter(command);
18.              DataTable table = new DataTable();
19.              dataAdapter.Fill(table);
20.              [...]
21.              connection.Close();
22.       }




Invocato il costruttore di SqlCommand con il nome della stored procedure ed il riferimento
alla connessione (riga 6) ed impostata la proprietà CommandType su StoredProcedure (7),
si impostano i parametri richiesti. Nel caso specifico si utilizza la stored procedure
Statistics_GetByRegion, che richiede:

      •   Gradi di longitudine
      •   Minuti di longitudine
      •   Secondi di longitudine
      •   Gradi di latitudine
      •   Minuti di latitudine
      •   Secondi di latitudine
      •   Raggio della circonferenza d’interesse
      •   Codice della lingua utilizzata


                                              40
5. Implementazione


   •      Periodo selezionato nella combobox

Per ulteriori informazioni sul database PRTR si rimanda alla documentazione tecnica dello
stesso.




                                               41
6. Conclusioni



                                    6. Conclusioni


    6.1      Risultati ottenuti

I risultati ottenuti rispettano i vincoli di progetto discussi in fase di analisi. L’applicativo
stand-alone creato integra Google Earth Plugin e per la visualizzazione dei dati di
emissioni inquinanti si connette direttamente al database PRTR. La query sul database è
riferita ad una regione circolare di territorio per la selezione della quale all’utente è
richiesto un click sulla mappa per la determinazione del centro e l’inserimento manuale del
valore del raggio.

Tuttavia l’applicativo soffre di un bug presente nella struttura del database in questione. La
tabella Facility, contenente informazioni riguardo ai complessi, memorizza la dislocazione
sul territorio di tali infrastrutture con coordinate geografiche in formato sessagesimale,
dedicando tre campi distinti a gradi, minuti e secondi. Ciò introduce un errore nel momento
in cui si aggiunge un complesso le cui coordinate, longitudine o latitudine, sono incluse
nell’intervallo tra -0° 0’ 1” e -0° 59’ 59”. Nel campo riferito ai gradi infatti non viene
riconosciuto il segno dello zero il che comporta un’ambiguità nell’intervallo tra -0° 59’ 59”
e 0° 59’ 59”. La stored procedure Statistics_GetByRegion sfruttata dall’applicativo
presenta la stessa struttura e di conseguenza lo stesso bug.




    6.2      Lavoro svolto

Qui di seguito sono riportati alcuni indici atti a quantificare il lavoro svolto:

Codice C#:

    •   Classi: 5
    •   Metodi: 62
    •   Righe di codice: 3261

Codice HTML / Javascript:

    •   Funzioni: 8
    •   Righe di codice: 85

                                               42
6. Conclusioni


       6.3       Sviluppi futuri

L’applicativo è stato progettato per consentire all’utente di selezionare sulla mappa il punto
e quindi di inserire manualmente il valore del raggio dell’ideale circonferenza d’interesse.
Un possibile sviluppo potrebbe essere la selezione della circonferenza direttamente sulla
mappa similmente a quanto accade nei programmi di editing di immagini, mediante
trascinamento e modifica delle dimensioni della figura con il solo utilizzo del mouse.

Tale sviluppo potrebbe essere integrato dalla possibilità di selezionare aree poligonali di
territorio in cui l’utente dovrebbe scegliere cliccando sulla mappa i punti che andrebbero a
costituire i vertici. Si rivelerebbero necessari algoritmi per verificare che egli abbia
disegnato una spezzata chiusa e che il poligono non sia intrecciato. Imporre la convessità
costituirebbe un vincolo troppo limitativo, basti pensare ad esempio ad un utente che si
ponesse l’obiettivo di visualizzare le emissioni sul territorio italiano, per la cui selezione
dovrebbe avere la possibilità di tracciare un poligono concavo.

Per quanto riguarda le Google Earth API, queste forniscono gli strumenti per sviluppare
ulteriormente l’applicativo dal punto di vista del disegno del poligono e della
visualizzazione dei risultati.

Una possibile linea di sviluppo potrebbe riguardare il database PRTR, nell’applicativo
potrebbero essere integrate ulteriori query al fine di consentire all’utente un’analisi delle
emissioni una volta scelto il periodo o la compagnia. Per quanto riguarda la funzione
GetDistance, utilizzata dalla già citata stored procedure Statistics_GetByRegion e
responsabile del calcolo delle distanza tra due punti, potrebbe essere migliorata al fine di
fornire una precisione maggiore. Al momento è implementato l’algoritmo della legge dei
coseni sferici, sostituire questo con la formula di Haversine11 o la formula di Vincenty12
migliorerebbe la precisione del calcolo, a discapito però di una maggiore complessità
matematica.

Sotto l’aspetto della connessione al database PRTR, in fase di stesura dei requisiti si è
stabilito che questa dovesse essere diretta e locale ovverosia, nel caso in questione, che
l’applicativo si dovesse connettere direttamente al database dall’interno della rete d’ateneo.
Un possibile sviluppo dell’applicativo potrebbe estendere l’utilizzo dello stesso anche
all’esterno della rete universitaria. In questo caso si rivelerebbe necessaria l’introduzione di

11
     http://en.wikipedia.org/wiki/Haversine_formula
12
     http://en.wikipedia.org/wiki/Vincenty%27s_formulae

                                                    43
6. Conclusioni


un web service che faccia da tramite fra l’applicativo ed il database allo scopo di aggirare il
problema del firewall, il quale blocca il traffico sulla porta utilizzata dal primo per
procedere alla connessione.




                                              44
7. Bibliografia



                               7. Bibliografia


•   Nagel C. Evjen B. Glynn J. Skinner M. Watson K. Jones A., C# 2005 - Guida per
    lo Sviluppatore, Editore Ulrico Hoepli Milano, 2006


•   PRTR technical documentation


•   http://msdn.microsoft.com/it-it/library


•   http://javascript.html.it/guide/leggi/25/guida-javascript-di-base/


•   http://code.google.com/intl/it-IT/apis/earth/documentation/


•   http://code.google.com/apis/ajax/playground/


•   http://programmazione.html.it/guide/leggi/41/guida-uml/




                                          45

Más contenido relacionado

Similar a Progetto e sviluppo di un applicativo basato su Google Earth per la visualizzazione di dati di emissioni inquinanti

Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...
Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...
Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...Domenico Schillaci
 
Generazione automatica di siti con mappe geografiche
Generazione automatica di siti con mappe geograficheGenerazione automatica di siti con mappe geografiche
Generazione automatica di siti con mappe geograficheMartino Miani
 
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Francesco Cucari
 
Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...
Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...
Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...artemedea
 
Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...
Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...
Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...ciakana
 
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...Davide Ciambelli
 
Progettazione e sviluppo di un applicativo web e della sua base di dati per l...
Progettazione e sviluppo di un applicativo web e della sua base di dati per l...Progettazione e sviluppo di un applicativo web e della sua base di dati per l...
Progettazione e sviluppo di un applicativo web e della sua base di dati per l...dudinestefano
 
Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGiacomoZorzin
 
Tesi Case Roberto
Tesi Case RobertoTesi Case Roberto
Tesi Case Robertoguestffdfbc
 
Progettazione e sviluppo di un software applicativo su un single board computer
Progettazione e sviluppo di un software applicativo su un single board computerProgettazione e sviluppo di un software applicativo su un single board computer
Progettazione e sviluppo di un software applicativo su un single board computerAlessandro Mascherin
 
Sviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia SharepointSviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia SharepointDenis Tomada
 
Public Light Manager - Una GUI per la gestione remota di un impianto di illum...
Public Light Manager - Una GUI per la gestione remota di un impianto di illum...Public Light Manager - Una GUI per la gestione remota di un impianto di illum...
Public Light Manager - Una GUI per la gestione remota di un impianto di illum...Gianluca Ritrovati
 
Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...
Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...
Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...ozacchig
 
Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...
Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...
Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...Saverio Tonon
 
Progettazione di una base di dati in ambiente office per un reparto di neurol...
Progettazione di una base di dati in ambiente office per un reparto di neurol...Progettazione di una base di dati in ambiente office per un reparto di neurol...
Progettazione di una base di dati in ambiente office per un reparto di neurol...thediabloz
 
Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...
Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...
Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...LorenzoFabbio
 

Similar a Progetto e sviluppo di un applicativo basato su Google Earth per la visualizzazione di dati di emissioni inquinanti (20)

Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...
Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...
Sviluppo di un sistema per il monitoraggio ambientale basato su reti di senso...
 
Generazione automatica di siti con mappe geografiche
Generazione automatica di siti con mappe geograficheGenerazione automatica di siti con mappe geografiche
Generazione automatica di siti con mappe geografiche
 
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
Art Everywhere: progetto per workshop Google. Sviluppo di sistemi di pattern ...
 
Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...
Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...
Studio e realizzazione di un sw per la gestione dei profili e delle versioni ...
 
Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...
Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...
Progettazione e realizzazione di un nodo di elaborazione per il rilevamento d...
 
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
Tesi Specialistica - L'ottimizzazione delle risorse della Grid di EGEE median...
 
Tesi_Adamou
Tesi_AdamouTesi_Adamou
Tesi_Adamou
 
Tesi_Adamou
Tesi_AdamouTesi_Adamou
Tesi_Adamou
 
Tesi Todone
Tesi TodoneTesi Todone
Tesi Todone
 
Progettazione e sviluppo di un applicativo web e della sua base di dati per l...
Progettazione e sviluppo di un applicativo web e della sua base di dati per l...Progettazione e sviluppo di un applicativo web e della sua base di dati per l...
Progettazione e sviluppo di un applicativo web e della sua base di dati per l...
 
Generazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptxGenerazione automatica diagrammi di rete con template pptx
Generazione automatica diagrammi di rete con template pptx
 
Tesi Case Roberto
Tesi Case RobertoTesi Case Roberto
Tesi Case Roberto
 
Progettazione e sviluppo di un software applicativo su un single board computer
Progettazione e sviluppo di un software applicativo su un single board computerProgettazione e sviluppo di un software applicativo su un single board computer
Progettazione e sviluppo di un software applicativo su un single board computer
 
Sviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia SharepointSviluppo Di Portali Tramite La Tecnologia Sharepoint
Sviluppo Di Portali Tramite La Tecnologia Sharepoint
 
Public Light Manager - Una GUI per la gestione remota di un impianto di illum...
Public Light Manager - Una GUI per la gestione remota di un impianto di illum...Public Light Manager - Una GUI per la gestione remota di un impianto di illum...
Public Light Manager - Una GUI per la gestione remota di un impianto di illum...
 
Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...
Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...
Porting evolutivo dell'applicazione per la gestione dei dispositivi del Comun...
 
[MWT] Web mining
[MWT] Web mining[MWT] Web mining
[MWT] Web mining
 
Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...
Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...
Realizzazione di un applicativo per la gestione di fogli di lavoro integrato ...
 
Progettazione di una base di dati in ambiente office per un reparto di neurol...
Progettazione di una base di dati in ambiente office per un reparto di neurol...Progettazione di una base di dati in ambiente office per un reparto di neurol...
Progettazione di una base di dati in ambiente office per un reparto di neurol...
 
Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...
Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...
Progetto e realizzazione di uno strumento per la raccolta di dipendenze archi...
 

Progetto e sviluppo di un applicativo basato su Google Earth per la visualizzazione di dati di emissioni inquinanti

  • 1. Università degli Studi di Trieste Facoltà di Ingegneria Tesi di Laurea Triennale in Ingegneria Informatica PROGETTO E SVILUPPO DI UN APPLICATIVO BASATO SU GOOGLE EARTH PER LA VISUALIZZAZIONE DI DATI DI EMISSIONI INQUINANTI Relatore: Laureando: Ill.mo Prof. Maurizio FERMEGLIA Raffaele BERNARDI Anno accademico 2009 – 2010
  • 2.
  • 3. Indice 1. Introduzione ................................................................................................................... 3 1.1 Obiettivo della tesi .................................................................................................. 3 1.2 Stato dell’arte .......................................................................................................... 3 1.3 Risultato della tesi ................................................................................................... 4 1.4 Motivazioni ............................................................................................................. 4 1.5 Vincoli di progetto .................................................................................................. 5 2. Analisi ............................................................................................................................ 6 2.1 Google Earth ........................................................................................................... 6 2.2 Google Earth Plugin................................................................................................ 6 2.3 Google Earth API: Javascript vs COM ................................................................... 7 2.4 Il progetto PRTR ..................................................................................................... 8 2.5 Il database PRTR .................................................................................................... 9 2.5.1 Legge dei coseni sferici ................................................................................. 10 3. Progettazione ................................................................................................................ 11 3.1 Use case diagram .................................................................................................. 11 3.2 Activity diagram ................................................................................................... 12 3.3 Class diagram ........................................................................................................ 14 4. Interfaccia ..................................................................................................................... 21 4.1 Form principale ..................................................................................................... 21 4.1.1 Barra dei menu .............................................................................................. 22 4.1.2 Barra di stato.................................................................................................. 23 4.1.3 Dialog box per la ricerca tramite indirizzo .................................................... 23 4.1.4 Dialog box per la ricerca tramite coordinate geografiche ............................. 24 4.1.5 Google Earth Plugin integrato ....................................................................... 24 4.2 Form informazioni ................................................................................................ 25 4.3 Form emissioni ..................................................................................................... 26 4.3.1 Scheda Regional emissions ........................................................................... 27 4.3.2 Scheda Chemical info .................................................................................... 28 4.3.3 Scheda Facility info ....................................................................................... 28 4.4 Esempio d’utilizzo ................................................................................................ 29 4.5 PRTR Google Earth Interface: requisiti per l’installazione .................................. 30 1
  • 4. 5. Implementazione .......................................................................................................... 31 5.1 Tecnologie software utilizzate .............................................................................. 31 5.2 Codice ................................................................................................................... 31 5.2.1 Caricamento di Google Earth Plugin ............................................................. 31 5.2.2 Integrazione di Google Earth Plugin ............................................................. 33 5.2.3 Chiamata ad un metodo esterno .................................................................... 34 5.2.4 Conversione di coordinate e aggiornamento della posizione del puntatore .. 35 5.2.5 Connessione al database ed esecuzione di una query .................................... 38 5.2.6 Esecuzione di una stored procedure .............................................................. 39 6. Conclusioni .................................................................................................................. 42 6.1 Risultati ottenuti .................................................................................................... 42 6.2 Lavoro svolto ........................................................................................................ 42 6.3 Sviluppi futuri ....................................................................................................... 43 7. Bibliografia .................................................................................................................. 45 2
  • 5. 1. Introduzione 1. Introduzione 1.1 Obiettivo della tesi L’obiettivo che ci si è posti con questa tesi è la progettazione e lo sviluppo di un applicativo stand-alone che presenti un’interfaccia user friendly per l’interrogazione del database PRTR e la conseguente visualizzazione dei dati relativi alle emissioni inquinanti. Più precisamente, si vuole che l’utente possa scegliere un arco temporale ed una regione geografica per ottenere i relativi valori delle emissioni. La selezione avviene per porzioni circolari di territorio, all’inserimento delle coordinate geografiche del punto desiderato segue la determinazione di un raggio d’interesse. Questi costituiscono rispettivamente centro e raggio dell’ideale circonferenza all’interno della quale si desidera estrarre le informazioni dal database. 1.2 Stato dell’arte Al momento esiste ed è operativa un’applicazione1 web simile per funzionalità ma diversa per struttura. Figura 1 - L'applicazione web 1 http://prtr.units.it/ 3
  • 6. 1. Introduzione L’inserimento delle coordinate geografiche è manuale, di conseguenza all’utente viene implicitamente richiesta la conoscenza delle coordinate del punto d’interesse. 1.3 Risultato della tesi Il software creato, PRTR Google Earth Interface, rispetta i vincoli di progetto ed è utilizzabile dopo una semplice installazione. Per i requisiti, si rimanda al capitolo 4.5. Figura 2 - L'applicazione PRTR Google Earth Interface 1.4 Motivazioni L’applicazione web esistente prevede l’inserimento manuale delle coordinate geografiche del punto d’interesse. L’operazione richiede quindi uno sforzo preventivo all’utente che di questo non conosca già le coordinate, una ricerca tramite altri strumenti, esterni all’applicazione, che gli permetta di scoprire i relativi valori di latitudine e longitudine. Di 4
  • 7. 1. Introduzione conseguenza il sistema in uso introduce una probabilità d’errore nel momento in cui egli riporta i dati nell’applicativo. L’utilizzo di una mappa che l’utente possa esplorare sino al raggiungimento del punto d’interesse ovvia ad entrambi i problemi. All’utente non viene richiesta la conoscenza preventiva delle coordinate geografiche, tantomeno lo costringe all’inserimento manuale di tali valori e ciò comporta una sensibile riduzione della probabilità d’errore. 1.5 Vincoli di progetto Sono stati imposti i seguenti vincoli di progetto: • Al fine di integrare una vista del globo nell’applicativo, si utilizzano le API di Google Earth; • L’applicativo è stand-alone; • Il software usa il database PRTR già esistente ed operativo al quale si connette direttamente ed in locale per l’estrazione dei dati richiesti dall’utente; • La query avviene per porzioni circolari di territorio, il cui centro è scelto dall’utente con un click del mouse sulla mappa. 5
  • 8. 2. Analisi 2. Analisi Partendo dal presupposto di dover presentare all’interno del proprio applicativo un’interfaccia di semplice utilizzo, ci si è concentrati sul vincolo relativo allo sfruttamento delle API di Google Earth. In seguito, per l’interrogazione del database PRTR, sulle stored procedure offerte dallo stesso e già utilizzate dall’applicazione web esistente. 2.1 Google Earth L’applicazione, creata con il nome di Keyhole dall’omonima società, divenne Google Earth quando nel 2004 Google acquisì la Keyhole, Inc. Giunto alla versione 6, il software consente all’utente l’esplorazione ‘in volo’ del globo terrestre, mediante foto satellitari ed aeree è possibile infatti visualizzare ogni zona del pianeta a diversi livelli di zoom, il cui livello massimo, conservando una risoluzione accettabile, varia a seconda del luogo. La navigazione può avvenire semplicemente con l’ausilio del mouse o in alternativa, se si è alla ricerca di un preciso punto, tramite inserimento delle sue coordinate geografiche o dell’indirizzo (grazie all’integrazione con Google Maps). Per rappresentare la superficie del pianeta, Google Earth utilizza la proiezione cilindrica equirettangolare, in cui meridiani e paralleli sono linee rette equidistanti che si intersecano ad angolo retto, con datum WGS84, elissoide geocentrico concepito per coprire l’intero globo terrestre2. 2.2 Google Earth Plugin Accanto all’applicativo stand-alone, Google nel 2008 rilasciò il plugin del suddetto software, consentendo in tal modo all’utente l’esplorazione del globo direttamente all’interno del proprio browser web. 2 http://earth.google.com/intl/it/userguide/v4/ug_importdata.html 6
  • 9. 2. Analisi 2.3 Google Earth API: Javascript vs COM In concomitanza al rilascio del plugin, Google mise a disposizione le API (Application Programming Interface) Javascript necessarie agli sviluppatori che avessero voluto creare applicazioni web proprie sfruttando le potenzialità di Google Earth. Queste andarono ad affiancarsi alle API COM, fino a quel momento l’unico mezzo per chi avesse voluto sviluppare codice su questo software, esistenti ancor prima che Keyhole divenisse Google Earth. Sebbene quest’ultime fossero state mantenute anche dopo tale passaggio, non godettero mai dello stesso supporto e documentazione che invece vantano le prime. La difficoltà nel reperire informazioni e lo scarso supporto sono stati confermati dalla stessa azienda statunitense, la quale nell’agosto 2010 ha annunciato che la versione 5.2 sarebbe stata l’ultima a supportare le API COM: “From the earliest days of Google Earth, (and even back when it was still called Keyhole,) developers have wanted control over the globe to create their own 3D Earth applications. In response to this need, the Keyhole team added a COM API to the Keyhole app, to allow further customization of users’ Google Earth experience. When Keyhole became Google Earth in 2005, this API was carried over. Though we never provided much support, developers discovered the COM bindings and a few intrepid developers sorted through the vagaries of COM programming. Eventually we had a small but committed development community demanding documentation, which we released in 2007. We saw some interesting uses for the COM API, particularly by Enterprise users and broadcasters. Mostly, though, people wanted to put Earth in their web applications. In 2008, we released the Google Earth API and browser plug-in. This robust JavaScript API is more powerful than the COM API, and can be used on a variety of platforms to deliver compelling 3D applications over the web based on the Google Earth technology. At the same time, we stopped development on the COM API and began encouraging developers to migrate to the Earth API instead. Today, more and more apps are being written in JavaScript, and COM itself is no longer a widely used technology, so the time has come to retire the Google Earth COM API. Today we’re announcing that the Google Earth 5.2 client will be the last version that supports the COM API. […] We believe that the JavaScript API provides the best mechanism for reaching the most developers. […] ” (Mano Marks, Geo APIs Team). Ai fini dell’applicativo quindi si è scelto di operare con le Javascript API. La documentazione online è affiancata da numerosi esempi più o meno complessi, divisi per 7
  • 10. 2. Analisi categorie, e forum di supporto. Risalta l’assenza di indicazioni per lo sviluppatore che si ponesse l’obiettivo di costruire applicazioni stand-alone anziché web. 2.4 Il progetto PRTR Il PRTR (Pollutant Release and Transfer Register) è un database contenente dati di emissioni inquinanti. L’organizzazione responsabile del progetto è l’ICS (International Centre for Science and High Technology) che agisce nell’ambito dell’UNIDO (United Nations Industrial Development Organization). L’obiettivo dell’ente è sostenere le comunità scientifiche nei Paesi in via di sviluppo e nei Paesi ad economia di transizione attraverso attività di ricerca e formazione avanzata per la crescita industriale sostenibile. Le competenze sviluppate al suo interno forniscono una serie di strumenti che trovano applicazione in molteplici settori, quali: chimica pura ed applicata, scienze della terra dell’ambiente e del mare, alta tecnologia e nuovi materiali. Uno dei principali progetti dell’area ambientale dell’ICS/UNIDO è la distribuzione delle conoscenze sui sistemi per il supporto decisionale. Lo scopo è la creazione di un centro di raccolta di conoscenze atto a formare personale competente negli ambiti della simulazione dei processi e nei sistemi di informazione geografici. In tal modo si sviluppa un programma che possa favorire il monitoraggio dei sistemi, l’analisi e l’accertamento del rischio, l’applicazione effettiva della tecnologia in risposta a problemi ambientali causati da attività industriali. Rientra in questo ambito il progetto riguardante lo sviluppo di un sistema pubblico per la raccolta e la divulgazione dei dati sugli inquinanti, il PRTR. Progettato come un database ambientale, il Pollutant Release and Transfer Register rappresenta un inventario di emissioni potenzialmente dannose riguardanti terra, sottosuolo, acqua e aria, inoltre tiene conto del trasporto degli inquinanti in luoghi di trattamento e discarica. Il PRTR si inserisce molto bene nella struttura organizzativa per lo sviluppo industriale sostenibile, la conoscenza delle quantità delle sostanze emesse consente di stimare l’equilibrio tra il materiale utilizzato per il processo e l’energia impiegata per lo stesso, ottimo indicatore della sostenibilità di un processo industriale. Inoltre i report registrando l’evoluzione delle emissioni nel tempo possono incoraggiare l’introduzione di tecnologie più pulite al fine di ridurre il livello di inquinamento ambientale. 8
  • 11. 2. Analisi I dati presenti nel Pollutant Release and Transfer Register presentano queste caratteristiche principali: • Riportati per ogni prodotto chimico; • Riportati per ogni installazione industriale; • Riportati per ogni emissione e trasferimento; • Riportati per ogni elemento dell’ambiente (aria, acqua, terra); • Periodici; • Costantemente strutturati; • Presenti su un database; • Divulgati e costantemente disponibili al pubblico; • Permettono il mantenimento dei segreti industriali. Il progetto diffusosi su scala europea con il nome E-PRTR (European Pollutant Release and Transfer Register) si identifica nel nostro Paese nell’INES (Inventario Nazionale delle Emissioni e loro Sorgenti). 2.5 Il database PRTR Dal punto di vista tecnico, il DBMS utilizzato per il database PRTR contenente le informazioni relative alle emissioni inquinanti è SQL Server 2005. Da precisare che il laureando non ha partecipato alla stesura del relativo codice né a parte di esso, per quanto riguarda il database ci si è soffermati sullo studio delle stored procedure, peraltro già utilizzate dall’applicazione web esistente. In particolare le seguenti: • Statistics_GetByRegion: restituisce le emissioni chimiche in una determinata zona circolare del globo definita dalle coordinate geografiche del centro, dal raggio e dal periodo d’interesse; • Statistics_GetByFacilityChemical: restituisce le emissioni di un determinato prodotto chimico di un determinato complesso in un determinato periodo; • Statistics_GetByPeriod: analoga alla precedente, ma è possibile avere i dati relativi a tutti i complessi o a tutti i periodi inserendo NULL nei rispettivi parametri della procedura. 9
  • 12. 2. Analisi 2.5.1 Legge dei coseni sferici Interessante inoltre la funzione GetDistance, utilizzata dalla prima delle procedure citate, che torna la distanza d fra due punti sulla superficie terrestre definiti dalle rispettive coordinate geografiche latitudine e longitudine mediante la legge dei coseni sferici3. ∆ = ( + ∆ ) = ∆ con : latitudine del punto 1 : latitudine del punto 2 ∆ : differenza delle longitudini ∆ : angolo centrale (il cui vertice è il centro della sfera e i cui lati intersecano la superficie nei punti 1 e 2) : raggio della sfera 3 Per ulteriori informazioni: (1) http://en.wikipedia.org/wiki/Great-circle_distance (2) http://en.wikipedia.org/wiki/Spherical_law_of_cosines 10
  • 13. 3. Progettazione 3. Progettazione In questo capitolo si procede alla progettazione dell’applicativo mediante gli strumenti forniti dal linguaggio UML. Creato con l’intento di unificare in un unico standard le metodologie per il disegno nell’ambito della progettazione di sistemi software, l’UML (Unified Modeling Language) stabilisce un insieme di notazioni e simboli, una collezione di diagrammi composti da elementi grafici e testuali che consentono di descrivere il sistema a più livelli d’astrazione. 3.1 Use case diagram Lo Use case diagram è lo strumento utilizzato per la descrizione delle funzionalità offerte dal software dal punto di vista degli attori che interagiscono con il sistema stesso. Figura 3 - Use case diagram Nel caso dell’applicativo in questione, si vuole che l’utente possa esplorare il globo alla ricerca del punto d’interesse. Sono permesse diverse modalità di navigazione e ad egli spetta la scelta di visualizzare o meno una serie di strumenti di supporto e di informazioni aggiuntive. Una volta determinato il punto, procede alla selezione del periodo e del raggio 11
  • 14. 3. Progettazione della circonferenza ideale di cui esso è il centro. Infine visualizza i dati relativi alle emissioni inquinanti inerenti alla regione geografica prescelta. 3.2 Activity diagram L’Activity diagram descrive i processi alla base di una data funzionalità del software. L’algoritmo pone in primo piano le singole attività evidenziando i sistemi responsabili che intervengono nel corso dell’elaborazione. Figura 4 - Activity diagram riferito ai sistemi PRTR Google Earth Interface e Google Earth Server Allo scopo di rendere il diagramma più comprensibile si è scelto di scinderlo nelle due parti che caratterizzano l’algoritmo dell’applicativo. La prima di queste riguarda l’interazione con il plugin di Google Earth (Figura 4), l’altra la connessione con il database PRTR (Figura 5). Nel dettaglio, la prima parte comprende le attività: i. Ricerca per indirizzo/coordinate: l’utente inserisce nell’apposito campo l’indirizzo o, in alternativa, la coppia di coordinate geografiche della locazione desiderata; 12
  • 15. 3. Progettazione ii. Verifica che indirizzo/coordinate e altezza della camera view4 siano ben formati: controllo sui dati immessi dall’utente. Nota: nel caso l’utente scelga di raggiungere il punto d’interesse mediante navigazione con il mouse, l’activity diagram non presenta tale attività; iii. Rilocazione della camera view: vengono visualizzate le fotografie aeree o le immagini satellitari, a seconda del livello dello zoom, della località scelta dall’utente; iv. Scelta del punto d'interesse: l’utente seleziona sulla mappa il punto d’interesse. Figura 5 - Activity diagram riferito ai sistemi PRTR Google Earth Interface e Prtr database 4 Camera view : punto di vista dell’osservatore ideale. 13
  • 16. 3. Progettazione La figura soprastante raffigura l’insieme delle attività riguardanti l’interazione con il database PRTR, unita al primo diagramma rappresenta l’algoritmo completo alla base dell’applicativo. Tale parte si compone delle attività: i. Apertura form emissioni inquinanti: una volta scelto il punto, si apre il form relativo alle emissioni inquinanti; ii. Query: lista i periodi: per aiutare l’utente nella scelta si esegue una query sul database per visualizzare l’elenco dei periodi disponibili; iii. Inserimento del raggio e selezione del periodo: egli procede all’inserimento del raggio ed alla scelta del periodo tra quelli presenti; iv. Query: estrai prodotti chimici relativi a periodo e regione scelti: query per estrarre dal database i prodotti chimici relativi alla regione ed al periodo selezionati; v. Scelta del prodotto chimico: l’utente seleziona tra i risultati della query precedente il prodotto chimico di cui desidera avere informazioni aggiuntive; vi. Query: estrai lo storico del prodotto chimico scelto: in riferimento all’elemento chimico appena selezionato, tale query estrae i dati in relazione a tutti i periodi presenti nel database; vii. Query: estrai lo storico dei relativi report: query per estrarre dal database l’elenco dei report, coppie impianto – periodo, dato il prodotto chimico; viii. Scelta del report (coppia impianto - periodo): l’utente sceglie tra i risultati della query precedente il report d’interesse; ix. Query: estrai i dati relativi a periodo, impianto e prodotto chimico scelti: dati il prodotto chimico ed il report, la query estrae dal database le informazioni riguardanti l’impianto, il report e ed il prodotto chimico dichiarato in esso. 3.3 Class diagram Utilizzando le strutture tipiche della programmazione ad oggetti, classi metodi ed attributi, il Class diagram ritrae il sistema sotto l’aspetto delle entità che ne fanno parte. 14
  • 17. 3. Progettazione Figura 6 - Class diagram Al fine di non appesantire eccessivamente il diagramma, per ognuna delle classi sono stati omessi gli attributi, per la cui lettura si rimanda al codice sorgente, ed i metodi, che si analizzano qui di seguito. Il progetto si compone di 5 classi: • Program: entry point dell’applicativo. • MainForm: form principale dell’applicazione, in esso l’utente può esplorare la mappa grazie al plugin di Google Earth integrato, scegliere se visualizzare o meno strumenti d’ausilio alla navigazione e informazioni aggiuntive in merito alla località inquadrata dalla camera view, e infine selezionare il punto. Sono presenti i controlli necessari a navigare sino al punto d’interesse tramite il suo indirizzo e strutture analoghe per farlo tramite coordinate geografiche. Dal form principale si può accedere agli altri. • InfoForm: semplice form per la visualizzazione della versione di Google Earth Plugin installata sulla macchina e del programma. • PointForm: classe del form relativo alle emissioni, da qui l’utente una volta selezionato il punto procede alla scelta del periodo e del raggio della regione circolare d’interesse. Quindi visualizza i risultati delle query mediante tabelle e grafici. • DecimalToSexagesimal: converte le coordinate geografiche dalla forma decimale alla notazione sessagesimale e fornisce i metodi per la lettura dei nuovi valori. La conversione è necessaria dal momento che le API di Google Earth forniscono metodi i cui parametri e valori di ritorno sono decimali mentre sul database PRTR le coordinate dei punti sono memorizzate in forma sessagesimale. Quest’ultimo 15
  • 18. 3. Progettazione formato è stato scelto per quanto riguarda la visualizzazione delle coordinate geografiche sull’interfaccia dell’applicativo, per favorire una lettura ed un inserimento dei valori più semplice per l’utente. La classe Program presenta il metodo: • Main() : void Apre il form principale. La classe MainForm presenta i metodi: • InternetConnection() : bool Verifica lo stato della connessione internet. • exitToolStripMenuItem_Click(object sender, EventArgs e) : void Exit point dell’applicazione. • MainForm_Load(object sender, EventArgs e) : void Carica il form principale. • jsInitSuccess(object instance) : void L’istanza di Google Earth Plugin è stata creata correttamente, inizializza il plugin. • jsInitFailure(String error) : void L’istanza di Google Earth Plugin non è stata creata, stampa un messaggio d’errore. • bGo_Click(object sender, EventArgs e) : void Ricerca la locazione desiderata per indirizzo. • eventLatLngAlt(float lat, float lng, float alt) : void Aggiorna sulla barra di stato le coordinate del cursore sulla mappa. • validateCoord(TextBox i, int low, int up, String coord, String unit) : int Verifica che le coordinate immesse dall’utente siano ben formate. • bGoCoord_Click(object sender, EventArgs e) : void Ricerca la locazione desiderata per coordinate. • tAltAdd_TextChanged(object sender, EventArgs e) : void Verifica il valore dell’altezza della camera view (dialog box di ricerca per indirizzo). • tAltCoord_TextChanged(object sender, EventArgs e) : void Verifica il valore dell’altezza della camera view (dialog box di ricerca per coordinate). • tLatDeg_TextChanged(object sender, EventArgs e) : void 16
  • 19. 3. Progettazione Verifica il valore dei gradi di latitudine. • tLatMin_TextChanged(object sender, EventArgs e) : void Verifica il valore dei minuti di latitudine. • tLatSec_TextChanged(object sender, EventArgs e) : void Verifica il valore dei secondi di latitudine. • tLngDeg_TextChanged(object sender, EventArgs e) : void Verifica il valore dei gradi di longitudine. • tLngMin_TextChanged(object sender, EventArgs e) : void Verifica il valore dei minuti di longitudine. • tLngSec_TextChanged(object sender, EventArgs e) : void Verifica il valore dei secondi di longitudine. • menuRoads_CheckedChanged(object sender, EventArgs e) : void Visualizza/nasconde il layer relativo alla rete stradale. • menuBorders_CheckedChanged(object sender, EventArgs e) : void Visualizza/nasconde il layer relativo ai confini internazionali. • menuTerrain_CheckedChanged(object sender, EventArgs e) : void Visualizza il terreno in 2D/3D. • menuNavControl_CheckedChanged(object sender, EventArgs e) : void Visualizza/nasconde il navigation control. • menuStatusBar_CheckedChanged(object sender, EventArgs e) : void Visualizza/nasconde la status bar. • menuGrid_CheckedChanged(object sender, EventArgs e) : void Visualizza/nasconde una griglia rappresentante meridiani e paralleli. • gotoProgressBar(float progress) : void Aggiorna la barra di progresso. • tAdd_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tAltAdd_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tLatDeg_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tLatMin_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tLatSec_KeyPress(object sender, KeyPressEventArgs e) : void 17
  • 20. 3. Progettazione Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tLngDeg_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tLngMin_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tLngSec_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • tAltCoord_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • menuInfo_Click(object sender, EventArgs e) : void Apre il form informazioni. • eventLatLng(float lat, float lng) : void Apre il form emissioni. • cbEnablePoint_CheckedChanged(object sender, EventArgs e) : void Abilita/disabilita la navigazione sulla mappa. La classe InfoForm presenta il metodo: • bOkInfo_Click(object sender, EventArgs e) : void Chiude il form. La classe PointForm presenta i metodi: • loadEmissionPeriods() : void Carica la combobox con l’elenco dei periodi. • bOkPoint_Click(object sender, EventArgs e) : void Chiude il form. • bSubmitQuery_Click(object sender, EventArgs e) : void Carica la tabella relativa alle emissioni. • dgvRegionalEmissionDesign() : void Disegna la tabella relativa alle emissioni. • dgvRegionalEmission_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) : void Disegna i grafici e carica la seconda scheda del form. • loadDataGridViewdgvPeriod() : void Carica la tabella relativa ai periodi. 18
  • 21. 3. Progettazione • dgvPeriodDesign() : void Disegna la tabella relativa ai periodi. • loadDataGridViewdgvPeriodFacility() : void Carica la tabella relativa ai report. • dgvPeriodFacilityDesign() : void Disegna la tabella relativa ai report. • dgvPeriodFacility_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) : void Carica la terza scheda del form. • tRange_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. • cbPeriod_KeyPress(object sender, KeyPressEventArgs e) : void Sposta il cursore nel controllo successivo alla pressione del tasto Invio. La classe DecimalToSexagesimal presenta i metodi: • getLatDeg() : int Restituisce il valore dei gradi di latitudine. • getLatMin() : int Restituisce il valore dei minuti di latitudine. • getLatSec() : int Restituisce il valore dei secondi di latitudine. • getLngDeg() : int Restituisce il valore dei gradi di longitudine. • getLngMin() : int Restituisce il valore dei minuti di longitudine. • getLngSec() : int Restituisce il valore dei secondi di longitudine. Infine, per quanto riguarda il form principale, questo contiene una pagina html con uno script per il caricamento e la gestione di Google Earth Plugin. Sono presenti le funzioni: • init() Crea un’istanza di Google Earth Plugin. 19
  • 22. 3. Progettazione • success(instance) L’istanza di Google Earth Plugin è stata creata correttamente, inizializza il plugin. • failure(errorCode) L’istanza di Google Earth Plugin non è stata creata, restisuisce una stringa che descrive l’errore. • goToAddress(address, altitude) Ricerca la locazione desiderata per indirizzo. • goToCoordinates(latitude, longitude, altitude) Ricerca la locazione desiderata per coordinate. • geEventListener(kmlEvent) Restituisce le coordinate del cursore sulla mappa, funzione legata all’evento mousemove. • timerStreamingPercent() Restituisce la percentuale di caricamento dell’immagine attualmente inquadrata dalla camera view. • geEventPoint (kmlEvent) Restituisce le coordinate del cursore sulla mappa, funzione legata all’evento mouseup. 20
  • 23. 4. Interfaccia 4. Interfaccia Nel presente capitolo si descrive l’interfaccia dell’applicativo, partendo dall’analisi dei form che lo compongono, quindi dei rispettivi singoli componenti ed infine nel suo complesso, mediante un esempio d’utilizzo. 4.1 Form principale Il form principale contiene gli strumenti per consentire all’utente di selezionare il punto di suo interesse. Figura 7 - Form principale dell'applicativo 21
  • 24. 4. Interfaccia La struttura prevede: • Barra dei menu • Barra di stato • Dialog box per la ricerca tramite indirizzo • Dialog box per la ricerca tramite coordinate geografiche • Google Earth Plugin integrato 4.1.1 Barra dei menu La barra dei menu è divisa in tre categorie File, View, ?. La prima rappresenta le funzioni necessarie al caricamento ed alla chiusura dell’applicazione; la seconda fornisce un elenco di strumenti d’ausilio alla navigazione; la terza riguarda le informazioni sull’applicativo. • File o New: riavvia l’applicazione ricaricando il plugin ed i valori di default; o Exit: esce dall’applicazione; • View o Navigation Control: visualizza/nasconde il controllo mediante il quale è possibile variare i parametri di zoom, tilt5 e azimut6; o Status Bar: visualizza/nasconde il controllo che fornisce dati relativi alle coordinate geografiche e all’altitudine del punto in corrispondenza del puntatore sulla mappa e all’altezza della camera view; o Grid: visualizza/nasconde una griglia rappresentante meridiani e paralleli la cui definizione varia a seconda dello zoom; o Roads: visualizza/nasconde il layer relativo alla rete stradale, maggiore è lo zoom e migliore è il livello di dettaglio; o Borders: visualizza/nasconde il layer relativo ai confini internazionali; o Terrain: visualizza il territorio in 2D/3D; • ? o Info: apre il form contenente informazioni sulla versione dell’applicativo e di Google Earth Plugin. 5 Tilt : distanza angolare compresa tra la verticale di un punto e la direzione della camera view. 6 Azimut : distanza angolare compresa tra la direzione del Nord e la direzione in cui cade la perpendicolare di un punto all’orizzonte, calcolata muovendosi in senso orario (cit. Wikipedia). Nello specifico, la distanza angolare tra la direzione del Nord e la direzione della camera view. 22
  • 25. 4. Interfaccia Figura 8 - Barra dei menu 4.1.2 Barra di stato La barra di stato mostra la latitudine, la longitudine e l’altitudine del punto sulla mappa in corrispondenza del puntatore del mouse. Inoltre contiene una barra di caricamento visibile in fase di download delle immagini. Figura 9 - Barra di stato 4.1.3 Dialog box per la ricerca tramite indirizzo Una delle possibilità che l’utente può sfruttare per la localizzazione di un punto è la ricerca per indirizzo. Sono presenti controlli per prevedere input errati nel textbox relativo all’altezza da terra della camera view, ovverosia maggiori di 10.000 km e negativi. Per semplificare e velocizzare la ricerca, è possibile passare da un controllo al successivo mediante la pressione del tasto Invio. Figura 10 - Ricerca tramite indirizzo 23
  • 26. 4. Interfaccia 4.1.4 Dialog box per la ricerca tramite coordinate geografiche In alternativa al primo metodo, l’utente può rilocare la camera view mediante l’inserimento delle coordinate del punto d’interesse. Anche in questo caso sono presenti controlli che verificano la validità dei valori inseriti dall’utente. Come nel caso precedente, l’altezza da terra della camera view deve essere compresa tra 0 e 10.000 km, i campi relativi ai minuti ed ai secondi possono contenere interi da 0 a 59, quello della latitudine da -90 a 90, della longitudine da -180 a 180. Inoltre vengono sottoposte a verifica anche le coordinate nel loro complesso, per evitare che l’utente inserisca, ad esempio, una latitudine 90° 24’55”: sebbene siano validi i singoli valori, questa è maggiore di 90°. Analogamente a quanto accade nel primo dialog box, l’utente può spostarsi di controllo in controllo premendo Invio. Figura 11 - Ricerca tramite coordinate geografiche 4.1.5 Google Earth Plugin integrato Il componente principale del form è il plugin di Google Earth, su di esso l’utente ha la facoltà di navigare e modificare parametri quali lo zoom e il tilt nello stesso modo in cui può farlo nell’applicazione Google Earth. Una volta scelto il punto, per procedere alla selezione di questo deve mettere la spunta sul checkbox a lato e quindi cliccare sulla mappa. 24
  • 27. 4. Interfaccia Figura 12 - Google Earth Plugin e il checkbox per procedere con la selezione del punto 4.2 Form informazioni Nel form informazioni è possibile visualizzare la versione del programma, delle Javascript API e del plugin di Google Earth attualmente installato sul pc. Figura 13 - Form informazioni 25
  • 28. 4. Interfaccia 4.3 Form emissioni Il form emissioni presenta i dati relativi alle emissioni inquinanti, ovvero i risultati delle query sul database PRTR. Figura 14 - Form emissioni La struttura prevede una navigazione per schede: • Regional emissions: contiene il dettaglio delle emissioni nella regione circolare scelta dall’utente; • Chemical info: presenta lo storico del prodotto chimico selezionato nella prima scheda ed i report in cui è presente; • Facility info: elenca le informazioni relative al report selezionato nella scheda precedente. 26
  • 29. 4. Interfaccia 4.3.1 Scheda Regional emissions Nella scheda Regional emissions è presente un dialog box in cui l’utente deve selezionare da una combobox il periodo d’interesse ed inserire il raggio in chilometri della circonferenza il cui centro è il punto scelto precedentemente sulla mappa. Il risultato della query viene evidenziato in una tabella che elenca i prodotti chimici dichiarati nei report dei complessi la cui locazione è all’interno dell’ideale circonferenza. Per ogni prodotto si indica la quantità di emissioni (in kg) in: • Aria • Sottosuolo • Acqua • Terra • Totale In fondo alla scheda è visualizzato il grafico relativo al prodotto chimico del record selezionato. Figura 15 - Form emissioni, scheda Regional emissions 27
  • 30. 4. Interfaccia 4.3.2 Scheda Chemical info Nella scheda Chemical info l’utente può avere informazioni aggiuntive sul prodotto chimico selezionato tramite una tabella che ne rappresenta lo storico. Sono infatti elencati i valori delle emissioni divisi per i periodi dei report in cui il prodotto compare. Il risultato di tale query è rappresentato anche da un diagramma a colonne, al di sotto del quale un’altra tabella elenca i report, visualizzandoli mediante il nome del complesso che lo ha stilato ed il periodo a cui il contenuto fa riferimento. Figura 16 - Form emissioni, scheda Chemical info 4.3.3 Scheda Facility info La terza scheda, Facility info, evidenzia informazioni riguardanti il report selezionato precedentemente, quindi sul complesso che lo ha stilato e sui valori delle emissioni del prodotto chimico scelto dall’utente nella prima scheda. Del complesso si forniscono: 28
  • 31. 4. Interfaccia • Indirizzo • Città • E-mail • Telefono • Sito internet • Nome della compagnia Per quanto riguarda il prodotto chimico, il tipo di informazioni visualizzate ricalca quanto visto finora, ovverosia i valori in kg delle emissioni nell’aria, nel sottosuolo, nell’acqua, sulla terra e in totale. Figura 17 - Form emissioni, scheda Facility info 4.4 Esempio d’utilizzo L’utente vuole avere informazioni riguardo alle emissioni inquinanti nel raggio di 100 km dall’edificio centrale dell’Università di Trieste, dati riferiti all’anno 2000. 29
  • 32. 4. Interfaccia • Eseguito l’applicativo e caricatosi il plugin di Google Earth, nel primo dialog box inserisce l’indirizzo, “P.le Europa, Trieste, Italia”, e l’altezza della camera view, 400 metri. Quindi preme il bottone Fly to!; • Una volta caricata la mappa, mette la spunta sul checkbox e procede alla selezione del punto con un click in corrispondenza dell’edificio centrale; • Nella prima scheda del form che in seguito compare, seleziona “Year 2000” nella combobox relativa al periodo, inserisce “100” nella textbox riferita al raggio e preme Submit Query; • La tabella sottostante elenca i dati riguardanti le emissioni, selezionando uno dei record può accedere alle informazioni della seconda e terza scheda del form. 4.5 PRTR Google Earth Interface: requisiti per l’installazione L’applicativo presenta i seguenti requisiti per l’installazione: • Risoluzione dello schermo minima: 1024 x 768; • Google Earth Plugin7 versione 6 preinstallato, nel caso fosse installato anche Google Earth8 assicurarsi che sia aggiornato alla stessa versione. Per i requisiti di tali applicazioni si rimanda ai rispettivi siti; • Microsoft Chart Controls for Microsoft .NET Framework 3.59; • Microsoft .NET Framework. 7 Per il download: http://www.google.com/intl/it/earth/explore/products/plugin.html 8 Per il download: http://www.google.com/earth/index.html 9 Per il download: http://www.microsoft.com/downloads/en/details.aspx?FamilyId=130F7986-BF49-4FE5- 9CA8-910AE6EA442C 30
  • 33. 5. Implementazione 5. Implementazione In questo capitolo viene descritta l’implementazione dell’applicativo, il cui codice è stato scritto per intero dal laureando eccezion fatta per le righe generate automaticamente dall’IDE utilizzato. Qui di seguito vengono presentate nel dettaglio le parti salienti dell’applicativo, si tralasciano quelle riguardanti l’aspetto grafico o la gestione delle eccezioni mediante blocchi try-catch-finally o funzioni di minor interesse, per la lettura delle quali si rimanda al listato sorgente. 5.1 Tecnologie software utilizzate Dall’analisi dei vincoli di progetto si apprende che l’applicativo deve essere stand-alone ed integrare le funzionalità di Google Earth, le cui API però nascono con l’obiettivo di consentire agli sviluppatori di scrivere applicazioni web. Ne consegue la necessità di scrivere due parti di codice distinte e quindi di integrarle mediante gli strumenti opportuni. A tale scopo, si è scelto di utilizzare Javascript per quanto riguarda il plugin e C# per l’applicativo stand-alone all’interno del quale il primo deve essere integrato. Quali strumenti di supporto allo sviluppo sono stati utilizzati Notepad++ versione 5 e Visual Studio 2008. 5.2 Codice 5.2.1 Caricamento di Google Earth Plugin Il seguente codice è tratto dal file GEPlugin.html, include le istruzioni di caricamento del plugin, le funzioni di inizializzazione e di gestione della camera view. 1. <html> 2. <head> 3. <title>Google Earth Plugin</title> 4. <script src="https://www.google.com/jsapi?key=ABCDEF"></script> 5. <script type="text/javascript"> 31
  • 34. 5. Implementazione 6. var ge; 7. google.load("earth", "1"); 8. google.load("maps", "2"); 9. 10. function init() { 11. google.earth.createInstance('mapContainer', success, failure); 12. } 13. 14. function success(instance) { 15. ge = instance; 16. [...] 17. window.external.jsInitSuccess(instance); 18. } 19. 20. function goToAddress(address, altitude) { 21. var geocoder = new google.maps.ClientGeocoder(); 22. geocoder.getLatLng(address, function(point) { 23. if (point) { 24. var lookAt = ge.createLookAt(''); 25. lookAt.set(point.y, point.x, altitude, ge.ALTITUDE_RELATIVE_TO_GROUND, 0, 0, 0); 26. ge.getView().setAbstractView(lookAt); 27. } 28. }); 29. } 30. 31. function goToCoordinates(latitude, longitude, altitude) { 32. var lookAt = ge.createLookAt(''); 33. lookAt.set(latitude, longitude, altitude, ge.ALTITUDE_RELATIVE_TO_GROUND, 0, 0, 0); 34. ge.getView().setAbstractView(lookAt); 35. } 36. 37. [...] 38. 39. </script> 40. </head> 41. <body onload="init()"> 42. <div id="mapContainer" style="width: 100%; height: 100%;"></div> 43. </body> 44. </html> 32
  • 35. 5. Implementazione Per poter caricare il plugin è necessario completare l’url con la propria Maps API Key ottenibile gratuitamente sul sito, in questo caso è stata utilizzata una chiave d’esempio “ABCDEF” (riga 4). Quindi vengono caricate le API di Google Earth (7) e di Google Maps (8). Il metodo che consente di creare una nuova istanza del plugin (11) prevede tra i suoi parametri il nome delle procedure da invocare nel caso l’operazione dovesse fallire o avere successo (14). In quest’ultimo caso l’istanza viene passata al metodo esterno, definito nell’applicativo, per permettere l’utilizzo dei metodi forniti dalle API anche in tale sede. Le funzioni goToAddress (20) e goToCoordinates (31) vengono invocate dall’esterno, si sottolinea l’utilizzo da parte della prima delle Google Maps API versione 2 per la creazione di un’istanza ClientGeocoder (21) e l’invocazione su questa del metodo getLatLng (22). 5.2.2 Integrazione di Google Earth Plugin Il codice che segue è presente nella classe MainForm dell’applicativo, si evidenziano le parti relative all’integrazione del plugin all’interno del form principale. 1. String pluginUrl = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetModules()[0].Full yQualifiedName) + "GEPlugin.html"; 2. private IGEPlugin ge = null; 3. 4. private void MainForm_Load(object sender, EventArgs e) 5. { 6. [...] 7. wbGE.Navigate(pluginUrl); 8. wbGE.ObjectForScripting = this; 9. [...] 10. } 11. 12. public void jsInitSuccess(object instance) 13. { 14. [...] 15. ge = (IGEPlugin)instance; 16. [...] 17. } 33
  • 36. 5. Implementazione Il controllo WebBrowser consente di inserire una pagina web in un form, quindi si presta ottimamente per l’applicativo in questione. Il metodo Navigate carica il documento indicato come parametro (riga 7), il cui percorso viene composto runtime tramite reflection (1). L’operazione successiva è impostare l’oggetto accessibile dal codice contenuto nella pagina web caricata nel WebBrowser, in questo caso il form stesso, tramite la proprietà ObjectForScripting10 (8). Il metodo jsInitSuccess (12) è invocato dalla pagina una volta creata una nuova istanza del plugin. 5.2.3 Chiamata ad un metodo esterno Il seguente metodo, tratto anch’esso dalla classe MainForm, è legato all’evento pressione del tasto Fly to! relativo al dialog box di ricerca per coordinate. 1. private void bGoCoord_Click(object sender, EventArgs e) 2. { 3. [...] 4. // validazione dei valori delle coordinate immessi dall’utente 5. // conversione dalle coordinate sessagesimali alle decimali 6. [...] 7. wbGE.Document.InvokeScript("goToCoordinates", new object[] { lat, lng, alt }); 8. } 10 Proprietà WebBrowser.ObjectForScripting : Utilizzare questa proprietà per abilitare la comunicazione tra una pagina Web inserita nel controllo WebBrowser e l'applicazione che contiene il controllo WebBrowser. La proprietà consente di integrare codice HTML dinamico (DHTML) con il codice dell'applicazione client. L'oggetto specificato per questa proprietà è disponibile per lo script della pagina Web come oggetto window.external, che è un oggetto DOM incorporato fornito per l'accesso all'host. È possibile impostare questa proprietà su qualsiasi oggetto visibile a COM le cui proprietà e i cui metodi pubblici devono essere resi disponibili al codice di script (cit. http://msdn.microsoft.com/it-it/library). COM (Component Object Model) : interfaccia per componenti software, permette la comunicazione tra processi e creazione dinamica di oggetti con qualsiasi linguaggio di programmazione che supporta questa tecnologia. 34
  • 37. 5. Implementazione Si tralasciano le righe di codice riguardanti il controllo di validità dei valori immessi dall’utente e la conversione dalla notazione sessagesimale, presente nell’interfaccia, a quella decimale, richiesta dalle API di Google, nel codice rappresentata dalle variabili lat lng. Si sottolinea il metodo InvokeScript (riga 7) il cui compito è l’esecuzione di una funzione definita in una pagina web, in questo caso nel documento integrato nel form tramite il controllo WebBrowser. I parametri del metodo sono rispettivamente il nome della funzione esterna ed un array di object rappresentante i parametri di quest’ultima. 5.2.4 Conversione di coordinate e aggiornamento della posizione del puntatore Nella barra di stato del form principale sono visualizzati i valori di latitudine, longitudine e altitudine relativi alla posizione del puntatore sulla mappa. Sfruttando le Google Earth API è possibile risalire alle coordinate del punto in formato decimale, per la loro visualizzazione sull’interfaccia si richiede una conversione. Di seguito vengono presentate e descritte le classi e le funzioni che entrano in gioco in questo contesto. 1. public class DecimalToSexagesimal 2. { 3. private int latDeg, latMin, latSec, lngDeg, lngMin, lngSec; 4. 5. public DecimalToSexagesimal(float lat, float lng) 6. { 7. latDeg = (int)Math.Truncate(lat); 8. latMin = (int)Math.Abs(Math.Truncate((lat - latDeg) * 60)); 9. latSec = (int)Math.Truncate((Math.Abs((lat - latDeg) * 60) - latMin) * 60); 10. lngDeg = (int)Math.Truncate(lng); 11. lngMin = (int)Math.Abs(Math.Truncate((lng - lngDeg) * 60)); 12. lngSec = (int)Math.Truncate((Math.Abs((lng - lngDeg) * 60) - lngMin) * 60); 13. } 14. 15. public int getLatDeg() 16. { 17. return latDeg; 18. } 19. 35
  • 38. 5. Implementazione 20. public int getLatMin() 21. { 22. return latMin; 23. } 24. 25. public int getLatSec() 26. { 27. return latSec; 28. } 29. 30. public int getLngDeg() 31. { 32. return lngDeg; 33. } 34. 35. public int getLngMin() 36. { 37. return lngMin; 38. } 39. 40. public int getLngSec() 41. { 42. return lngSec; 43. } 44. } La classe DecimalToSexagesimal è di supporto all’applicativo, dal quale viene utilizzata nel momento in cui è necessaria una conversione di rappresentazione di coordinate. I parametri del costruttore sono i valori decimali della latitudine e della longitudine, per quanto riguarda i metodi forniti dalla classe sono semplici get sui singoli componenti delle coordinate in formato sessagesimale. Si nota che l’applicativo tratta i secondi come numeri interi, tale semplificazione non rappresenta un’approssimazione rilevante per i successivi calcoli delle distanze, data la formula utilizzata dal database per il calcolo. Questa infatti basandosi sulla legge dei coseni sferici introduce errori di approssimazione considerando la Terra come una sfera. 1. public void eventLatLngAlt(float lat, float lng, float alt) 2. { 3. DecimalToSexagesimal dts = new DecimalToSexagesimal(lat, lng); 36
  • 39. 5. Implementazione 4. [...] 5. ssLat.Text = ssLat.Text + dts.getLatDeg() + "° " + dts.getLatMin() + "' " + dts.getLatSec() + """; 6. ssLng.Text = ssLng.Text + dts.getLngDeg() + "° " + dts.getLngMin() + "' " + dts.getLngSec() + """; 7. ssAlt.Text = Math.Round(alt, 2).ToString() + " meters"; 8. } Il metodo eventLatLngAlt fa parte della classe MainForm, esso crea un oggetto di tipo DecimalToSexagesimal ed un riferimento ad esso (riga 3), trasforma le coordinate ricevute dall’esterno in formato decimale quindi le visualizza nelle label della barra di stato in formato sessagesimale. 1. function success(instance) { 2. ge = instance; 3. [...] 4. google.earth.addEventListener(ge.getWindow(), "mousemove", geEventListener); 5. [...] 6. } 7. 8. function geEventListener(kmlEvent) { 9. var latitude = kmlEvent.getLatitude(); 10. var longitude = kmlEvent.getLongitude(); 11. var altitude = kmlEvent.getAltitude(); 12. window.external.eventLatLngAlt(latitude, longitude, altitude); 13. } Il codice è tratto dal file GEPlugin.html, la pagina web caricata nel form. La funzione geEventListener è chiamata dall’evento mousemove sulla mappa (riga 4) e a sua volta chiama il metodo eventLatLngAlt della classe MainForm (12), oggetto reso disponibile precedentemente tramite la proprietà ObjectForScripting e raggiungibile ora come oggetto window.external. 37
  • 40. 5. Implementazione 5.2.5 Connessione al database ed esecuzione di una query Il seguente metodo è tratto dalla classe PointForm e provvede al popolamento della combobox con l’elenco dei periodi presenti sul database PRTR. 1. private void loadEmissionPeriods() 2. { 3. SqlConnection connection = new SqlConnection(); 4. connection.ConnectionString = ConfigurationSettings.AppSettings["connectionString"]; 5. connection.Open(); 6. String query = "SELECT * FROM ReportPeriod ORDER BY EndDate DESC"; 7. SqlCommand command = new SqlCommand(query, connection); 8. SqlDataAdapter dataAdapter = new SqlDataAdapter(command); 9. DataTable tablePeriod = new DataTable(); 10. dataAdapter.Fill(tablePeriod); 11. for (int i = 0; i < tablePeriod.Rows.Count; i++) 12. { 13. String period = tablePeriod.Rows[i]["Title"].ToString(); 14. cbPeriod.Items.Add(period); 15. } 16. cbPeriod.SelectedIndex = 0; 17. [...] 18. connection.Close(); 19. } Per la connessione ad un database è necessaria una connection string che raccolga le informazioni per la connessione, la cui formattazione dipende dal DBMS in cui risiede il database, nel caso in questione SQL Server 2005. La stringa di connessione di conseguenza prevede: • Data Source • Network Library • Initial Catalog • User Id • Password 38
  • 41. 5. Implementazione Si tratta rispettivamente di: indirizzo del server e porta sulla quale è in ascolto, protocollo utilizzato per la connessione, nome del database e credenziali dell’utente. Per far sì che queste informazioni possano venire modificate senza la necessità di ricompilare il progetto, sono state inserite in un file di configurazione a cui il programma accede nel momento in cui deve impostare la proprietà ConnectionString ad un riferimento di tipo SqlConnection (riga 4). DataTable rappresenta una tabella di dati in memoria, e grazie al metodo fill invocato su un oggetto di tipo SqlDataAdapter, il tramite fra Sql Server e la tabella locale, i dati locali vengono modificati per farli corrispondere a quelli originali, ovverosia la tabella viene riempita (10). Qui di seguito il contenuto del file di configurazione. 1. <?xml version="1.0" encoding="utf-8" ?> 2. <configuration> 3. <appSettings> 4. <add key="connectionString" value="Data Source=140.105.127.92,1433; Network Library=DBMSSOCN; Initial Catalog=PRTR; User Id=********; Password=********;"/> 5. </appSettings> 6. </configuration> 5.2.6 Esecuzione di una stored procedure Il seguente codice rappresenta il metodo lanciato alla pressione del tasto Submit Query sul form emissioni. Compito del metodo è stabilire una connessione con il database ed eseguire la stored procedure Statistics_GetByRegion. 1. private void bSubmitQuery_Click(object sender, EventArgs e) 2. { 3. SqlConnection connection = new SqlConnection(); 4. connection.ConnectionString = ConfigurationSettings.AppSettings["connectionString"]; 5. connection.Open(); 6. SqlCommand command = new SqlCommand("Statistics_GetByRegion", connection); 39
  • 42. 5. Implementazione 7. command.CommandType = CommandType.StoredProcedure; 8. command.Parameters.Add("@LongitudeDeg", SqlDbType.Int).Value = lngDeg; 9. command.Parameters.Add("@LongitudeMin", SqlDbType.Int).Value = lngMin; 10. command.Parameters.Add("@LongitudeSec", SqlDbType.Int).Value = lngSec; 11. command.Parameters.Add("@LatitudeDeg", SqlDbType.Int).Value = latDeg; 12. command.Parameters.Add("@LatitudeMin", SqlDbType.Int).Value = latMin; 13. command.Parameters.Add("@LatitudeSec", SqlDbType.Int).Value = latSec; 14. command.Parameters.Add("@Range", SqlDbType.Float).Value = Int32.Parse(tRange.Text); 15. command.Parameters.Add("@CultureCode", SqlDbType.NVarChar).Value = "en-US"; 16. command.Parameters.Add("@IDPeriod", SqlDbType.Int).Value = tablePeriod.Rows[cbPeriod.SelectedIndex].ItemArray[0]; 17. SqlDataAdapter dataAdapter = new SqlDataAdapter(command); 18. DataTable table = new DataTable(); 19. dataAdapter.Fill(table); 20. [...] 21. connection.Close(); 22. } Invocato il costruttore di SqlCommand con il nome della stored procedure ed il riferimento alla connessione (riga 6) ed impostata la proprietà CommandType su StoredProcedure (7), si impostano i parametri richiesti. Nel caso specifico si utilizza la stored procedure Statistics_GetByRegion, che richiede: • Gradi di longitudine • Minuti di longitudine • Secondi di longitudine • Gradi di latitudine • Minuti di latitudine • Secondi di latitudine • Raggio della circonferenza d’interesse • Codice della lingua utilizzata 40
  • 43. 5. Implementazione • Periodo selezionato nella combobox Per ulteriori informazioni sul database PRTR si rimanda alla documentazione tecnica dello stesso. 41
  • 44. 6. Conclusioni 6. Conclusioni 6.1 Risultati ottenuti I risultati ottenuti rispettano i vincoli di progetto discussi in fase di analisi. L’applicativo stand-alone creato integra Google Earth Plugin e per la visualizzazione dei dati di emissioni inquinanti si connette direttamente al database PRTR. La query sul database è riferita ad una regione circolare di territorio per la selezione della quale all’utente è richiesto un click sulla mappa per la determinazione del centro e l’inserimento manuale del valore del raggio. Tuttavia l’applicativo soffre di un bug presente nella struttura del database in questione. La tabella Facility, contenente informazioni riguardo ai complessi, memorizza la dislocazione sul territorio di tali infrastrutture con coordinate geografiche in formato sessagesimale, dedicando tre campi distinti a gradi, minuti e secondi. Ciò introduce un errore nel momento in cui si aggiunge un complesso le cui coordinate, longitudine o latitudine, sono incluse nell’intervallo tra -0° 0’ 1” e -0° 59’ 59”. Nel campo riferito ai gradi infatti non viene riconosciuto il segno dello zero il che comporta un’ambiguità nell’intervallo tra -0° 59’ 59” e 0° 59’ 59”. La stored procedure Statistics_GetByRegion sfruttata dall’applicativo presenta la stessa struttura e di conseguenza lo stesso bug. 6.2 Lavoro svolto Qui di seguito sono riportati alcuni indici atti a quantificare il lavoro svolto: Codice C#: • Classi: 5 • Metodi: 62 • Righe di codice: 3261 Codice HTML / Javascript: • Funzioni: 8 • Righe di codice: 85 42
  • 45. 6. Conclusioni 6.3 Sviluppi futuri L’applicativo è stato progettato per consentire all’utente di selezionare sulla mappa il punto e quindi di inserire manualmente il valore del raggio dell’ideale circonferenza d’interesse. Un possibile sviluppo potrebbe essere la selezione della circonferenza direttamente sulla mappa similmente a quanto accade nei programmi di editing di immagini, mediante trascinamento e modifica delle dimensioni della figura con il solo utilizzo del mouse. Tale sviluppo potrebbe essere integrato dalla possibilità di selezionare aree poligonali di territorio in cui l’utente dovrebbe scegliere cliccando sulla mappa i punti che andrebbero a costituire i vertici. Si rivelerebbero necessari algoritmi per verificare che egli abbia disegnato una spezzata chiusa e che il poligono non sia intrecciato. Imporre la convessità costituirebbe un vincolo troppo limitativo, basti pensare ad esempio ad un utente che si ponesse l’obiettivo di visualizzare le emissioni sul territorio italiano, per la cui selezione dovrebbe avere la possibilità di tracciare un poligono concavo. Per quanto riguarda le Google Earth API, queste forniscono gli strumenti per sviluppare ulteriormente l’applicativo dal punto di vista del disegno del poligono e della visualizzazione dei risultati. Una possibile linea di sviluppo potrebbe riguardare il database PRTR, nell’applicativo potrebbero essere integrate ulteriori query al fine di consentire all’utente un’analisi delle emissioni una volta scelto il periodo o la compagnia. Per quanto riguarda la funzione GetDistance, utilizzata dalla già citata stored procedure Statistics_GetByRegion e responsabile del calcolo delle distanza tra due punti, potrebbe essere migliorata al fine di fornire una precisione maggiore. Al momento è implementato l’algoritmo della legge dei coseni sferici, sostituire questo con la formula di Haversine11 o la formula di Vincenty12 migliorerebbe la precisione del calcolo, a discapito però di una maggiore complessità matematica. Sotto l’aspetto della connessione al database PRTR, in fase di stesura dei requisiti si è stabilito che questa dovesse essere diretta e locale ovverosia, nel caso in questione, che l’applicativo si dovesse connettere direttamente al database dall’interno della rete d’ateneo. Un possibile sviluppo dell’applicativo potrebbe estendere l’utilizzo dello stesso anche all’esterno della rete universitaria. In questo caso si rivelerebbe necessaria l’introduzione di 11 http://en.wikipedia.org/wiki/Haversine_formula 12 http://en.wikipedia.org/wiki/Vincenty%27s_formulae 43
  • 46. 6. Conclusioni un web service che faccia da tramite fra l’applicativo ed il database allo scopo di aggirare il problema del firewall, il quale blocca il traffico sulla porta utilizzata dal primo per procedere alla connessione. 44
  • 47. 7. Bibliografia 7. Bibliografia • Nagel C. Evjen B. Glynn J. Skinner M. Watson K. Jones A., C# 2005 - Guida per lo Sviluppatore, Editore Ulrico Hoepli Milano, 2006 • PRTR technical documentation • http://msdn.microsoft.com/it-it/library • http://javascript.html.it/guide/leggi/25/guida-javascript-di-base/ • http://code.google.com/intl/it-IT/apis/earth/documentation/ • http://code.google.com/apis/ajax/playground/ • http://programmazione.html.it/guide/leggi/41/guida-uml/ 45