Be groovy with JGrass
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Be groovy with JGrass

on

  • 2,760 views

Presentation done about scripting with the JGrass console.

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.

Statistics

Views

Total Views
2,760
Views on SlideShare
2,591
Embed Views
169

Actions

Likes
1
Downloads
65
Comments
0

4 Embeds 169

http://jgrass.wiki.software.bz.it 161
http://www.slideshare.net 5
http://translate.googleusercontent.com 2
https://www.linkedin.com 1

Accessibility

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Be groovy with JGrass Presentation Transcript

  • 1. PROVINCIA AUTONOMA DI TRENTO Servizo Bacini Montani Be Groovy with JGrass TRENTO, 20 Novembre 2008
  • 2. EDITOR DI SCRIPTING DI JGRASS
  • 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 = ...
  • 4. EDITOR DI SCRIPTING DI JGRASS # 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.
  • 6. EDITOR DI SCRIPTING DI JGRASS
    • comandi di JGrass devono essere preceduti dalla scritta:
    • jgrass oppure inseriti in jgrass { comando }
    • comandi di GRASS devono essere preceduti dalla scritta:
    • grass oppure inseriti in grass { comando }
    • quando si digita un comando, all'inserimento del punto, l'editor fornisce un elenco di possibili completamenti del comando basandosi sulla parte già inserita. I comandi sono suddivisi secondo la logica di GRASS in
    • r. comandi che si riferiscono a mappe raster
    • h. comandi di idro-geomorfologia (horton)
    • rv. comandi di interazione raster-vettoriali
  • 7. EDITOR DI SCRIPTING DI JGRASS
    • per avere la descrizione e la usage dei comandi si deve digitare il comando seguito dalla stringa
    • --help
    • l'help dei comandi viene visualizzato nella finestra della Console che si apre automaticamente nella parte in basso a lato del Catalogo
  • 8. EDITOR DI SCRIPTING DI JGRASS
    • per avere la descrizione e la usage dei comandi si deve digitare il comando seguito dalla stringa
    • --help
    • l'help dei comandi viene visualizzato nella finestra della Console che si apre automaticamente nella parte in basso a lato del Catalogo
    • per eseguire un comando è necessario selezionare le righe che si vogliono eseguire nell'editor e poi con il tasto destro scegliere
    • Run “default.jgrass”
    • ogni messaggio di errore viene messo in rosso nella finestra della Console
  • 9. EDITOR DI SCRIPTING DI JGRASS
  • 10. EDITOR DI SCRIPTING DI JGRASS
  • 11. EDITOR DI SCRIPTING DI JGRASS
    • l'editor di scripting è pensato per costituire un archivio delle operazioni fatte dall'utente
    • il file salvato si può scambiare tra utenti diversi che possono così ripetere le operazioni nella stessa sequenza e con le stesse mappe
    • utilizzare lo scripting non solo velocizza le operazioni al momento di calcolo, ma soprattutto permette la replicabilità delle stesse operazioni per applicazioni future
    • con lo scripting si possono eseguire comandi in sequenza e così preparare i dati per la modellazione senza che l'utente debba continuamente interagire con il programma
  • 12. IMPORT DEI DATI IN JGRASS
    • importante nel caso di bacini di medio-grandi dimensioni è la possibilità di automatizzare la procedura di importazione e di creazione del DTM del bacino
    • nello scripting è possibile integrare anche operazioni di lettura e di listing di files e cartelle
    • nello scripting si possono utilizzare anche cicli (for, while...) e variabili in generale (vettori, matrici... di numeri interi, double, stringhe...)
  • 13. IMPORT DEI DATI IN JGRASS
    • Esempio di importazione dei dati del Cismon:
    • relativamente al bacino del Cismon vengono fornite due diverse cartelle di dati una per i fogli con risoluzione 2x2m e l'altra con i fogli a risoluzione 1x1m
    • per l'esempio trattato si sono copiati in una cartella i tre file dtm000358_WGS.zip, 000359, 000360
    • i dati devono essere scompattati nella cartella per essere accessibili da JGrass
    • si può scrivere uno script che importi tutti i files che sono in una cartella
    • usiamo il linguaggio Groovy per lo scripting
  • 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(&quot;ASC&quot;)) { 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(&quot;ASC&quot;)) { listFile << file.absolutePath listNames << file.name.replaceFirst(&quot;_WGS.ASC&quot;,&quot;&quot;) } }
  • 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 &quot;Importo &quot; + listFile[i] + &quot; e creo &quot; + listNames[i] }
  • 23. IMPORT DEI DATI IN JGRASS
    • (0.. numeroMappe-1 ).each { i->
    • println &quot;Importo &quot; + listFile[i] + &quot; e creo &quot; + listNames[i]
    • }
    • il ciclo va fatto da 0 al limite meno 1, visto che le liste hanno una numerazione che parte da 0.
    • per accedere a un elemento della lista, si usano le parentesi [indice] .
    • Per la concatenazione di stringhe si usa il +
    • Il risultato:
    • Importo /home/moovida/data/1x1zip/dtm000358_WGS.ASC e creo dtm000358
    • Importo /home/moovida/data/1x1zip/dtm000359_WGS.ASC e creo dtm000359
    • Importo /home/moovida/data/1x1zip/dtm000360_WGS.ASC e creo dtm000360
  • 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=&quot;phrase&quot;] [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
  • 26. LO SCRIPT COMPLETO # MAPSET = /home/moovida/TMP/testlocation/testmapset/ # GISBASE = /usr/lib/grass/ def cartellaFileZippati = new File(&quot;/home/moovida/data/1x1zip&quot;); def listFile = [] def listNames = [] cartellaFileZippati.eachFile{ file -> if ( file.name.endsWith(&quot;ASC&quot;)) { listFile << file.absolutePath listNames << file.name.replaceFirst(&quot;_WGS.ASC&quot;,&quot;&quot;) } } def numeroMappe = listFile.size (0..numeroMappe-1).each { i-> def percorso = listFile[i] def nome = listNames[i] grass r.in.gdal --o input=$percorso output=$nome }
  • 27. IMPORT DEI DATI IN JGRASS
    • Il risultato di queste operazioni è una serie di fogli di DTM:
    • hanno diversa risoluzione in funzione della risoluzione originale
    • sono pezzi di DTM a se stanti
    • devono ricoprire tutta l'area del bacino che si desidera studiare
    • Come si possono utilizzare ai fini dell'analisi idro-geomorfologica?
  • 28. IMPORT DEI DATI IN JGRASS
    • Il risultato di queste operazioni è una serie di fogli di DTM:
    • hanno diversa risoluzione in funzione della risoluzione originale
    • sono pezzi di DTM a se stanti
    • devono ricoprire tutta l'area del bacino che si desidera studiare
    • Come si possono utilizzare ai fini dell'analisi idro-geomorfologica?
  • 29. IMPORT DEI DATI IN JGRASS
    • sono pezzi di DTM a se stanti
    • Per far fronte a questo problema è necessario unire i fogli di DTM che ora hanno una risoluzione uniforme di 1x1 m. Il comando che si usa in questo caso è:
    • grass r.patch –help
  • 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(&quot;,&quot;) 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.
  • 41. SCRIPTING Generazione del profilo di una mappa date le coordinate di inizio e fine dello stesso.
  • 42. SCRIPTING Generare il profilo di una mappa date le coordinate di inizio e fine dello stesso.
  • 43. SCRIPTING Generare il profilo di una mappa date le coordinate di inizio e fine dello stesso.
  • 44. SCRIPTING Generare il profilo di una mappa date le coordinate di inizio e fine dello stesso.
  • 45. SCRIPTING Generare il profilo di una mappa date le coordinate di inizio e fine dello stesso.
  • 46. SCRIPTING Lettura dei dati di uno shapefile e operazioni sui dati letti.
  • 47. SCRIPTING Leggere i dati di uno shapefile e fare operazioni sui dati letti.
  • 48. SCRIPTING Leggere i dati di uno shapefile e fare operazioni sui dati letti.
  • 49. SCRIPTING Creazione di uno shapefile delle curve di livello partendo da un DTM.
  • 50. SCRIPTING Creare uno shapefile delle curve di livello partendo da un DTM.
  • 51. GRAZIE DELL'ATTENZIONE...