diff --git a/codetabs.css b/codetabs.css index 8c10ce7..7ab42b6 100644 --- a/codetabs.css +++ b/codetabs.css @@ -147,6 +147,7 @@ p a.modulelink:hover { pre samp { overflow-x: auto; display: block; /* for overflow-x to work */ + line-height: 100%!important; /*to have original line height after changing it in grassdocs.css */ } /* class to override pre style @@ -159,3 +160,7 @@ pre samp { font-family: arial,sans-serif; font-size: initial; } + +img.switchimg { + padding: 0px!important; +} diff --git a/codetabs.js b/codetabs.js index 868d485..e65e3df 100644 --- a/codetabs.js +++ b/codetabs.js @@ -92,21 +92,21 @@ function getMatches(string, regex, index) { function parse_code(code, lang) { var lines = code.split('\n'); - + // in theory, can contain also empty lines and comments parsed_lines = []; - + for(var i = 0; i < lines.length; i++) { - + try { line = lines[i] line = line.trim() - + if (!line) { continue; } //console.log(line) - + var command = { module: null, flags: '', // as string, e.g. abcd @@ -115,6 +115,7 @@ function parse_code(code, lang) { } module_re = / *[a-z][3]?\.[a-z3][a-z3\.]*[a-z3]/ // / *([a-z][3]?\.[a-z][a-z.]?) / + module = module_re.exec(line) if (!module) // probably comment or something else @@ -146,14 +147,14 @@ function parse_code(code, lang) { } value = match[1]; //console.log('option ' + option + ': ' + value) - + var key_value_option = { key: option, value: value, quote: quotes_char } command.options.push(key_value_option) - + // safer for the rest would be removing of match from string } @@ -176,7 +177,7 @@ function parse_code(code, lang) { //console.log('command.flags: ' + command.flags) //console.log('command.flags: ' + command.flags) } - + if ((command.module == 'r.mapcalc' || command.module == 'r3.mapcalc' ) && !command.options.length) { var flag_re = /"(.+ = .+)"/ var matches = flag_re.exec(line) @@ -187,9 +188,9 @@ function parse_code(code, lang) { } command.options.push(key_value_option) } - + parsed_lines.push(command); - + } catch (err) { var text = "There was an error on this page.\n\n"; text += "Error description: " + err.message + "\n\n"; @@ -207,7 +208,7 @@ function parse_code(code, lang) { } alert(text); } - + } return parsed_lines; } @@ -396,7 +397,6 @@ $(document).ready(function() { element.css('display', 'block'); element.addClass("visible"); }); - // using has to really get only those created above $('.tabs-container').has('pre').each(function() { @@ -409,7 +409,7 @@ $(document).ready(function() { $(this).children('samp').each(function() { $(this).text($(this).text().trim()); }); - + }); $('pre code').each(function() { @@ -418,29 +418,29 @@ $(document).ready(function() { var description = '' if (tabcontent.hasClass('python')) { lang = 'python' - description = 'Python' + description = 'Python' } else if (tabcontent.hasClass('bash')) { lang = 'bash' - description = 'Bash' + description = 'Bash' } else if (tabcontent.hasClass('gui')) { lang = 'gui' - description = 'GUI' + description = 'GUI' } else if (tabcontent.hasClass(NEUTRAL_LANG)) { lang = NEUTRAL_LANG - description = '' + NEUTRAL_LANG_LABEL + description = '' + NEUTRAL_LANG_LABEL } else { lang = NEUTRAL_LANG - description = '' + NEUTRAL_LANG_LABEL + description = '' + NEUTRAL_LANG_LABEL } var parentid = tabcontent.parent().attr('id'); var tabid = parentid + '-' + lang; tabcontent.attr('id', tabid); - + ul = tabcontent.parent().parent().children('ul') var menuitem = '' + description + ''; - + ul.append(menuitem) if (tabcontent.hasClass('generate')) { diff --git a/grassdocs.css b/grassdocs.css index 23077b5..42b42e1 100644 --- a/grassdocs.css +++ b/grassdocs.css @@ -41,6 +41,14 @@ hr.header { width: 100%; } +p { + text-align: justify; +} + +.justify { + text-align: justify; +} + h1{ background-color: transparent; color: rgb(25%, 60%, 25%); @@ -56,6 +64,10 @@ h2{ font-family: arial,sans-serif; font-weight: bold; font-size: x-large; + padding-top: 0.8em; + padding-bottom: 0.1em; + margin: 0px; + -webkit-margin-after: 0.1em; } h3{ @@ -64,6 +76,10 @@ h3{ font-family: arial,sans-serif; font-weight: bold; font-size: large; + padding-top: 0.8em; + padding-bottom: 0em; + margin: 0px; + -webkit-margin-after: 0.1em; } h4{ diff --git a/index.html b/index.html index 066cf28..6da5528 100644 --- a/index.html +++ b/index.html @@ -146,6 +146,7 @@

Basic commands and visualizations

+

To better handle the long time series of maps, we create temporal datasets which serve as containers for the time series and we will further manipulate them instead of the individual maps. First, we create empty datasets of type diff --git a/index_it.html b/index_it.html new file mode 100644 index 0000000..4a4f810 --- /dev/null +++ b/index_it.html @@ -0,0 +1,975 @@ + + + + + + + Gestione e visualizzazione di dati spazio-temporali con GRASS GIS + + + + + + + + + + + + + + + + + + + + + + +

+ +

Gestione e visualizzazione di dati spazio-temporali con GRASS GIS

+

Workshop FOSS4G 2014

+

+Vaclav Petras, +Anna Petrasova, +Helena Mitasova, +Markus Neteler +

+ + +

+ FOSS4G 2014 logo + GRASS GIS logo + NagsHead DEM animation +

+ + +

+Sommario: +

+ +

+Software: +

+ +

+Data: +

+ +

+Terminologia: + +

+

+Note: +

+ + +

Analisi di dati climatici

+ +

Visualizzazione e comandi introduttivi

+

+Avviare GRASS selezionando la location NC_spm_temporal_workshop ed il mapset +climate_2000_2012. Per prima cosa elencheremo le mappe raster disponibili +e visualizzeremo le prime mappe contenenti dati di pioggia e temperatura in modo +da familiarizzare con queste informazioni. + + +

+
+g.list type=rast
+g.list type=rast pattern="*tempmean"
+g.list type=rast pattern="*precip"
+
+
+ +
+
+All'interno del Layer Manager selezionare menu: File -> Map display -> Add raster (disponibile anche all'interno della toolbar)
+Selezionare la mappa raster 2000_01_tempmean'
+Display legend
+
+display precipitation map and legend
+
+
+# start monitor
+d.mon wx0
+# display raster maps
+d.rast 2000_01_tempmean
+d.legend 2000_01_tempmean
+
+
+ +

+Per gestiere al meglio la lunga serie di mappe, creeremo un dataset di tipo +temporale che verrà utilizzato come un contenitore per l'intera serie. Questo +permetterà di eseguire analisi in maniera globale invece di lavorare con mappe singole. +Iniziamo creando due dataset di tipo STRDS (Space Time Raster DataSet) uno per ciascuna serie di mappe. +Da notare che, in questo esempio, il tempo verrà utilizzato come valore assoluto. +

+
+t.create output=tempmean type=strds temporaltype=absolute title="Average temperature" description="Monthly temperature average in NC [deg C]"
+t.create output=precip_sum type=strds temporaltype=absolute title="Preciptation" description="Monthly precipitation sums in NC [mm]"
+
+
+ +

+A questo punto possiamo registrare la serie di mappe all'interno del dataset +partendo dal 2000-01-01 e usando come intervallo temporale 1 mese. +Per ottenere l'elenco di tutte le mappe raster che appartengono alla serie, +usiamo il comando g.list creando due liste separate: una per la serie di temperature +e l'altra per i dati di pioggia. +Da tener presente che il comando g.list elenca le mappe in ordine alfabetico, ordine che nel +nostro caso coincide con l'ordine temporale necessario. + +

+
+t register dialog filled
+
+Prima di tutto fare click sul pulsante Pulisci sotto la finestra di Output in fondo al Layer Manager.
+A questo punto elencare tutte le mappe raster contenenti dati di temperatura con il comando
+g.list:
+
+    g.list type=rast pattern="*tempmean" --quiet
+
+Dopo aver copiato (selezione, pulsante destro del mouse e copia) l'elenco delle mappe, possiamo avviare il comando
+t.register.
+L'elenco delle mappe andrà incollato nello spazio 'inserisci i valori interattivamente' e altri 
+parametri dovranno essere impostati come segue:
+
+
+tab Input > Name of the input space time dataset > tempmean
+tab Time Date > Selezionare l'opzione Create an interval
+              > Valid start date and time of the first map > 2000-01-01
+              > Time increment > 1 months
+              
+
+La stessa cosa va fatta per i dati di pioggia, ricordandosi di fare click sul pulsante Pulisci in modo
+da eliminare le informazioni precedenti:
+
+    g.list type=rast pattern="*precip" --quiet
+
+Copiare ed incollare il risultato nel campo relativo del comando t.register ed utilizzare i seguenti parametri:
+
+tab Input > input > precip_sum
+tab Time Date > Selezionare l'opzione Create an interval
+              > Valid start date and time of the first map > 2000-01-01
+              > Time increment > 1 months
+
+
+
+
+# prima elenchiamo le mappe per controllare il pattern e l'output
+g.list type=rast pattern="*tempmean" separator=comma --quiet
+g.list type=rast pattern="*precip" separator=comma --quiet
+
+# quindi usiamo gli apici inversi per passare l'output direttamente a t.register
+t.register -i input=tempmean type=rast start=2000-01-01 increment="1 months" \
+    maps=`g.list type=rast pattern="*tempmean" separator=comma --quiet`
+t.register -i input=precip_sum type=rast start=2000-01-01 increment="1 months" \
+    maps=`g.list type=rast pattern="*precip" separator=comma --quiet`
+
+
+ +

+Verifichiamo che i due dataset siano stati creati correttamente: +

+
+t.list type=strds
+t.rast.list input=tempmean sep=tab
+
+
+ +

+Nonostante si possa fare facilmente il parsing dell'output del comando t.rast.list, noi utilizzeremo +il Timeline tool per visualizzare l'estensione temporale del dataset. + +

+
+Menu: Temporal -> GUI tools -> Timeline tool
+Selezionare il dataset tempmean
+
+
+g.gui.timeline tempmean
+
+
+plot of temporal extents of tempmean strds + + + + + +

+Ora andremo ad animare una parte del dataset. +Prima estrarremo l'anno 2010 da entrambi i dataset; questa operazione non creerà un nuovo dataset, ma il nuovo punterà semplicemente al vecchio dataset. +

+
+t.rast.extract input=tempmean output=tempmean_2010 where="start_time >= '2010-01-01' and start_time < '2011-01-01'"
+t.rast.extract input=precip_sum output=precip_sum_2010 where="start_time >= '2010-01-01' and start_time < '2011-01-01'"
+
+
+ +Verificare l'estensione temporale: +
+
+Menu: Temporal -> GUI tools -> Timeline tool
+Select datasets tempmean, precip_sum, tempmean_2010, precip_sum_2010
+
+
+g.gui.timeline inputs=tempmean,precip_sum,tempmean_2010,precip_sum_2010
+
+
+extracted datasets + +

+Creiamo un'animazione per i dati di pioggia relativi al 2010 (come nell'immagine): +

+Result from Animation Tool (one animation) +

+ + + +

+Ora torniamo indietro al dataset estratto e vediamo alcune altre possibilità per visualizzare i dati con t.rast.list. +Possiamo, ad esempio, scegliere quali colonne stampare e l'ordine dei dati. In questo caso noi stampiamo start_time e massimo di pioggia ordinandole in maniera crescente. +Il delimitatore di default (|), può essere cambiato con l'opzione sep. + +

+
+t.rast.list input=precip_sum_2010 columns=start_time,max order=max sep=tab
+
+
+# possiamo scegliere colonne ed ordine
+t.rast.list input=precip_sum_2010 columns=start_time,max order=max sep=tab
+
+
+ +

+Usando il comando t.rast.univar, calcoliamo informazioni statistiche riferite ad un +intervallo temporale degli ultimi tre mesi dell'anno 2010. +

+
+t.rast.univar input=tempmean_2010 where="start_time > '2010-10-01'"
+
+
+
+
+id|start|end|mean|min|max|mean_of_abs|stddev|variance|coeff_var|sum|null_cells|cells
+2010_10_tempmean@climate_2000_2012|2010-10-01 00:00:00|2010-11-01 00:00:00|16.2275459748922|9.80648888481988|19.2237726847331|16.2275459748922|1.83784116074554|3.37766013213051|11.3254410962021|8233321.31864314|503233|1010600
+2010_11_tempmean@climate_2000_2012|2010-11-01 00:00:00|2010-12-01 00:00:00|10.0550104277932|3.83957968817817|13.2355732387967|10.0550104277932|1.49157983140112|2.2248103934426|14.8341947739629|5101580.47571814|503233|1010600
+2010_12_tempmean@climate_2000_2012|2010-12-01 00:00:00|2011-01-01 00:00:00|0.929180131463252|-6.46433724297418|4.24769083658854|1.58153627012032|1.56125262006063|2.43750974364618|168.024752918684|471435.335760116|503233|1010600
+
+
+ + +

+Per finire, eliminiamo i due dataset relativi al 2010. Da notare nell'esempio verrà rimosso solamente il contenitore, +non le mappe attuali, come si può verificare dall'output del comando g.list. +Usando l'apposita opzione, il modulo t.remove permette di rimuovere anche i dati. Non useremo questa opzione in quanto ancora abbiamo bisogno dei dati. +

+
+t.remove inputs=tempmean_2010,precip_sum_2010
+t.list type=strds
+g.list type=rast pattern="2010*tempmean"
+
+
+ + +

Aggregazione temporale

+ +

+Iniziamo calcolando la media delle temperature per ciascuna stagione dell'anno (useremo il termine aggregazione). +L'opzione 'where' serve ad iniziare il calcolo al primo di marzo dell'anno 2000 perchè la stagione invernale dello stesso anno non è completa. + +

+
+t.rast.aggregate input=tempmean output=tempmean_seasonal base=tempmean_seasonal granularity="3 months" method=average where="start_time >= '2000-03-01' and start_time < '2012-11-01'"
+
+
+ +

+Estrazione del periodo estivo e conversione in gradi Fahrenheit. +La funzione SQLite strftime('%m', start_time) restituisce il mese +partendo dal timestamp della mappa iniziale. +Da notare che la funzione strftime non appartiene ai moduli di GRASS ma è relativa +ad SQLite che costituisce il backend per la gestione dei dati. +Nel caso in cui si utilizzi PostgreSQL, è necessario far riferimento ad una funzione +simile. +Specificando nprocs=4, si indica al comando t.rast.extract di utilizzare 4 processi +che utilizzeranno fino a 4 core (se disponibili). + + +

+
+t.rast.extract input=tempmean_seasonal where="strftime('%m', start_time)='06'" expression="(tempmean_seasonal  * 9.0/5.0) + 32" output=tempmean_F_summer base=tempmean_F_summer nprocs=4
+
+
+temporal extents of tempmean_seasonal + +

+Ora visualizzeremo un'animazione con le temperature estive in North Carolina +e ci sovrapporremo una mappa vettoriale contenente i confini degli stati ed una mappa raster di +uno shaded relief (con semi-trasparenza). + +Prima di visualizzare le mappe impostiamo la tabella di colori per l'intera serie temporale. + +

+  
+    t.rast.colors input=tempmean_F_summer color=fahrenheit
+  
+
+ +

+Avvia lo strumento Animazione e seleziona nuva animazione. Questa volta aggiungeremo più layers: +una serie temporale di temperature tempmean_F_summer, una mappa statica contenente i limiti +amministrativi boundary_county e una mappa raster statica in semi trasparenza (shaded relief) +shaded_state_500m. Le mappe raster e vettoriali sono presenti nel mapset PERMANENT. +Dopo aver aggiunto i layer ed averne impostato la trasparenza, verifichiamo che l'ordine sia corretto. +Screenshot instructions are here. +In aggiunta si può sovrappore una legenda con i valori delle temperature (come visto nelle precedenti +animazioni). +

+animation of summer temperature in North Carolina + +

+Effettuiamo la stessa aggregazione con il dataset dei dati di piogga, ma in un'altra maniera. + +Si aggreghino i dati utilizzando gli intervalli temporali di tempmean_F_summer. +Convertiamoli da millimetri a pollici. Il risultato sarà la media delle piogge mensili estive espresse +in pollici. + +

+
+t.rast.aggregate.ds input=precip_sum sample=tempmean_F_summer output=precip_summer base=precip_summer method=average
+t.rast.mapcalc inputs=precip_summer expression="precip_summer / 25.4" output=precip_inch_summer base=precip_inch_summer nprocs=4
+
+
+ +

Esiste correlazione tra pioggia e temperatura?

+

+ +Utilizzare il comando r.regression.series disponibile tra gli addon di GRASS. Se non è già installato, +lo si può installare usando il comando g.extension: + +

+
+g.extension extension=r.regression.series
+
+
+ +

+A questo punto determiniamo la correlazione. Si noti che r.regression.series non accetta ancora un +dataset di tipo spazio-temporale, ma solo mappe singole. + +

+
+Eseguiamo g.list due volte:
+
+    g.list type=rast pattern="tempmean_F_summer*" separator=comma --q
+    g.list type=rast pattern="precip_inch_summer*" separator=comma --q
+
+ed utiliziamo gli output come input per i parametri xseries ed yseries del
+comando r.regression.series invece che i punti:
+
+    r.regression.series xseries=... yseries=... output=corr method=corcoef
+
+
+# using backticks syntax for two g.list runs
+r.regression.series \
+    xseries=`g.list type=rast pattern="tempmean_F_summer*" separator=comma --q` \
+    yseries=`g.list type=rast pattern="precip_inch_summer*" separator=comma --q` \
+    output=corr method=corcoef
+
+
+ +

+Impostiamo la mappa dei colori per la mappa raster corr al tipo differences. +

+
+r.colors map=corr color=differences
+
+
+ +

+Analizziamo la mappa corr mostrandone i valori di correlazione +spaziale tra temperatura e piogga nel periodo estivo. + +

+
+Add raster map layer -> select corr
+Add map elements -> Show/hide legend
+
+
+# display raster maps
+d.rast corr
+d.legend corr
+
+
+temperature and precipitation spatially correlated + +

Grafico dei valori minimi/massimi di temperatura e pioggia durante l'estate

+ +

+Visualizzare un grafico dei valori minimi e massimi per i periodi estivi. +Prima creare un file contenente questi valori. Per semplificare le cose, +incollare il seguente codice nel terminale (non nella console di comando della GUI, così non funziona). + +

+
+# questo comando creerà il file nella cartella corrente
+t.rast.list input=tempmean_F_summer columns=start_time,min,max separator=comma > temperatures.txt
+
+
+Eseguire t.rast.list con i seguenti parametri:
+
+tab Required > input > tempmean_F_summer
+tab Formatting > separator > comma
+tab Selection > columns > start_time,min,max
+
+Copiare l'output in un file e salvarlo con il nome temperatures.txt.
+Tener presente che per il prossimo passaggio, serve il percorso completo al file.
+Alcuni editor aggiungono di serie l'estensione .txt portando ad avere due estensioni
+che vengono mostrate in alcuni file manager.
+
+
+ +

+Ora selezioniamo la console Python nella GUI ed incolliamo ed eseguiamo i seguenti +comandi (riga per riga): + +

+
+# ricordarsi di utilizzare il percorso completo al file
+import matplotlib.pyplot as plt
+plt.plotfile("temperatures.txt", cols=(0,1,2), delimiter=',', subplots=False)
+plt.show()
+
+
+ +minimum and maximum temperatures in summer + +

Grafico delle temperature di Raleigh ed Ashville

+

+Ora disegneremo il grafico delle temperature di Raleigh ed Ashville. Nel mapset PERMANENT, si trova una +un mappa vettoriale chiamata towns. Contiene due punti che rappresentano Raleigh e Ashville. +Usando il comando t.vect.observe.strds, creeremo un dataset di tipo spazio-temporale con i valori delle temperature per queste due città archiviati nella tabella degli attributi: + +

+
+t.vect.observe.strds input=towns strds=tempmean_F_summer output=towns_tempmean_summer vector_output=towns_summer column=tempmean
+
+
+ +

+Ora visualiziamo i valori di temperatura: + +

+
+Eseguire t.vect.db.select ed ottenere i valori per Raleigh. Salvare il risultato in un file chiamato raleigh.txt:
+    t.vect.db.select input=towns_tempmean_summer columns=tempmean separator=comma where="cat = 1"
+
+A questo punto selezionare i valori per Asheville e salvarli in un file chiamato asheville.txt:
+    t.vect.db.select input=towns_tempmean_summer columns=tempmean separator=comma where="cat = 2"
+
+
+t.vect.db.select input=towns_tempmean_summer columns=tempmean separator=comma where="cat = 1" > raleigh.txt
+t.vect.db.select input=towns_tempmean_summer columns=tempmean separator=comma where="cat = 2" > asheville.txt
+
+
+ +

+Creare un grafico di questi valori utilizzando matplotlib, incollando +nella console Python della GUI (questo è solo un esempio base per evitare codice più complesso): +

+
+import matplotlib.pyplot as plt
+plt.plotfile("raleigh.txt", cols=(0,2), delimiter=',', subplots=False)
+plt.plotfile("asheville.txt", cols=(0,2), delimiter=',', subplots=False, newfig=False)
+plt.show()
+
+
+plot of summer temperatures in two towns + + +

Serie di Nags Head

+ +

+Si avvi grass7 con la location NC_spm_temporal_workshop ed il mapset NaghHead_series. + +

Registrazione e visualizzazione delle serie temporali

+ +

+Prima creiamo un dataset raster spazio-temporale vuoto. Utilizzeremo intervalli di tempo relativi e l'anno come unità. + +

+
+t.create output=NagsHead_99_08 type=strds temporaltype=relative title="Nags Head elevation series" description="from 1999 to 2008 with gaps"
+
+
+ + +

+Registrare le mappe nel dataset utilizzando l'elenco qui di seguito. +Ciascuna mappa contiene nel nome l'anno ed il delimitatore di default è il pipe. + +

+
+Nella finestra di t.register incollare il seguente elenco nello spazio dove vanno inserite le mappe:
+NH_1999_1m|1999
+NH_2001_1m|2001
+NH_2004_1m|2004
+NH_2005_1m|2005
+NH_2007_1m|2007
+NH_2008_1m|2008
+
+In più impostare le seguenti opzioni:
+
+tab Input > input > NagsHead_99_08
+tab Time Date > unit > years
+
+
+echo "NH_1999_1m|1999
+      NH_2001_1m|2001
+      NH_2004_1m|2004
+      NH_2005_1m|2005
+      NH_2007_1m|2007
+      NH_2008_1m|2008" > NH.txt
+t.register input=NagsHead_99_08 type=rast file=NH.txt unit=years
+
+
+ +

+Visualizzando l'estensione temporale mediante lo strumento Timeline, +si nota che ogni mappa è stata registrata nel dataset e che ci sono degli anni senza dato. +

+temporal extents of NagsHead dataset + + +

+Visto che ci sono dei dati mancanti nel dataset, decidiamo di interpolari i dati mancanti. +Le mappe derivanti dall'interpolazione sono già presenti nel mapset così tralasceremo. +(Le mappe sono state generate mediante interpolazione lineare con il comando r.series.interp. Per +intervalli si può utilizzare t.rast.gapfill). + +

+Dobbiamo ancora registrare le mappe interpolate all'interno del dataset esistente. + +

+
+Nella finestra di t.register, utilizzare l'input interettivo per l'opzione relativa ai file.
+Utilizzare i parametri di input > NagsHead_99_08 and unit > years.
+Di seguito l'elenco delle mappe da registrare compreso anche il time stamps:
+
+NH_2000_1m_interp|2000
+NH_2002_1m_interp|2002
+NH_2003_1m_interp|2003
+NH_2006_1m_interp|2006
+
+
+echo "NH_2000_1m_interp|2000
+      NH_2002_1m_interp|2002
+      NH_2003_1m_interp|2003
+      NH_2006_1m_interp|2006" > interp.txt
+
+t.register input=NagsHead_99_08 file=interp.txt unit=years
+
+
+ +

+Verificare quello che è presente all'interno del dataset NagsHead_99_08. +Assegnare la stessa tabella dei colori per tutte le mappe (copiarla dalla mappa NH_1999_1m). + +

+
+t.rast.list input=NagsHead_99_08
+t.rast.colors input=NagsHead_99_08 raster=NH_1999_1m
+
+
+ +

+Visualizzare un'animazione del dataset raster spazio-temporale NagsHead_99_08, prima solo in 2D. + +

+
+Nel menù principale scegliere Temporal > > GUI tools > Animation tool.
+
+
+g.gui.animation strds=NagsHead_99_08
+
+
+ + +

+Possiamo anche visualizzare animazioni 2D e 3D affiancate. Per visualizzare animazione in 3D, +dobbiamo prima prepare e registrare i parametri 3D. Per farlo, avviare la GUI se non è già avviata, +aggiungere per esempio NH_1999_1m, attivare la vista 3D, impostare la vista come desiderato ed il +parametro fine resolution ad 1m (consultare il manuale della GUI) e salvare lo spazio di lavoro su un file (nel menu File -> Workspace -> Save). +Nello strumento Animazione, aggiungere un'animazione, scegliere la modalità 3D, scegliere il file di spazio di lavoro e laciare elevation_map come parametro da animare. +Nota: lo strumento di animazione 3D (così come il comando seguente m.nviz.image), non sono supportati su MS Windows. +

+ +NagsHead series 2D and 3D animation + +

+Nota a margine: per script o per lavorare dalla linea di comando, si possono salvare le impostazioni 3D come comando m.nviz.image usando il bottonre presente nel GIS Layer manager (seconda riga) chiamato 'Genera comando per m.nviz.image'. +Di seguito un esempio del comando salvato: + + +

+
+m.nviz.image elevation_map=NH_1999_1m -a mode=fine resolution_fine=1 color_map=NH_1999_1m position=0.94,0.87 height=789 perspective=15 twist=0 zexag=2.000000 focus=487,469,8 light_position=0.68,-0.68,0.80 light_brightness=80 light_ambient=20 light_color=255:255:255 output=nviz_output format=ppm size=718,699
+
+
+ +

Rappresentazione del cubo spazio-tempo

+

+Il cubo spazio-tempo è una rappresentazione 3-dimensionale dove la coordinata z è il tempo. +Useremo un raster 3D per rappresentare il cubo spazio-tempo con la coordinata z come il valore del raster 3D. +

+Per creare il cubo spazio-tempo sovrapporremo verticalmente una serie di modelli digitali del suolo usando il comando t.rast.to.rast3. + +

+
+t.rast.to.rast3 input=NagsHead_99_08 output=NagsHead_99_08
+r3.info -g map=NagsHead_99_08
+g.region rast3d=NagsHead_99_08 -p3
+
+
+# convertire strds to raster 3D
+t.rast.to.rast3 input=NagsHead_99_08 output=NagsHead_99_08
+# verificare l'estensione 3d ed i valori minimi e massimi
+r3.info -g map=NagsHead_99_08
+# impostare la regione a questo raster così da usarla per le successive elaborazioni
+g.region rast3d=NagsHead_99_08 -p3
+
+
+ + +

+Ora creeiamo un nuovo raster 3D che sarà usato per colorare la isosuperfici a seconda dell'anno. +Usando t.rast.mapcalc creiamo una serie di mappe raster aventi un solo valore per ciascun anno e sovrapponiamole +in un raster 3D ed associamo una tabella dei colori adatta. +

+
+t.rast.mapcalc inputs=NagsHead_99_08 expression="start_time() + 1999" output=NagsHead_years basename=NagsHead_years nprocs=4
+t.rast.to.rast3 input=NagsHead_years output=NagsHead_years
+
+
+ +Ora impostare la tabella dei colore del cubo spazio-tempo e il secondo raster 3D + +
+
+r3.colors map=NagsHead_99_08 color=elevation
+r3.colors map=NagsHead_years color=bcyr
+
+
+ +

+Ora visualiziamo il cubo spazio-tempo in 3D. Seguiamo le istruzioni seguenti: +

    +
  1. Rimuovere tutte le mappe nel Layer Manager.
  2. +
  3. Aggiungere il modello digitale dell'elevazione 2008 (NH_2008_1m_0.05) che è stato diviso per 20 per la visualizzazione in 3D perchè dobbiamo usare una grande exaggeration per il raster 3D (Add raster map layer -> select NH_2008_1m_0.05)
  4. +
  5. Aggiungere il raster 3D NagsHead_99_08 (Add various raster map layers -> Add 3D raster map layer -> select NagsHead_99_08).
  6. +
  7. Cliccare sul raster 3D -> Zoom to selected map.
  8. +
  9. Incollare il comando d.legend nella console dei comandi della GUI: +
    d.legend -f rast3d=NagsHead_years at=5,50,7,10 use=1999,2000,2001,2002,2003,2004,2005,2006,2007,2008
    +
  10. +
  11. Imposta la risoluzione più bassa per velocizzare la visualizzazione 3D: +
    g.region -p3 res3=3 tbres=1
  12. +
  13. Cambia la visualizzazione a quella 3D (aspettate).
  14. +
  15. Nella pagina View , impostare z-exaggeration a 20 e view height a 100.
  16. +
  17. Nella pagina Data -> Surface, lower fine mode resolution a 1.
  18. +
  19. Nella pagina Data -> Volume, aggiungere isosurface e quindi cambiare i suoi valori a 11 o similari e cambiare il colore impostando quello della mappa NagsHead_years.
  20. +
  21. Impostare la risoluzione della isosurface a 1.
  22. +
  23. Potete alternare la direzione normale della isosurface o cambiare la luce nella pagina Appearance -> Light per ottenere un risultato migliore.
  24. +
+ +

+NagsHead space-time cube in wxNviz + +

Visualizzazione dati radiazione solare

+ + +

+Avviare GRASS con la location NC_spm_temporal_workshop ed il mapset centennial. + +

+Calcoleremo la radiazione solare giornaliera per una parte del Campus Centennial della NC State University. +Quindi visualizzeremo la variazione di radiazione solare come animazione 3D. +Nel caso non sia installato r.sun.hourly, scaricarlo: + +


+g.extension extension=r.sun.hourly
+
+ +

+Convertire la data di oggi (o qualsiasi altra data) in giorni dell'anno eseguendo questo comando nella shell di Pyhon presente nella GUI. + +

+
+from datetime import datetime
+datetime.now().timetuple().tm_yday
+# oppure per un giorno qualsiasi (ad esempio 21/06/2014)
+datetime.datetime(2014, 6, 21).timetuple().tm_yday
+
+
+ +

+Questo valore verrà utilizzato per il parametro day. +Generare la serie temporale dell'irradianza mediante il seguente comando. +La serie temporale verrà automaticamente salvata all'interno dei un dataset spazio-temporale di tipo raster. + +

+
+r.sun.hourly -t elev_in=elev_lid_small start_time=6 end_time=20 day=200 year=2014 beam_rad_basename=beam nprocs=4
+
+
+Impostare una tabella dei colori per il dataset beam appena creato; + +
+
+Utilizzando la finestra di inpute dell'interfaccia del comando t.rast.colors
+oppure aggiungengo le righe seguenti ad un file rules.txt:
+
+0% 60:60:60
+70% yellow
+100% 255:70:0
+
+t.rast.colors input=beam rules=rules.txt
+
+
+echo "0% 60:60:60
+      70% yellow
+      100% 255:70:0" > rules.txt
+t.rast.colors input=beam rules=rules.txt
+
+
+ +

+Finalmente creiamo l'animazione 3D della serie temporale. Per fare questo prima di tutto aggiungiamo, ai layer +visibili, la mappa elev_lid_small. Passiamo alla visuale 3D e modifichiamo i parametri +di visualizzazione a piacere. Modifichiamo i colori utilizzando una delle mappe di radiazione +solare (fare riferimento al manuale della GUI). +A questo punto salviamo il file di configurazione del workspace. +Avviamo lo strumento di animazione ed aggiungiamo una nuova animazione. Scegliamo 3D, aggiungiamo il dataset +spazio-temporale calcolato, selezioniamo il file del workspace e scegliamo color_map per il tipo di animazione. +Da notare che l'animazione 3D non è supportata in MS Windows. +

+solar radiation animation in 3D + +


+ +

Ultima modifica: 2014-08-13 22:00 +

+ Indice del manuale di GRASS GIS | + Indice dei moduli Temporali | + Indice degli argomenti | + Indice della parole chiave | + Indice completo +

+

+ + Creative Commons License +
+ Spatio-temporal data handling and visualization in GRASS GIS workshop for FOSS4G 2014 + by Vaclav Petras, Anna Petrasova, Helena Mitasova and Markus Neteler + is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License. +
+ Versione Italiana di Luca Casagrande + + +

+ + +
+ + +