ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
Graphical Interface for Statistical Information of Trento Province based on VTP
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
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
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
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
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
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
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
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
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
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

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