11

Click here to load reader

Graphical Interface for Statistical Information of Trento Province based on VTP

Embed Size (px)

DESCRIPTION

Implementation of a C++ graphical interface that allows to navigate the digital model of the Trento province to obtain statistical information considering the " municipality" as the territorial unit of reference.

Citation preview

Page 1: Graphical Interface for Statistical Information of Trento Province based on VTP
Page 2: Graphical Interface for Statistical Information of Trento Province based on VTP

2

1. Scopo del progetto Lo scopo del progetto consiste nella realizzazione di un’interfaccia grafica che consenta di navigare sul modello digitale del territorio della provincia di Trento per ottenere informazioni di carattere statistico considerando il “comune” come unità territoriale di riferimento. Il programma è stato scritto in C++ partendo dal progetto mfcSimple fornito con il pacchetto del codice sorgente di VTP. 2. Strumenti utilizzati L’applicazione realizzata è stata sviluppata utilizzando i seguenti strumenti: Ambiente VTP VTP (Virtual Terrain Project, http://www.vterrain.org), un sistema composto di più applicazioni open-source C++ che consentono l’elaborazione di DTM ed ortofoto georeferenziati allo scopo di ottenere ambienti virtuali tridimensionali. In particolare sono state utilizzate le due applicazioni:

• VTBuilder: applicativo in grado di visualizzare un ambiente bidimensionale e gestire le informazioni necessarie per la generazione dell’ambiente tridimensionale

• mfcSimple: è un semplice visualizzatore 3D, utilizzato come modello base dove sono state introdotte nuove funzionalità implementate

MFC (Microsoft Foundation Class) E’ una libreria di classi C++ incapsulante le Windows API. MFC contiene tutto ciò che è indispensabile per gestire un’interfaccia grafica e si trova già integrata nei sistemi operativi Microsoft. PostGis E’ un free software database per i dati geografici. Implementa il supporto per oggetti geografici all’interno del database relazionale PostgreSQL, consentendo l’archiviazione di dati vettoriali con coordinate 2D e 3D. Le geometrie che si possono manipolare ed utilizzare grazie a PostGis sono: point, polygon, multipoint, multiline, multipolygon, geometrycollections. I dati spaziali relativi alla provincia di Trento, sono stati importati in PostGis utilizzando i seguenti comandi: shp2pgsql comuni [public.]comuni > c:\temp\comuni.sql pgsql -U postgres -d postgis -f c:\temp\comuni.sql Il comando shp2pgsql consente di generare un file di testo con le query di inserimento delle geometrie e dei dati a partire dai dati contenuti in uno shapefile (nel nostro caso lo shapefile comuni, che contiene le informazioni relative ai comuni della provincia di Trento). Il comando pgsql permette invece di importare le informazioni così generate nella base dati PostGis (effettua sia la definizione della tabella che il popolamento della stessa). La connessione alla base dati postGIS avviene tramite un’origine dati DSN (Data Source Name) che specifica gli estremi per l’accesso al database e che chiaramente deve essere definita tra le origini dati ODBC prima di avviare l’applicazione. L’origine dati ODBC deve avere nome postgis-dsn.

Page 3: Graphical Interface for Statistical Information of Trento Province based on VTP

3

Ms Access MS Access è uno degli strumenti di persistenza dei dati di Microsoft ed lo strumento che è stato utilizzato in questo progetto per memorizzare le informazioni di carattere statistico che una volte selezionate devono poi essere visualizzate sull’ambiente tridimensionale. La base dati, che deve essere posizionata nella stessa cartella dell’applicazione mfcSimple, è costituita dal file avente nome dati.mdb. Trattando lo stesso tipo di informazione ovvero, la suddivisione categorica (ad es. “stranieri residenti” piuttosto che “popolazione residente”) della popolazione per sesso, i dati sono stati organizzati in tabelle tutte riportanti la medesima struttura:

• Comune codice ISTAT del comune • Anno anno di riferimento del dato • Maschi informazione numerica relativa ai maschi • Femmine informazione numerica relativa alle femmine

2.1 VTBuilder Tramite l’applicazione VTBulider, preposta alla gestione dei dati GIS georeferenziati in due dimensioni ed alla loro visualizzazione tridimensionale, è stato definito il file pat.bt (bt = Binary Terrain). Per la generazione di tale file si è fatto uso della griglia di elevazione definita nel file in formato ascii dtm1280.asc che rappresenta il DTM (Digital Terrain Model) ovvero il profilo altimetrico del terreno, avente ampiezza di cella pari a 1280 m. Dopo essere stato caricato in VTBuilder, il file DTM è stato posizionato all’interno della mappa cartografica mondiale (proiezione: UTM, zona: 32) e quindi ricampionato nel file pat.bt. 2.2 mfcSimple mfcSimple.sln è una semplice applicazione fornita col pacchetto “VTP software” che mostra un esempio di utilizzo delle librerie VTP con MFC. Quest’applicazione è un sistema interattivo di navigazione runtime tridimensionale sul terreno tramite l’utilizzo del mouse. All’applicazione mfcSimple “base” sono state aggiunte due nuove funzionalità oltre a quelle di navigazione già esistenti:

• pick: consente di effettuare il picking sul territorio individuando la corrispondenza tra il punto cliccato ed il poligono che lo contiene e che rappresenta l’area comunale della quale si forniranno le informazioni statistiche

• info: consente di selezionare, attraverso una finestra di dialogo, le informazioni statistiche di interesse

Entrambe le funzionalità sono attivabili tramite la pressione di due tasti (PICK ed INFO) aggiunti alla toolbar. Nella finestra di dialogo sono presenti due combo-box che, all’avvio dell’applicazione, vengono inizializzate rispettivamente con:

• le informazioni statistiche rappresentabili (ovvero con l’elenco delle tabelle presenti nella base dati dati.mdb)

• gli anni di riferimento relativi all’informazione statistica selezionata (tramite un comando di raggruppamento SQL eseguito sulla tabella selezionata, ovvero la voce corrente della prima combo-box)

Page 4: Graphical Interface for Statistical Information of Trento Province based on VTP

4

Questo significa che, aggiungendo alla base dati ulteriori tabelle informative aventi la medesima struttura, esse verranno presentate automaticamente senza la necessità di apportare variazioni all’applicazione. Per l’individuazione del comune sulla base del punto cliccato sul territorio si è fatto uso come già accennato della base dati postGis, nella quale è stato preventivamente importato il file in formato ESRI shapefile relativo ai confini comunali relativi alla provincia di Trento. Lo ESRI (Environmental Systems Research Institute) shapefile è un formato per dati geospaziali vettoriali utilizzato dai sistemi GIS (Geografic Information System) per descrivere spazialmente punti, poligoni e multilinee. A ciascun di questi elementi possono essere associati ulteriori attributi; nel nostro caso ai poligoni identificanti il comune sono associati codice ISTAT e descrizione del comune stesso. Per ottenere codice e descrizione del comune è stata eseguita quindi una semplice interrogazione SQL fornendo in input le coordinate x,y del punto selezionato:

SELECT comuni.comu, comuni.desc FROM public.comuni WHERE CONTAINS(the_geom,GeometryFromText('POINT(coordX coordY)',-1));

3. Architettura del sistema Il sistema è rappresentabile secondo la seguente architettura:

Figura 1 – l’architettura dell’applicazione nell’ambiente VTP

Page 5: Graphical Interface for Statistical Information of Trento Province based on VTP

5

Librerie VTP sono: • vtlib (VTP Terrain Library): insieme di classi C++ per la generazione di terreni e colture in

ambiente 3D (in particolare le funzionalità per la visualizzazione di quanto descritto nell’albero di scena: luci, immagini e modelli 3D)

• vtdata (VTP Data Library): insieme di classi C++ per gestire dati geospaziali • vtui (VTP User Interface): insieme delle funzioni che consentono la visualizzazione e

l’interazione tra utente ed interfaccia grafica del programma (compresa la gestione della navigazione sul terreno)

Librerie di supporto necessarie sono invece:

• mfc (Microsoft Foundation Class): libreria che contiene tutto ciò che è necessario per gestire un’interfaccia grafica (già integrata nei sistemi operative Microsoft)

• GDAL (Geospatial Data Abstraction Library): libreria per georeferenziazione dei dati territoriali da visualizzare (supporta le operazioni necessarie per le conversioni dei dati cartografici nei diversi sistemi di riferimento)

• libjpeg, libpng, zlib: sono le 3 librerie che consentono di le immagini nel formati JPG, PNG e gzip-compressi (texture che si applicano agli oggetti tridimensionali, compresa l’ortofoto applicata al DTM)

• OpenGL (Open Graphics Library): è la libreria grafica di basso livello che si interfaccia direttamente alle funzioni 3D implementate direttamente dalla scheda madre

• OSG (Open Scene Graph): sistema grafico utilizzato per la gestione dell’albero di scena (ovvero il modo strutturato per descrivere il mondo virtuale da rappresentare)

• libMini: libreria per il rendering del terreno. Si integra con OSG e consente di gestire in maniera più accurata il livello di dettaglio (LOD, Level Of Detail)

4. Organizzazione dei dati I dati in input utilizzati dall’applicazione mfcSimple sono stati catalogati in cartelle a loro volta contenute nella cartella Data:

• Elevation contiene il profilo altimetrico in formato BT della zona da visualizzare • Fonts contiene i caratteri utilizzati per i testi (formato ttf) • GeoSpecific contiene l’ortofoto in formato JPG (pat.jpg) da sovrapporre al modello

digitale del terreno • Terrains contiene il file XML con le informazioni che descrivono la scena

Il file XML, che viene caricato all’avvio di mfcSimple come prima operazione, definisce le caratteristiche dell’ambiente da visualizzare: <?xml version="1.0" encoding="utf-8"?> <Terrain_Parameters> <Name>Provincia di Trento</Name> <Elevation_Filename>pat.bt</Elevation_Filename> <Vertical_Exag>1.000000</Vertical_Exag> <Min_Height>20.000000</Min_Height> <Nav_Style>0</Nav_Style> <Nav_Speed>3000.000000</Nav_Speed>

… <Texture_Filename>pat.jpg</Texture_Filename> … </Terrain_Parameters>

Page 6: Graphical Interface for Statistical Information of Trento Province based on VTP

6

5. Organizzazione delle classi Il progetto mfcSimple è costituito da una serie di classi che implementano la visualizzazione del terreno e le funzioni per la navigazione su di esso; i files che le includono (e relativi header files) sono:

• MainFrm.cpp • mfcSimple.cpp • mfcSimple.rc • mfcSimpleDoc.cpp • mfcSimpleView.cpp

Le nuove classi implementate sono incluse invece in due nuovi files:

• Engines.cpp, che implementa le classi: o TerrainPicker: individuazione di un punto selezionato col mouse sul terreno o db: accesso alle basi dati postGIS e Ms Access

• SelectDlg.cpp, che implementa la classe CSelectDlg la quale gestisce la finestra di dialogo per la selezione delle informazioni

5.1 Descrizione delle classi implementate/modificate Come accennato, per la realizzazione dell’applicazione sono state apportate modifiche ad alcune delle classi esistenti nel progetto mfcSimple e ne sono state realizzate alcune nuove. In breve, le classi modificate e le relative variazioni apportate sono: classe variazioni apportate CMainFrame - aggiunta la gestione della finestra di dialogo per la selezione delle

informazioni CSimpleApp - aggiunta la gestione degli eventi di pressione del tasto per il picking dei

punti sul terreno - aggiunte le variabili per la memorizzazione delle informazioni selezionate

(codice del comune, descrizione del comune, informazione statistica e relativo anno)

CSimpleView - aggiunte le procedure per la visualizzazione delle scritte e degli oggetti

cilindrici sulla scena tridimensionale - aggiunta la gestione dell’oggetto TerrainPicker - modificato l’evento click del mouse per integrarlo con le operazioni da

eseguire quando viene effettuato il picking sul terreno (lettura e rappresentazione grafica delle informazioni)

Page 7: Graphical Interface for Statistical Information of Trento Province based on VTP

7

class CSimpleView : public CView void CSimpleView::OnLButtonDown(UINT nFlags, CPoint point) in questo metodo è stata aggiunta la gestione del Terrain Picking con la conseguente visualizzazione delle informazioni e degli oggetti grafici in caso di picking sul territorio provinciale; in questa procedura vengono inoltre calcolate le altezze da attribuire ai due oggetti cilindrici che rappresentano le percentuali delle informazioni statistiche relative al comune selezionato void addCylinder(DPoint2 g, float fCylHeight) costruisce sul punto bidimensionale fornito in input un oggetto cilindrico di larghezza fissa (l’altezza è fornita in input ed è regolata dal dato da rappresentare) void addLabel(DPoint2 g, float fOffsetY, CString strLab) stampa sul punto bidimensionale fornito in input la label (sempre fornita in input) utilizzando il set di caratteri memorizzati nella cartella Data/Fonts; a seconda della necessità il testo viene stampato dopo essere stato traslato in altezza (di una distanza pari a fOffsetY) Ad ogni evento di picking sul territorio, gli oggetti aggiunti (cilindri o labels che siano) vengono aggiunti ad un vettore (m_Markers) con lo scopo di tener traccia dei nodi di tipo vtTransform che vengono aggiunti al territorio. Tale vettore viene quindi poi utilizzato al picking successivo per eliminare dalla scena gli oggetti visualizzati in precedenza. Infatti, ogni aggiunta di oggetti alla scena avviene tramite un puntatore all’oggetto vtTransform (classe che appartiene alla libreria vtlib) aggiunto nel punto desiderato (in coordinate mondiali) attraverso il metodo PlantModelAtPoint dell’oggetto vtTerrain (anch’esso di vtlib). vtTransform è una classe che consente di effettuare trasformazioni geometriche mediante le quali è possibile traslare, ruotare o scalare un oggetto posizionato sul terreno (nel nostro caso è stato utilizzato solo per traslare). Le labels (informazioni testuali) sono state visualizzate in colore giallo e gestite tramite la classe vtTextMesh (vtlib) che consente di specificare font e dimensione dei caratteri da rappresentare. I metodi implementati nelle nuove classi realizzate sono: class TerrainPicker : public vtLastMouse TerrainPicker() costruttore, inizializza la variabile per l’altezza del terreno e la variabile che indica se il picking è avvenuto sul terreno void OnMouse(vtMouseEvent &event) gestisce l’evento di click sul territorio col mouse invocando la funzione FindGroundPoint() bool GetCurrentEarthPos(DPoint3 &p) restituisce vero se il picking è avvenuto sul terreno (falso in caso contrario) ed il punto tridimensionale selezionato (in coordinate mondiali) void FindGroundPoint(); cerca le coordinate mondiali relative al punto cliccato tramite il metodo CastRayToSurface dell’oggetto vtHeightField3d (classe che appartiene alla libreria vtdata)

Page 8: Graphical Interface for Statistical Information of Trento Province based on VTP

8

class db CString getIdCom(DPoint3 &p, CString &strDesCom) fornito in input un punto 3D sul terreno, questo metodo interroga la base dati postGIS e restituisce il codice e la descrizione del comune al quale il punto appartiene; restituisce 0 se il punto in input risulta essere al di fuori dei confini provinciali void initComboInfo(CComboBox &m_cbInfo) metodo per inizializzare la combo-box con le informazioni statistiche (nome tabelle db MS Access) void initComboAnno(CString strTab, CComboBox &m_cbAnno) metodo per inizializzare la combo-box con i periodi (anni) relativi all’informazione statistica (nome della tabella db MS Access) fornita in input void getData(CString strIdCom, CString strTab, CString strAnno, CString &strMas, CString &strFem) questo metodo, dati in input il codice del comune, il tipo di informazione statistica desiderata e l’anno di riferimento, restituisce i valori corrispondenti per maschi e femmine CString getDbAccessPath() restituisce il percorso assoluto della base dati MS Access dati.mdb CString getDbAccessConnString() restituisce la stringa di connessione alla base dati MS Access dati.mdb class CSelectDlg : public CDialog CSelectDlg(CWnd* pParent = NULL) costruttore, inizializza le variabili di indicizzazione delle combo-box void initComboInfo(CComboBox &m_cbInfo) inizializza la combo-box richiamando il metodo initComboInfo della classe db void initComboAnno(CString strInfo) inizializza la combo-box richiamando il metodo initComboAnno della classe db, fornendo in input il nome della tabella selezionata nella combo-box delle informazioni statistiche (initComboInfo) virtual BOOL OnInitDialog() inizializza la finestra di dialogo popolando le combo-box afx_msg void OnSelchangeInfo() gestisce l’evento di selezione dell’elemento dalla combo-box delle informazioni statistiche afx_msg void OnCbnSelchangeAnno() gestisce l’evento di selezione dell’elemento dalla combo-box degli anni riferimento

Page 9: Graphical Interface for Statistical Information of Trento Province based on VTP

9

5.2 Sequence ed activity diagrams Le figure 2 e 3 illustrano rispettivamente il diagramma di sequenza di collaborazione tra i vari oggetti al momento del picking sul territorio ed il corrispondente diagramma delle attività.

Figura 2 – sequence diagram relativo all’operazione di picking sul terreno

Figura 3 – activity diagram dell’operazione di picking

Page 10: Graphical Interface for Statistical Information of Trento Province based on VTP

10

6. Utilizzo dell’applicazione Avviando l’applicazione, il terreno tridimensionale visualizzato è direttamente quello relativo alla provincia di Trento (tramite il file pat.bt definito con VTBuilder). Come già accennato è possibile navigare sul territorio con l’ausilio del mouse (le istruzioni sull’utilizzo si possono trovare all’indirizzo http://vterrain.org/Doc/Enviro/Navigation/index.html). Pigiando sul pulsante INFO è possibile selezionare, tramite la finestra di dialogo, l’informazione statistica in riferimento ad uno specifico anno che si desidera visualizzare sul territorio (figura 4). Per default viene considerata la prima informazione presente nella base dati MS Access in ordine alfabetico. L’informazione così selezionata viene visualizzata sulla barra di stato posta in fondo alla finestra dell’applicazione.

Figura 4 - l’immagine mostra il dialog box che consente di effettuare la selezione del tipo di informazione statistica per anno di interesse

Una volta selezionata l’informazione ed il periodo è sufficiente navigare sul territorio e, tramite il pulsante PICK, cliccare in un punto (all’interno della provincia di Trento) per visualizzare il comune selezionato e le informazioni statistiche ad esso relative (figura 5). Le informazioni vengono visualizzate, oltre che in maniera testuale, anche graficamente tramite due oggetti cilindrici rappresentanti rispettivamente le percentuali dei valori riscontrati relativi agli individui di sesso maschile e femminile.

Page 11: Graphical Interface for Statistical Information of Trento Province based on VTP

11

Figura 5 – l’immagine mostra come avviene la visualizzazione dell’informazione selezionata tramite il picking sul terreno

In caso di picking al di fuori del territorio provinciale, sulla barra di stato viene visualizzato il testo “nessun comune selezionato” e niente sul territorio. Il carattere utilizzato per la rappresentazione testuale è Insaniburger.ttf (collocato nella cartella Data/Fonts). Disattivando il pulsante PICK, si ritorna in modalità di navigazione con la possibilità di spostarsi nuovamente sul territorio. 10. Riferimenti/bibliografia • VTP (Virtual Terrain Project): http://www.vterrain.org • OSG (Open Scene Graph): http://www.openscenegraph.org • OpenGL: http://www.opengl.org • postGis: http://postgis.refractions.net • tesi di laurea di Marco Pergher: “Analisi di immagini e generazione di ambienti tridimensionali

virtuali finalizzati al supporto decisionale” • tesi di laurea di Luca Passerella: “Generazione di ambienti tridimensionali geo-referenziati

come strumento per il supporto alle decisioni”