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.
1 of 11
Download to read offline
More Related Content
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:tempcomuni.sql
pgsql -U postgres -d postgis -f c:tempcomuni.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.
2
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)
3
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 ¨C l¡¯architettura dell¡¯applicazione nell¡¯ambiente VTP
4
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>
5
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)
6
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)
7
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
8
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 ¨C sequence diagram relativo all¡¯operazione di picking sul terreno
Figura 3 ¨C activity diagram dell¡¯operazione di picking
9
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.
10
11. Figura 5 ¨C 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¡±
11