Your SlideShare is downloading. ×
Progetto e sviluppo di un applicativo basato su Google Earth per la visualizzazione di dati di emissioni inquinanti
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

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

1,813
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,813
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
45
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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 INQUINANTIRelatore: Laureando:Ill.mo Prof. Maurizio FERMEGLIA Raffaele BERNARDI Anno accademico 2009 – 2010
  • 2. Indice1. 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 .................................................................................................. 52. 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 ................................................................................. 103. Progettazione ................................................................................................................ 11 3.1 Use case diagram .................................................................................................. 11 3.2 Activity diagram ................................................................................................... 12 3.3 Class diagram ........................................................................................................ 144. 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
  • 3. 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 .............................................................. 396. Conclusioni .................................................................................................................. 42 6.1 Risultati ottenuti .................................................................................................... 42 6.2 Lavoro svolto ........................................................................................................ 42 6.3 Sviluppi futuri ....................................................................................................... 437. Bibliografia .................................................................................................................. 45 2
  • 4. 1. Introduzione 1. Introduzione 1.1 Obiettivo della tesiL’obiettivo che ci si è posti con questa tesi è la progettazione e lo sviluppo di unapplicativo stand-alone che presenti un’interfaccia user friendly per l’interrogazione deldatabase 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 regionegeografica per ottenere i relativi valori delle emissioni. La selezione avviene per porzionicircolari di territorio, all’inserimento delle coordinate geografiche del punto desideratosegue la determinazione di un raggio d’interesse. Questi costituiscono rispettivamentecentro e raggio dell’ideale circonferenza all’interno della quale si desidera estrarre leinformazioni dal database. 1.2 Stato dell’arteAl momento esiste ed è operativa un’applicazione1 web simile per funzionalità ma diversaper struttura. Figura 1 - Lapplicazione web1 http://prtr.units.it/ 3
  • 5. 1. IntroduzioneL’inserimento delle coordinate geografiche è manuale, di conseguenza all’utente vieneimplicitamente richiesta la conoscenza delle coordinate del punto d’interesse. 1.3 Risultato della tesiIl 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 - Lapplicazione PRTR Google Earth Interface 1.4 MotivazioniL’applicazione web esistente prevede l’inserimento manuale delle coordinate geografichedel punto d’interesse. L’operazione richiede quindi uno sforzo preventivo all’utente che diquesto non conosca già le coordinate, una ricerca tramite altri strumenti, esterniall’applicazione, che gli permetta di scoprire i relativi valori di latitudine e longitudine. Di 4
  • 6. 1. Introduzioneconseguenza il sistema in uso introduce una probabilità d’errore nel momento in cui egliriporta i dati nell’applicativo. L’utilizzo di una mappa che l’utente possa esplorare sino alraggiungimento del punto d’interesse ovvia ad entrambi i problemi. All’utente non vienerichiesta la conoscenza preventiva delle coordinate geografiche, tantomeno lo costringeall’inserimento manuale di tali valori e ciò comporta una sensibile riduzione dellaprobabilità d’errore. 1.5 Vincoli di progettoSono 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
  • 7. 2. Analisi 2. AnalisiPartendo dal presupposto di dover presentare all’interno del proprio applicativoun’interfaccia di semplice utilizzo, ci si è concentrati sul vincolo relativo allo sfruttamentodelle API di Google Earth. In seguito, per l’interrogazione del database PRTR, sulle storedprocedure offerte dallo stesso e già utilizzate dall’applicazione web esistente. 2.1 Google EarthL’applicazione, creata con il nome di Keyhole dall’omonima società, divenne GoogleEarth quando nel 2004 Google acquisì la Keyhole, Inc. Giunto alla versione 6, il softwareconsente all’utente l’esplorazione ‘in volo’ del globo terrestre, mediante foto satellitari edaeree è possibile infatti visualizzare ogni zona del pianeta a diversi livelli di zoom, il cuilivello massimo, conservando una risoluzione accettabile, varia a seconda del luogo. Lanavigazione 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 odell’indirizzo (grazie all’integrazione con Google Maps).Per rappresentare la superficie del pianeta, Google Earth utilizza la proiezione cilindricaequirettangolare, in cui meridiani e paralleli sono linee rette equidistanti che si intersecanoad angolo retto, con datum WGS84, elissoide geocentrico concepito per coprire l’interoglobo terrestre2. 2.2 Google Earth PluginAccanto all’applicativo stand-alone, Google nel 2008 rilasciò il plugin del suddettosoftware, consentendo in tal modo all’utente l’esplorazione del globo direttamenteall’interno del proprio browser web.2 http://earth.google.com/intl/it/userguide/v4/ug_importdata.html 6
  • 8. 2. Analisi 2.3 Google Earth API: Javascript vs COMIn concomitanza al rilascio del plugin, Google mise a disposizione le API (ApplicationProgramming Interface) Javascript necessarie agli sviluppatori che avessero voluto creareapplicazioni web proprie sfruttando le potenzialità di Google Earth. Queste andarono adaffiancarsi alle API COM, fino a quel momento l’unico mezzo per chi avesse volutosviluppare codice su questo software, esistenti ancor prima che Keyhole divenisse GoogleEarth. Sebbene quest’ultime fossero state mantenute anche dopo tale passaggio, nongodettero mai dello stesso supporto e documentazione che invece vantano le prime. Ladifficoltà nel reperire informazioni e lo scarso supporto sono stati confermati dalla stessaazienda statunitense, la quale nell’agosto 2010 ha annunciato che la versione 5.2 sarebbestata 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 allowfurther customization of users’ Google Earth experience. When Keyhole became GoogleEarth 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 thevagaries of COM programming. Eventually we had a small but committed developmentcommunity demanding documentation, which we released in 2007. We saw someinteresting 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 releasedthe Google Earth API and browser plug-in. This robust JavaScript API is more powerfulthan the COM API, and can be used on a variety of platforms to deliver compelling 3Dapplications over the web based on the Google Earth technology. At the same time, westopped development on the COM API and began encouraging developers to migrate tothe Earth API instead. Today, more and more apps are being written in JavaScript, andCOM itself is no longer a widely used technology, so the time has come to retire theGoogle Earth COM API. Today we’re announcing that the Google Earth 5.2 client will bethe last version that supports the COM API. […] We believe that the JavaScript APIprovides the best mechanism for reaching the most developers. […] ” (Mano Marks, GeoAPIs Team).Ai fini dell’applicativo quindi si è scelto di operare con le Javascript API. Ladocumentazione online è affiancata da numerosi esempi più o meno complessi, divisi per 7
  • 9. 2. Analisicategorie, e forum di supporto. Risalta l’assenza di indicazioni per lo sviluppatore che siponesse l’obiettivo di costruire applicazioni stand-alone anziché web. 2.4 Il progetto PRTRIl PRTR (Pollutant Release and Transfer Register) è un database contenente dati diemissioni inquinanti. L’organizzazione responsabile del progetto è l’ICS (InternationalCentre for Science and High Technology) che agisce nell’ambito dell’UNIDO (UnitedNations Industrial Development Organization). L’obiettivo dell’ente è sostenere lecomunità scientifiche nei Paesi in via di sviluppo e nei Paesi ad economia di transizioneattraverso attività di ricerca e formazione avanzata per la crescita industriale sostenibile. Lecompetenze sviluppate al suo interno forniscono una serie di strumenti che trovanoapplicazione in molteplici settori, quali: chimica pura ed applicata, scienze della terradell’ambiente e del mare, alta tecnologia e nuovi materiali.Uno dei principali progetti dell’area ambientale dell’ICS/UNIDO è la distribuzione delleconoscenze sui sistemi per il supporto decisionale. Lo scopo è la creazione di un centro diraccolta di conoscenze atto a formare personale competente negli ambiti della simulazionedei processi e nei sistemi di informazione geografici. In tal modo si sviluppa unprogramma che possa favorire il monitoraggio dei sistemi, l’analisi e l’accertamento delrischio, l’applicazione effettiva della tecnologia in risposta a problemi ambientali causatida attività industriali. Rientra in questo ambito il progetto riguardante lo sviluppo di unsistema pubblico per la raccolta e la divulgazione dei dati sugli inquinanti, il PRTR.Progettato come un database ambientale, il Pollutant Release and Transfer Registerrappresenta un inventario di emissioni potenzialmente dannose riguardanti terra,sottosuolo, acqua e aria, inoltre tiene conto del trasporto degli inquinanti in luoghi ditrattamento e discarica. Il PRTR si inserisce molto bene nella struttura organizzativa per losviluppo industriale sostenibile, la conoscenza delle quantità delle sostanze emesseconsente di stimare l’equilibrio tra il materiale utilizzato per il processo e l’energiaimpiegata per lo stesso, ottimo indicatore della sostenibilità di un processo industriale.Inoltre i report registrando l’evoluzione delle emissioni nel tempo possono incoraggiarel’introduzione di tecnologie più pulite al fine di ridurre il livello di inquinamentoambientale. 8
  • 10. 2. AnalisiI dati presenti nel Pollutant Release and Transfer Register presentano queste caratteristicheprincipali: • 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 Releaseand Transfer Register) si identifica nel nostro Paese nell’INES (Inventario Nazionale delleEmissioni e loro Sorgenti). 2.5 Il database PRTRDal punto di vista tecnico, il DBMS utilizzato per il database PRTR contenente leinformazioni relative alle emissioni inquinanti è SQL Server 2005. Da precisare che illaureando non ha partecipato alla stesura del relativo codice né a parte di esso, per quantoriguarda 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
  • 11. 2. Analisi 2.5.1 Legge dei coseni sfericiInteressante inoltre la funzione GetDistance, utilizzata dalla prima delle procedure citate,che torna la distanza d fra due punti sulla superficie terrestre definiti dalle rispettivecoordinate 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 superficienei punti 1 e 2) : raggio della sfera3 Per ulteriori informazioni: (1) http://en.wikipedia.org/wiki/Great-circle_distance(2) http://en.wikipedia.org/wiki/Spherical_law_of_cosines 10
  • 12. 3. Progettazione 3. ProgettazioneIn questo capitolo si procede alla progettazione dell’applicativo mediante gli strumentiforniti dal linguaggio UML. Creato con l’intento di unificare in un unico standard lemetodologie per il disegno nell’ambito della progettazione di sistemi software, l’UML(Unified Modeling Language) stabilisce un insieme di notazioni e simboli, una collezionedi diagrammi composti da elementi grafici e testuali che consentono di descrivere ilsistema a più livelli d’astrazione. 3.1 Use case diagramLo Use case diagram è lo strumento utilizzato per la descrizione delle funzionalità offertedal software dal punto di vista degli attori che interagiscono con il sistema stesso. Figura 3 - Use case diagramNel caso dell’applicativo in questione, si vuole che l’utente possa esplorare il globo allaricerca del punto d’interesse. Sono permesse diverse modalità di navigazione e ad eglispetta la scelta di visualizzare o meno una serie di strumenti di supporto e di informazioniaggiuntive. Una volta determinato il punto, procede alla selezione del periodo e del raggio 11
  • 13. 3. Progettazionedella circonferenza ideale di cui esso è il centro. Infine visualizza i dati relativi alleemissioni inquinanti inerenti alla regione geografica prescelta. 3.2 Activity diagramL’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 cheintervengono nel corso dell’elaborazione. Figura 4 - Activity diagram riferito ai sistemi PRTR Google Earth Interface e Google Earth ServerAllo scopo di rendere il diagramma più comprensibile si è scelto di scinderlo nelle dueparti che caratterizzano l’algoritmo dell’applicativo. La prima di queste riguardal’interazione con il plugin di Google Earth (Figura 4), l’altra la connessione con ildatabase 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
  • 14. 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 dinteresse: l’utente seleziona sulla mappa il punto d’interesse. Figura 5 - Activity diagram riferito ai sistemi PRTR Google Earth Interface e Prtr database4 Camera view : punto di vista dell’osservatore ideale. 13
  • 15. 3. ProgettazioneLa figura soprastante raffigura l’insieme delle attività riguardanti l’interazione con ildatabase PRTR, unita al primo diagramma rappresenta l’algoritmo completo alla basedell’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 diagramUtilizzando 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
  • 16. 3. Progettazione Figura 6 - Class diagramAl fine di non appesantire eccessivamente il diagramma, per ognuna delle classi sono statiomessi gli attributi, per la cui lettura si rimanda al codice sorgente, ed i metodi, che sianalizzano 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
  • 17. 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
  • 18. 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
  • 19. 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
  • 20. 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 unoscript per il caricamento e la gestione di Google Earth Plugin.Sono presenti le funzioni: • init() Crea un’istanza di Google Earth Plugin. 19
  • 21. 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
  • 22. 4. Interfaccia 4. InterfacciaNel presente capitolo si descrive l’interfaccia dell’applicativo, partendo dall’analisi deiform che lo compongono, quindi dei rispettivi singoli componenti ed infine nel suocomplesso, mediante un esempio d’utilizzo. 4.1 Form principaleIl form principale contiene gli strumenti per consentire all’utente di selezionare il punto disuo interesse. Figura 7 - Form principale dellapplicativo 21
  • 23. 4. InterfacciaLa 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 menuLa barra dei menu è divisa in tre categorie File, View, ?. La prima rappresenta le funzioninecessarie al caricamento ed alla chiusura dell’applicazione; la seconda fornisce un elencodi 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 diun punto all’orizzonte, calcolata muovendosi in senso orario (cit. Wikipedia). Nello specifico, la distanzaangolare tra la direzione del Nord e la direzione della camera view. 22
  • 24. 4. Interfaccia Figura 8 - Barra dei menu 4.1.2 Barra di statoLa barra di stato mostra la latitudine, la longitudine e l’altitudine del punto sulla mappa incorrispondenza 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 indirizzoUna delle possibilità che l’utente può sfruttare per la localizzazione di un punto è la ricercaper indirizzo. Sono presenti controlli per prevedere input errati nel textbox relativoall’altezza da terra della camera view, ovverosia maggiori di 10.000 km e negativi. Persemplificare e velocizzare la ricerca, è possibile passare da un controllo al successivomediante la pressione del tasto Invio. Figura 10 - Ricerca tramite indirizzo 23
  • 25. 4. Interfaccia 4.1.4 Dialog box per la ricerca tramite coordinate geograficheIn alternativa al primo metodo, l’utente può rilocare la camera view mediante l’inserimentodelle coordinate del punto d’interesse. Anche in questo caso sono presenti controlli cheverificano la validità dei valori inseriti dall’utente. Come nel caso precedente, l’altezza daterra della camera view deve essere compresa tra 0 e 10.000 km, i campi relativi ai minutied ai secondi possono contenere interi da 0 a 59, quello della latitudine da -90 a 90, dellalongitudine da -180 a 180. Inoltre vengono sottoposte a verifica anche le coordinate nelloro 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 quantoaccade nel primo dialog box, l’utente può spostarsi di controllo in controllo premendoInvio. Figura 11 - Ricerca tramite coordinate geografiche 4.1.5 Google Earth Plugin integratoIl componente principale del form è il plugin di Google Earth, su di esso l’utente ha lafacoltà di navigare e modificare parametri quali lo zoom e il tilt nello stesso modo in cuipuò farlo nell’applicazione Google Earth. Una volta scelto il punto, per procedere allaselezione di questo deve mettere la spunta sul checkbox a lato e quindi cliccare sullamappa. 24
  • 26. 4. Interfaccia Figura 12 - Google Earth Plugin e il checkbox per procedere con la selezione del punto 4.2 Form informazioniNel form informazioni è possibile visualizzare la versione del programma, delle JavascriptAPI e del plugin di Google Earth attualmente installato sul pc. Figura 13 - Form informazioni 25
  • 27. 4. Interfaccia 4.3 Form emissioniIl form emissioni presenta i dati relativi alle emissioni inquinanti, ovvero i risultati dellequery sul database PRTR. Figura 14 - Form emissioniLa 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
  • 28. 4. Interfaccia 4.3.1 Scheda Regional emissionsNella scheda Regional emissions è presente un dialog box in cui l’utente deve selezionareda una combobox il periodo d’interesse ed inserire il raggio in chilometri dellacirconferenza il cui centro è il punto scelto precedentemente sulla mappa. Il risultato dellaquery viene evidenziato in una tabella che elenca i prodotti chimici dichiarati nei report deicomplessi la cui locazione è all’interno dell’ideale circonferenza.Per ogni prodotto si indica la quantità di emissioni (in kg) in: • Aria • Sottosuolo • Acqua • Terra • TotaleIn fondo alla scheda è visualizzato il grafico relativo al prodotto chimico del recordselezionato. Figura 15 - Form emissioni, scheda Regional emissions 27
  • 29. 4. Interfaccia 4.3.2 Scheda Chemical infoNella scheda Chemical info l’utente può avere informazioni aggiuntive sul prodottochimico selezionato tramite una tabella che ne rappresenta lo storico. Sono infatti elencati ivalori delle emissioni divisi per i periodi dei report in cui il prodotto compare. Il risultatodi tale query è rappresentato anche da un diagramma a colonne, al di sotto del qualeun’altra tabella elenca i report, visualizzandoli mediante il nome del complesso che lo hastilato ed il periodo a cui il contenuto fa riferimento. Figura 16 - Form emissioni, scheda Chemical info 4.3.3 Scheda Facility infoLa terza scheda, Facility info, evidenzia informazioni riguardanti il report selezionatoprecedentemente, quindi sul complesso che lo ha stilato e sui valori delle emissioni delprodotto chimico scelto dall’utente nella prima scheda.Del complesso si forniscono: 28
  • 30. 4. Interfaccia • Indirizzo • Città • E-mail • Telefono • Sito internet • Nome della compagniaPer quanto riguarda il prodotto chimico, il tipo di informazioni visualizzate ricalca quantovisto 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’utilizzoL’utente vuole avere informazioni riguardo alle emissioni inquinanti nel raggio di 100 kmdall’edificio centrale dell’Università di Trieste, dati riferiti all’anno 2000. 29
  • 31. 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’installazioneL’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.html8 Per il download: http://www.google.com/earth/index.html9 Per il download: http://www.microsoft.com/downloads/en/details.aspx?FamilyId=130F7986-BF49-4FE5-9CA8-910AE6EA442C 30
  • 32. 5. Implementazione 5. ImplementazioneIn questo capitolo viene descritta l’implementazione dell’applicativo, il cui codice è statoscritto per intero dal laureando eccezion fatta per le righe generate automaticamentedall’IDE utilizzato. Qui di seguito vengono presentate nel dettaglio le parti salientidell’applicativo, si tralasciano quelle riguardanti l’aspetto grafico o la gestione delleeccezioni mediante blocchi try-catch-finally o funzioni di minor interesse, per la letturadelle quali si rimanda al listato sorgente. 5.1 Tecnologie software utilizzateDall’analisi dei vincoli di progetto si apprende che l’applicativo deve essere stand-alone edintegrare le funzionalità di Google Earth, le cui API però nascono con l’obiettivo diconsentire agli sviluppatori di scrivere applicazioni web. Ne consegue la necessità discrivere 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# perl’applicativo stand-alone all’interno del quale il primo deve essere integrato. Qualistrumenti di supporto allo sviluppo sono stati utilizzati Notepad++ versione 5 e VisualStudio 2008. 5.2 Codice 5.2.1 Caricamento di Google Earth PluginIl seguente codice è tratto dal file GEPlugin.html, include le istruzioni di caricamento delplugin, 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
  • 33. 5. Implementazione6. 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
  • 34. 5. ImplementazionePer poter caricare il plugin è necessario completare l’url con la propria Maps API Keyottenibile 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 GoogleMaps (8). Il metodo che consente di creare una nuova istanza del plugin (11) prevede tra isuoi parametri il nome delle procedure da invocare nel caso l’operazione dovesse fallire oavere 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 talesede. Le funzioni goToAddress (20) e goToCoordinates (31) vengono invocatedall’esterno, si sottolinea l’utilizzo da parte della prima delle Google Maps API versione 2per la creazione di un’istanza ClientGeocoder (21) e l’invocazione su questa del metodogetLatLng (22). 5.2.2 Integrazione di Google Earth PluginIl codice che segue è presente nella classe MainForm dell’applicativo, si evidenziano leparti 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
  • 35. 5. ImplementazioneIl controllo WebBrowser consente di inserire una pagina web in un form, quindi si prestaottimamente per l’applicativo in questione. Il metodo Navigate carica il documentoindicato come parametro (riga 7), il cui percorso viene composto runtime tramite reflection(1). L’operazione successiva è impostare l’oggetto accessibile dal codice contenuto nellapagina web caricata nel WebBrowser, in questo caso il form stesso, tramite la proprietàObjectForScripting10 (8). Il metodo jsInitSuccess (12) è invocato dalla pagina una voltacreata una nuova istanza del plugin. 5.2.3 Chiamata ad un metodo esternoIl seguente metodo, tratto anch’esso dalla classe MainForm, è legato all’evento pressionedel 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’utente5. // conversione dalle coordinate sessagesimali alle decimali6. [...]7. wbGE.Document.InvokeScript("goToCoordinates", new object[] { lat, lng, alt });8. }10 Proprietà WebBrowser.ObjectForScripting : Utilizzare questa proprietà per abilitare la comunicazione trauna pagina Web inserita nel controllo WebBrowser e lapplicazione che contiene il controllo WebBrowser.La proprietà consente di integrare codice HTML dinamico (DHTML) con il codice dellapplicazione client.Loggetto specificato per questa proprietà è disponibile per lo script della pagina Web come oggettowindow.external, che è un oggetto DOM incorporato fornito per laccesso allhost. È possibile impostarequesta proprietà su qualsiasi oggetto visibile a COM le cui proprietà e i cui metodi pubblici devono essereresi disponibili al codice di script (cit. http://msdn.microsoft.com/it-it/library).COM (Component Object Model) : interfaccia per componenti software, permette la comunicazione traprocessi e creazione dinamica di oggetti con qualsiasi linguaggio di programmazione che supporta questatecnologia. 34
  • 36. 5. ImplementazioneSi tralasciano le righe di codice riguardanti il controllo di validità dei valori immessidall’utente e la conversione dalla notazione sessagesimale, presente nell’interfaccia, aquella decimale, richiesta dalle API di Google, nel codice rappresentata dalle variabili latlng. Si sottolinea il metodo InvokeScript (riga 7) il cui compito è l’esecuzione di unafunzione definita in una pagina web, in questo caso nel documento integrato nel formtramite il controllo WebBrowser. I parametri del metodo sono rispettivamente il nome dellafunzione esterna ed un array di object rappresentante i parametri di quest’ultima. 5.2.4 Conversione di coordinate e aggiornamento della posizione del puntatoreNella barra di stato del form principale sono visualizzati i valori di latitudine, longitudine ealtitudine relativi alla posizione del puntatore sulla mappa. Sfruttando le Google Earth APIè possibile risalire alle coordinate del punto in formato decimale, per la lorovisualizzazione sull’interfaccia si richiede una conversione. Di seguito vengono presentatee descritte le classi e le funzioni che entrano in gioco in questo contesto.1. public class DecimalToSexagesimal2. {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
  • 37. 5. Implementazione20. 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 utilizzatanel momento in cui è necessaria una conversione di rappresentazione di coordinate. Iparametri del costruttore sono i valori decimali della latitudine e della longitudine, perquanto riguarda i metodi forniti dalla classe sono semplici get sui singoli componenti dellecoordinate in formato sessagesimale. Si nota che l’applicativo tratta i secondi come numeriinteri, tale semplificazione non rappresenta un’approssimazione rilevante per i successivicalcoli delle distanze, data la formula utilizzata dal database per il calcolo. Questa infattibasandosi sulla legge dei coseni sferici introduce errori di approssimazione considerando laTerra come una sfera.1. public void eventLatLngAlt(float lat, float lng, float alt)2. {3. DecimalToSexagesimal dts = new DecimalToSexagesimal(lat, lng); 36
  • 38. 5. Implementazione4. [...]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 tipoDecimalToSexagesimal ed un riferimento ad esso (riga 3), trasforma le coordinate ricevutedall’esterno in formato decimale quindi le visualizza nelle label della barra di stato informato 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 funzionegeEventListener è chiamata dall’evento mousemove sulla mappa (riga 4) e a sua voltachiama il metodo eventLatLngAlt della classe MainForm (12), oggetto reso disponibileprecedentemente tramite la proprietà ObjectForScripting e raggiungibile ora come oggettowindow.external. 37
  • 39. 5. Implementazione 5.2.5 Connessione al database ed esecuzione di una queryIl seguente metodo è tratto dalla classe PointForm e provvede al popolamento dellacombobox 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 leinformazioni per la connessione, la cui formattazione dipende dal DBMS in cui risiede ildatabase, nel caso in questione SQL Server 2005. La stringa di connessione diconseguenza prevede: • Data Source • Network Library • Initial Catalog • User Id • Password 38
  • 40. 5. ImplementazioneSi tratta rispettivamente di: indirizzo del server e porta sulla quale è in ascolto, protocolloutilizzato per la connessione, nome del database e credenziali dell’utente. Per far sì chequeste 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 incui 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 fillinvocato su un oggetto di tipo SqlDataAdapter, il tramite fra Sql Server e la tabella locale, idati locali vengono modificati per farli corrispondere a quelli originali, ovverosia la tabellaviene 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 procedureIl seguente codice rappresenta il metodo lanciato alla pressione del tasto Submit Query sulform emissioni. Compito del metodo è stabilire una connessione con il database edeseguire 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
  • 41. 5. Implementazione7. 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 riferimentoalla connessione (riga 6) ed impostata la proprietà CommandType su StoredProcedure (7),si impostano i parametri richiesti. Nel caso specifico si utilizza la stored procedureStatistics_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
  • 42. 5. Implementazione • Periodo selezionato nella comboboxPer ulteriori informazioni sul database PRTR si rimanda alla documentazione tecnica dellostesso. 41
  • 43. 6. Conclusioni 6. Conclusioni 6.1 Risultati ottenutiI risultati ottenuti rispettano i vincoli di progetto discussi in fase di analisi. L’applicativostand-alone creato integra Google Earth Plugin e per la visualizzazione dei dati diemissioni 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 delvalore del raggio.Tuttavia l’applicativo soffre di un bug presente nella struttura del database in questione. Latabella Facility, contenente informazioni riguardo ai complessi, memorizza la dislocazionesul territorio di tali infrastrutture con coordinate geografiche in formato sessagesimale,dedicando tre campi distinti a gradi, minuti e secondi. Ciò introduce un errore nel momentoin cui si aggiunge un complesso le cui coordinate, longitudine o latitudine, sono inclusenell’intervallo tra -0° 0’ 1” e -0° 59’ 59”. Nel campo riferito ai gradi infatti non vienericonosciuto 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’applicativopresenta la stessa struttura e di conseguenza lo stesso bug. 6.2 Lavoro svoltoQui di seguito sono riportati alcuni indici atti a quantificare il lavoro svolto:Codice C#: • Classi: 5 • Metodi: 62 • Righe di codice: 3261Codice HTML / Javascript: • Funzioni: 8 • Righe di codice: 85 42
  • 44. 6. Conclusioni 6.3 Sviluppi futuriL’applicativo è stato progettato per consentire all’utente di selezionare sulla mappa il puntoe quindi di inserire manualmente il valore del raggio dell’ideale circonferenza d’interesse.Un possibile sviluppo potrebbe essere la selezione della circonferenza direttamente sullamappa similmente a quanto accade nei programmi di editing di immagini, mediantetrascinamento e modifica delle dimensioni della figura con il solo utilizzo del mouse.Tale sviluppo potrebbe essere integrato dalla possibilità di selezionare aree poligonali diterritorio in cui l’utente dovrebbe scegliere cliccando sulla mappa i punti che andrebbero acostituire i vertici. Si rivelerebbero necessari algoritmi per verificare che egli abbiadisegnato 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 siponesse l’obiettivo di visualizzare le emissioni sul territorio italiano, per la cui selezionedovrebbe avere la possibilità di tracciare un poligono concavo.Per quanto riguarda le Google Earth API, queste forniscono gli strumenti per sviluppareulteriormente l’applicativo dal punto di vista del disegno del poligono e dellavisualizzazione dei risultati.Una possibile linea di sviluppo potrebbe riguardare il database PRTR, nell’applicativopotrebbero essere integrate ulteriori query al fine di consentire all’utente un’analisi delleemissioni una volta scelto il periodo o la compagnia. Per quanto riguarda la funzioneGetDistance, utilizzata dalla già citata stored procedure Statistics_GetByRegion eresponsabile del calcolo delle distanza tra due punti, potrebbe essere migliorata al fine difornire una precisione maggiore. Al momento è implementato l’algoritmo della legge deicoseni sferici, sostituire questo con la formula di Haversine11 o la formula di Vincenty12migliorerebbe 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, chel’applicativo si dovesse connettere direttamente al database dall’interno della rete d’ateneo.Un possibile sviluppo dell’applicativo potrebbe estendere l’utilizzo dello stesso ancheall’esterno della rete universitaria. In questo caso si rivelerebbe necessaria l’introduzione di11 http://en.wikipedia.org/wiki/Haversine_formula12 http://en.wikipedia.org/wiki/Vincenty%27s_formulae 43
  • 45. 6. Conclusioniun web service che faccia da tramite fra l’applicativo ed il database allo scopo di aggirare ilproblema del firewall, il quale blocca il traffico sulla porta utilizzata dal primo perprocedere alla connessione. 44
  • 46. 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