Presentation done about scripting with the JGrass console.
The presentation is in Italian, but there are many code snippets, so it could be easy to understand for anyone.
3. EDITOR DI SCRIPTING DI JGRASS Per configurare l'ambiente di scripting è necessario personalizzare l'intestazione del file con il percorso al MAPSET di calcolo ed all'installazione dei comandi di GRASS. MAPSET e GISBASE sono le uniche variabili necessarie e devono essere decommentate da //# MAPSET = ... //# GISBASE = ... a # MAPSET = ... # GISBASE = ...
5. EDITOR DI SCRIPTING DI JGRASS Il file di scripting di default di JGrass viene creato nella home dell'utente ed è chiamato default.jgrass e viene salvato automaticamente, è anche possibile personalizzare il nome del file. Nell'ambiente di scripting è possibile eseguire i comandi di JGrass e di GRASS ed utilizzare un linguaggio di programmazione completo come Groovy o Beanshell per automatizzare le procedure.
14. IMPORT DEI DATI IN JGRASS Definiamo una variabile che contenga il percorso alla cartella contenente i file compressi e quelli scompattati. Sia fa notare l'impostazione di MAPSET e GISBASE: # MAPSET = /home/moovida/TMP/testlocation/testmapset/ # GISBASE = /usr/lib/grass/ def cartellaFileZippati = new File("/home/moovida/data/1x1zip")
15. IMPORT DEI DATI IN JGRASS Controlliamo il contenuto della cartella: cartellaFileZippati.eachFile{ file -> println file } Il risultato: /home/moovida/data/1x1zip/dtm000358_WGS.zip /home/moovida/data/1x1zip/dtm000359_WGS.zip /home/moovida/data/1x1zip/dtm000360_WGS.zip /home/moovida/data/1x1zip/dtm000358_WGS.ASC /home/moovida/data/1x1zip/dtm000359_WGS.ASC /home/moovida/data/1x1zip/dtm000360_WGS.ASC Total run time: 2765 ms
16. IMPORT DEI DATI IN JGRASS Modifichiamo il ciclo sui file per elencare solo i file che ci interessano: cartellaFileZippati.eachFile{ file -> if ( file.name.endsWith("ASC") ) println file } Il risultato: /home/moovida/data/1x1zip/dtm000358_WGS.ASC /home/moovida/data/1x1zip/dtm000359_WGS.ASC /home/moovida/data/1x1zip/dtm000360_WGS.ASC Total run time: 937 ms
17. IMPORT DEI DATI IN JGRASS Creiamo una lista dei file che ci interessano, in modo da poterla usare dopo: // creo una lista vuota def listFile = []; // la popolo con i percorsi dei file che voglio importare cartellaFileZippati.eachFile{ file -> if ( file.name.endsWith("ASC")) { listFile << file.absolutePath } }
18. IMPORT DEI DATI IN JGRASS Ancora una volta controlliamo se la lista è stata correttamente popolata: listFile.each{ percorso -> println percorso } Il risultato: /home/moovida/data/1x1zip/dtm000358_WGS.ASC /home/moovida/data/1x1zip/dtm000359_WGS.ASC /home/moovida/data/1x1zip/dtm000360_WGS.ASC
19. IMPORT DEI DATI IN JGRASS Adesso proviamo a estrarre dal nome del file il nome che vogliamo dare alla mappa importata. Ad esempio possiamo rimuovere la parte finale: _WGS.ASC // creiamo una lista vuota per i nomi delle mappe importate def listFile = [] def listNames = [] cartellaFileZippati.eachFile{ file -> if ( file.name.endsWith("ASC")) { listFile << file.absolutePath listNames << file.name.replaceFirst("_WGS.ASC","") } }
20. IMPORT DEI DATI IN JGRASS Controlliamo se la lista è stata correttamente popolata: listNames.each{ nome -> println nome } Il risultato: dtm000358 dtm000359 dtm000360
21. IMPORT DEI DATI IN JGRASS Ora che abbiamo una lista con i percorsi delle mappe da importare e una lista dei nomi delle mappe importate, dobbiamo capire come fare un ciclo che processi entrambe le variabili. In groovy i cicli possono essere scritti usando la seguente sintassi: (0..5).each{ i -> println i } secondo la quale vengono stampate in output 6 righe riportanti l'indice del ciclo, da 0 a 5: 0, 1, 2, 3, 4, 5
22. IMPORT DEI DATI IN JGRASS Siamo pronti a tentare di applicare la sintassi appena vista al nostro caso: // chiediamo alla lista il numero di valori contenuti def numeroMappe = listFile.size // eseguiamo un ciclo stampando in contemporanea sia percorsi che nomi mappe (0..numeroMappe-1).each { i-> println "Importo " + listFile[i] + " e creo " + listNames[i] }
23.
24. IMPORT DEI DATI IN JGRASS Ora siamo pronti per importare i dati. Utilizzeremo il comando r.in.gdal dei comandi nativi di GRASS. Diamo una controllata alla sintassi del comando: grass r.in.gdal --help Se al momento dell'esecuzione vi sono parti selezionate nell'editor, vengono eseguite solamente quelle. Quindi selezionando solo la riga appena inserita ed eseguendo, tutto il resto viene ignorato e ci viene stampata in output il messaggio di aiuto di r.in.gdal .
25. IMPORT DEI DATI IN JGRASS Usage: r.in.gdal [ -o efk] input=string output=name [band=value] [target=string] [title="phrase"] [location=string] [ --overwrite ] Flags: -o Override projection (use location's projection) -e Extend location extents based on new dataset -f List supported formats then exit -k Keep band numbers instead of using band color names --o Force overwrite of output files Parameters: input Raster file to be imported output Name for output raster map band Band to select (default is all bands) target Name of location to read projection from for GCPs transformation title Title for resultant raster map location Name for new location to create
30. IMPORT DEI DATI IN JGRASS Anche in questo caso si può ripetere l'operazione più volte unendo a blocchi i fogli di DTM oppure automatizzare il ciclo su tutti i dati alla stessa risoluzione.
31. IMPORT DEI DATI IN JGRASS Approcio 1: r.patch di tutte le mappe in un colpo // commento la parte che eseguiva r.in.gdal /*(0..numeroMappe-1).each { i-> def percorso = listFile[i] def nome = listNames[i] grass r.in.gdal --o input=$percorso output=$nome }*/ uso join per trasformare la lista delle mappe in una stringa def mappe = listNames.join(",") setto la regione attiva a una regione contenente tutte le mappe grass g.region rast=$mappe grass r.patch --o input=$mappe output=unione
32. IMPORT DEI DATI IN JGRASS Il risultato è quell o desiderato, tranne per la mappa dei colori, che presenta qualche buco:
33. IMPORT DEI DATI IN JGRASS I buchi nelle tabelle dei colori si colmano facilmente con il comando r.colors: grass r.colors map=unione color=rainbow e si ottiene la mappa finale desiderata.
34. IMPORT DEI DATI IN JGRASS Approcio 2: visto che r.patch accetta di processare un numero di mappe limitato, è spesso necessario fare un ciclo sulle mappe e patcharle una alla volta. Questo viene lasciato come spunto per un esercizio!
35. ANALISI DEI DATI IN JGRASS La risoluzione di 1m è troppo elevata per gestire questi dati su un pc normale e non dà nessun vantaggio ai fini idro-geomorfologici. Quello che conviene fare su bacini estesi è di utilizzare la risoluzione di 5m. La cosa migliore sarebbe utilizzare algoritmi di interpolazione quali ad esempio r.resamp.stats. Per ora settiamo semplicemente la regione attiva a risoluzione di 5 metri. grass g.region res=5
36. ANALISI DEI DATI IN JGRASS È ora possibile effettuare tutte le analisi geomorfologiche ed idrologiche nell'ambiente di scripting di JGrass ricordando la sintassi dei comandi. jgrass h.pitfiller --help Usage:h.pitfiller --igrass-elevation elevation --ograss-pit pit Parameters: --igrass-elevation the map containing the elevations --ograss-pit the map of the correct elevations
37. ANALISI DEI DATI IN JGRASS E di conseguenza: jgrass h.pitfiller --igrass-elevation unione --ograss-pit pit Allo stesso modo si procede nel calcolo di: h.flow h.draindir h.extractnetwork h.wateroutlet
38. SCRIPTING Attraverso il linguaggio di scripting si possono semplificare, oltre ad automatizzare, alcune operazioni. Vengono proposti di seguito alcuni esempi.
39. SCRIPTING Lettura di una mappa raster e fare delle operazioni sui dati contenuti in essa.
40. SCRIPTING Lettura di una mappa raster e fare delle operazioni sui dati contenuti in essa.