I gioielli più preziosi spesso stanno nascosti dentro una scatola di latta, sotto un paio di calze, nell’angolo del cassetto del mobile vecchio della nonna.
Non avrei (forse) mai scritto il tutorial che sto per scrivere, se non fossi “caduto” per caso in questo sito, un forum italiano dedicato al mondo delle mountain bike. Non ricordo esattamente come ci sia finito, probabilmente mentre facevo ricerche su qualcosa di collegato ad Atlante Italiano (il Portale Cartografico Nazionale). Il sito del forum di cui sopra è ovviamente in qualche modo legato al mondo dei GIS – oggi i ciclisti usano spesso GPS e cartine – ma non mi sarei mai aspettato di trovare un tutorial su come utilizzare gdal_translate in batch da riga di comando. Ma andiamo al tutorial.
Immaginate di avere una cartella con decine di file GeoTiff (o anche delle orribili coppie .tif/.tfw) , ed di volere convertire in batch (ovvero una conversione in blocco di tutti questi file) in un formato raster GIS compresso come il jpg2000 o l’ECW. Il cuore del processo sarà per l’appunto gdal_translate, un’utility che si trova in FWTools, e il cervello saranno i “cicli for” a partire dal prompt dei comandi.
Il funzionamento di gdal_translate è molto semplice. Immaginiamo di voler convertire un file GeoTiff in formato ECW; questi i passi da seguire:
- aprite la shell di FWTools (si trova in Avvio>Tutti i Programmi>FWTools 1.x.x)
- scrivete un comando di questo tipo
>gdal_translate -of ECW c:\tanto\tif\topografica1.tif c:\tanto\ecw\topografica1.ecw
Come vedete è un comando potente e di semplice utilizzo:
- prima il nome del comando (gdal_translate)
- poi bisogna fissare il formato di output con “-of” (output format)
- poi il nome del file di input (metto le virgolette per evitare di avere problemi con nomi di cartelle e file con spazi)
- ed in fine il nome del file di output (come sopra)
In pochi secondi avrete così convertito il vostro singolo file GeoTiff in formato ECW, mantenendo inalterate le informazioni geografiche. Lo potrete verificare con il comando gdalinfo.
Come faccio a convertirne ad esempio 40 senza scrivere 40 volte il comando di cui sopra? Mi viene in aiuto un “classico” ciclo for che eseguirò da riga di comando.
Immaginiamo di avere creato due cartelle, una con i file di input (C:\tanto\tif\) ed un’altra per i file di output (C:\tanto\ecw\). Il comando per convertire in solo colpo le vostre 40 immagini GeoTiff in formato ECW sarà il seguente:
>for %i in ("c:\tanto\tif\*.tif") do gdal_translate -of ECW "%i" "c:\tanto\ecw\%~ni.ecw"
Anche questo comando lo lancerete dalla shell di FWTools. Anche questo è un comando semplice, ma richiede delle spiegazioni. Il comando di sopra tradotto in lingua italiana, potrebbe suonare così: “per (for) ogni file (%i) tif (*.tif) contenuto nella cartella c:\tanto\tif\, esegui (do) gdal_translate, e scegli ECW come formato di output (-of ECW)”. Ecco un esploso dei comandi:
- for (dichiarate l’inizio del ciclo)
- %i (è una variabile che creerete grazie al ciclo e conterrà, per ogni ciclo, il percorso completo del file della cartella di input)
- (c:\tanto\tif\*.tif) (specificate quale sia la cartella ed il formato di input)
- do (è il comando che fa eseguire una determinata operazione)
- gdal_translate -of ECW (sapete già cosa vuol dire)
- “%i” (il percorso completo del file di input)
- c:\tanto\ecw\ (la cartella di output)
- %~ni.ecw (solo il nome del file di input senza estensione, seguito dall’estensione di output)
Scritto il comando e dato invio, inizierà il processo di conversione; vi andate a fare un caffé ed al ritorno troverete tutti i file ECW nella cartella di output.
Ma torniamo al forum sulle mountail bike. Il thread che mi ha stimolato e che mi ha fatto capire diverse cose è questo: è composto da molte pagine, e contiene diverse “chicche”. Se ne scoprite qualcuna di interessante, perché non ci scrivete un post e lo pubblichiamo su TANTO. Colgo l’occasione per fare i complimenti agli utenti di questi forum.
Per saperne di più sui “cicli for” nel prompt del dos ecco alcuni link:
- Windows XP Professional Product Documentation
- Daily Cup of Tech » Quickly Perform a Function on Several Files
- Still More Windows Command Shell Goodies – the FOR Command
Tutte le utility di FWTools, sono opencource e disponibili anche per Linux. Tutto quello di cui abbiamo parlato si può fare anche in Linux, con tutte le possibilità che da in più la riga di comando in questo ambiente. Il mio problema è che non sono tanto bravo con Linux.
Tutti i comandi di sopra possono essere raffinati. Si possono scegliere molte cose oltre al formato di output: le dimensioni di output, il tipo di compressione, l’assegnazione del corretto sistema di coordinate, etc. Per tutte queste opzioni vi rimando alla pagina ufficiale di gdal_translate.
Per convertire in formato jpg2000 basterà scrivere “-of jp2kak”. Potrete fare anche conversioni in senso inverso da ECW a GeoTiff, ed in questo caso “-of Gtiff”.
Buon divertimento!!
Tag: batch cli fwtools opensource
I contenuti potrebbero non essere più adeguati ai tempi!
By francesca on giu 11, 2007
caro andrea,
sono in tesi e uno dei punti che devo affrontare riguarda proprio il GIS applicato alle problematiche archeologiche. sono all’univ. di Lecce, beni culturali ad indirizzo archeologico e la mia materia di tesi è INFORMATICA APPLICATA ALL’ARCHEOLOGIA. Puoi aiutarmi dandomi delle indicazioni sulla bibliografia? io non so che pesci prendere..perchè internet mi aiuta nella mia ricerca, ma in realtà non posso basare i miei dati solo sull’etere. ho bisogno di qualche testo. in italiano, possibilmente. Spero di non chiederti la luna e, al di la di tutto, grazie per l’attenzione. Buon lavoro. Francesca
By maerco on giu 29, 2007
sai per caso come fare nel caso in cui, il file tif da convertire sia maggiore di 500 MB?
By andrea on giu 29, 2007
ciao maerco,
apri il file frmt_ecw.html che trovi nella cartella html di FWTOOLS. Scoprirai che esiste il parametro LARGE_OK=YES da accoppiare -co. Insomma una cosa del tipo gdal_translate -co LARGE_OK=YES.
Dovrebbe funzionare, anche se non dirti se infrangi i termini legali.
Fammi sapere
By Maerco on giu 30, 2007
Grazie Mille.
Provo subito
Marco
By alfonso on feb 10, 2009
ciao, in ritarto di un paio di anni, ma volevo chiedere se sai un modo per far si che fwtools scarichi in automatico una determinata porzione di mappa a tasselli di 2km. non ci capisco nulla di programmazione.
By Andrea Borruso on feb 10, 2009
Benvenuto Alfonso,
dovresti essere più preciso. Che mappa vuoi “scaricare” e da dove? Cosa vuoi fare con fwtools?
Ciao,
a
By alfonso on feb 11, 2009
ciao, niente mi chiedevo se era possibile aggiungere alla stringa ” gdal_translate -of GTiff -co “TILED=YES” -co “TFW=YES” -projwin 574945 4492811 577945 4489811 ecwp://ww3.file.ecw temp28.tif” del codice che gli dicesse scarica il quadrato definito dalle coordinate(es)574945 4492811 594945 4512811(quindi di lato 20km) dividendolo in tanti quadrati di 2km di lato salvati ciascuno con un nome (es. temporaneo001.tif)con la cifra finale che si incrementa automaticamente.
il perchè di tutto questo è che ho notato che a scaricare immagini di 2km li lato è+ velocissimo(roba di secondi)ma immagini più grandi i tempi diventano biblici, per un’immagine 10km*10 ci mette più di 3 ore.
grazie
By alfonso on feb 15, 2009
non me la dai una mano?
By Andrea Borruso on feb 15, 2009
Ciao Alfonso,
ho riflettuto un po’ su come automatizzare il processo di cui parli, senza essere “programmatori”.
Ti propongo una soluzione che richiede che tu sappia usare un foglio elettronico, e che sappia applicare delle semplici formule di base. Più semplicemente di così, non saprei come fare.
Ho preparato un foglio elettronico che puoi visualizzare qui:
http://www.editgrid.com/user/aborruso/gdal
Dal menu File, lo potrai esportare sul tuo pc (in moltissimi formati).
Con questo foglio, in pochi passi ed adattandolo alle tue esigenze, riuscirai a generare i comandi necessari a scaricare le porzioni di cartografia che desideri.
Il mio esempio è impostato per il download di due strisciate di file .tif, ognuna composta da 5 elementi. Ogni elemento è largo 0.25 gradi decimali. Le celle sono quasi tutte calcolate, eccetto quelle in blu. In queste imposto:
- l’ampiezza geografica della mia immagine (cella D1)
- il numero di partenza del mio contatore (cella A4) per generare in automatico il nome del file di output (es. temporaneo1.tif)
- longitudine e latitudine dei vertici in alto a sinistra ed in basso a destra della prima immagine di ogni strisciata (celle B4,C4 e B9 e C9).
Nella colonna GDAL vengono generati in automatico i comandi necessari per scaricare queste 10 immagini. Se copi soltanto queste 10 celle di questa colonna, e le incolli nella shell di fwtools, patirà il download delle 10 immagini. Nel mio esempio utilizzo come output la cartella “c:\temp”; se non esistesse sul tuo pc, creala.
E’ un esempio molto semplificato. Se sai usare excel, e con un po’ di copia e incolla, riuscirai in pochi minuti ad estenderlo di molto.
Buona domenica e fammi sapere,
a
By alfonso on feb 15, 2009
grande hai avuto proprio una bella idea, avevo completamente rimosso excel dal mio cervello.
grazie
By Giovanni Perego on dic 29, 2010
Grazie Andrea!
FWTools mi è stato di grandissima utilità per preparare i dati raster per l’iniziativa del manuale multipiattaforma per GEOforUS.
Senza i tuoi suggerimenti mi sarebbe stato molto più difficile.
Hai proprio ragione,
“I gioielli più preziosi spesso stanno nascosti dentro una scatola di latta, sotto un paio di calze, nell’angolo del cassetto del mobile vecchio della nonna.”
Grazie ancora e tanti auguri per il nuovo anno!
GimmiGIS
By Andrea Borruso on dic 29, 2010
Caro Gimmi,
non sai quanto piacere mi faccia, che ti sia tornato utile questo post.
Il merito è di questa grande libreria – GDAL/OGR – e di chi ne cura lo sviluppo.
Grazie a te, e buon anno,
a
By EMILIANO on mag 12, 2011
ciao Andrea , anche io per motivi di studio mi trovo nella condizione di utilizzare FWTOOLS , per la precisione ho bisogno di convertire un file .ecw di 600Mb circa in file geotiff , utilizzo la stringa che hai pubblicato , ovviamente al contrario, ma ottengo come risultato : too many command options . e poi la lista di tutti i formati in uscita….non capisco in cosa sbaglio?
By Andrea Borruso on mag 12, 2011
Ciao Emiliano,
se non mi scrivi il commando non ti posso aiutare in modo efficiente.
Il comando per convertire da ECW a GeoTiff è il seguente (in questo caso puoi non specificare il formato di output):
gdal_translate input.ecw output.tif
Fammi sapere.
By EMILIANO on mag 12, 2011
grazie della risposta Andrea; ho utilizzato la riga di comando : gdal_transalte -of Gtiff c:\input.ecw c:\outpout.tif
e non è andato , poi ho utilizzato la riga da te pubblicata adesso e ha iniziato a convertire : è comparso sotto il comando la riga 0….10….20.. dopodichè si è bloccato nel senso che dopo più di 30 minuti non è andato oltre….
grazie del tuo aiuto , quanto è bello quando qualcuno condivide le proprie conoscenze…
By Andrea Borruso on mag 12, 2011
Ciao Emiliano,
anche il tuo comando avrebbe dovuto funzionare. Prova “GTiff” al posto del tuo “Gtiff”.
Un ECW da 600 Mb potrebbe superare anche i 5 Gb in formato tiff. GDAL non credo che abbia limiti in output, ma devi guardarti le note relative al BIGTIIF che trovi qui:
http://www.gdal.org/frmt_gtiff.html
Come mai vuoi fare questa conversione?
Grazie a te,
a
By EMILIANO on mag 12, 2011
perchè devo inserirle in un programma che non legge gli ECW , in effetti non è necessario l’estensione tiff vanno bene anche altri formati quale mi conviene secondo te ? supporta jpeg png shp ras nitf nsf adf dt0 dt1 dt2….ne supporta tantissimi solo che non so bene se tutti questi formati supportanto metadati al loro interno o world file
By Andrea Borruso on mag 13, 2011
Ciao Emiliano,
non ho tutte le informazioni per darti una risposta giusta, e probabilmente non c’è una sola risposta.
Il formato tiff mi sembra perfetto. Potresti provare a suddividerti la tua immagine originale in 10 blocchi ed avere delle tiff più piccole e gestibili. Ed il bello è che ti basta il comando gdal_translate accoppiato con il parametro “-projwin”:
Selects a subwindow from the source image for copying but with the corners given in georeferenced coordinates..
Potresti usare anche -srcwin. Qui le informazioni necessarie:
http://www.gdal.org/gdal_translate.html
Facci sapere
By EMILIANO on mag 18, 2011
allora ho provato a utilizzare il comando gdal_translate -srcwin solo che devo specificare le variabili xoff yoff xsize ysize ; è chiaro che xsize e y size sono ledimensioni in pixel dell’immagine desiderata ma gli altri due valori a cosa corrispondono?
By Andrea Borruso on mag 18, 2011
Ciao Emiliano,
xoff ed yoff sono le coordinate del punto da cui gdal_translate inizierà a “tagliare” la tua immagine.
I valori sono in pixel ed il sistema di coordinate ha l’origine in alto a sinistra. Gli assi sono orientati come vedi in questa figura:
http://bit.ly/mgZNuz
A presto,
a
By Lorenzo on ago 26, 2011
Ciao
la procedura ho seguito la procedura alla lettere ma mi da un errore di tipo 4 dicendomi di non riuscire a leggere i file tif di origine
Qualcuno ha qualche idea del perchè??
Grazie
By Andrea Borruso on ago 26, 2011
Ciao Lorenzo,
sei stato preziosissimo. Questo è un vecchissimo post, molto letto e seguito, che non cambiamo da tempo. Qualche maledetto plugin (devo indagare) ha forzato l’inserimento di un carattere di escape (in questo caso “\”) prima delle virgolette.
Ho fatto una forzatura, che “stampa” correttamente il comando del ciclo for. Così dovrebbe funzionare. Puoi provare e farci sapere?
Grazie
By Lorenzo on ago 29, 2011
Perfetto grazie ora funziona perfettamente e devo dire che è anche molto veloce.
Grazie 1000!!!!
Lorenzo
By Chiara on set 26, 2011
Ciao,
grazie mille! questo post (e sito!) e’ utilissimo. Vi risulta sia possibile inserire un comando nello script che effettui la conversione da un sistema di riferimento a un altro (es. da ED50 a WGS84)
chiara
By Chiara on set 26, 2011
Ri-ciao,
seguendo il link a gdal-translate che prima mi era sfuggito ho provato a comporre il comando:
gdal_translate -co LARGE_OK=YES -a_srs “EPGS=23030″ -of ECW d:\Andalusia.tif d:\Andalusia.ecw
ma ottengo l’errore: failed to process SRS definition:EPGS=23030. Potreste aiutarmi con la sintassi, sono una geografa che usa i GIS per lavoro ma del tutto digiuna di programmazione!
grazie
c
By Antonio Falciano on set 26, 2011
Ciao Chiara,
la definizione del sistema di riferimento spaziale (SRS) dovrebbe essere -a_srs “EPSG:23030″. Senza volerlo hai invertito due lettere nell’acronimo e poi il codice deve essere preceduto da “:” (e non da “=”).
By Antonio Falciano on set 26, 2011
Ri-ciao Chiara,
dal tuo commento successivo intuisco che stai operando su dati spagnoli. Dunque, ipotizzando la zona 30 UTM, per poter effettuare la trasformazione da ED50 a WGS84 dovresti utilizzarere gdalwarp, invece di gdal_translate:
gdalwarp -of ECW -s_srs "+proj=utm +zone=30 +ellps=intl +units=m +no_defs +towgs84=-84,-107,-120" -t_srs "+proj=utm +zone=30 +ellps=WGS84 +datum=WGS84 +units=m +no_defs +towgs84=0,0,0" layer_23030.tif layer_32630.ecw
A meno di sviste clamorose data l’ora, dovrebbe essere così. Nel caso di dati italiani, invece, cambiano solamente i parametri di trasformazione +towgs84=… nel parametro -s_srs e naturalmente la numerazione delle zone UTM. Buon lavoro!
By Chiara on set 27, 2011
Ciao,
grazie mille, entrambi i comandi hanno funzionato alla perfezione. mi servivano le conversioni in entrambe le direzioni.
Giusto per eventuali necessita’ future: se ho ben capito la descrizione del SR va messa nel formato proj4 ma mi rimane oscuro il significato (e la fonte) del paramentro +towgs84=…e cifre successive!
grazie ancora, chiara
By Antonio Falciano on set 27, 2011
Buongiorno Chiara,
per eseguire la trasformazione nel verso opposto (da UTM WGS84 … a UTM ED50 …) ti basta invertire il contenuto di “-s_srs” (source) e “-t_srs” (target) o, se vogliamo, scambiare semplicemente queste due parole chiave.
Chiariamo inoltre il significato di “-a_srs”: consente di assegnare brutalmente un srs ad un layer, ma di fatto non si effettua alcuna operazione di coordinate (conversioni o trasformazioni). In questo caso, possiamo scrivere direttamente il codice EPSG del SRS, proprio perchè non occorre specificare i parametri di trasformazione (le cifre successive al +towgs84=…).
A proposito di questi ultimi, invece, si reperiscono nell’EPSG Geodetic Parameter Dataset interrogando opportunamente il database per area di interesse e richiedendo esplicitamente le “Coordinate Transformation” nella casella di testo Type.
ciao
By Chiara on set 27, 2011
Grazie,
ora e’ tutto un po’ piu’ chiaro
..chiara
By ZORBA on nov 15, 2011
Ciao e grazie per il contributo.
Una domanda (sono ignorante e non lo nascondo).
Io eseguo una trasformazione da tab a shp con il seguente comando
>ogr2ogr -f “ESRI Shapefile” nomefile.shp nomefile.tab
Sapresti dire come modificarlo per eseguirlo in batch ?
Grazie anticipatamente
By Andrea Borruso on nov 15, 2011
Ciao Zorba,
adatta questo esempio al tuo caso (qui faccio da shp a mif):
>for %i in (“D:\trash\*.shp”) do ogr2ogr -f “MapI
nfo File” “D:\trash\%~ni.mif” “%i”
Grazie a te
By Andrea Luci on nov 18, 2011
Ciao Andrea, ho letto la tua guida e mi è stata molto utile per cominciare a conoscere gdal. Adesso però ho un problema, quando converto da tif ad ECW,se do gdalinfo file.ecw non è georeferenziato, ma mi appare
Corner Coordinates:
Upper Left ( 0.0, 0.0)
Lower Left ( 0.0, 3494.0)
Upper Right ( 4421.0, 0.0)
Lower Right ( 4421.0, 3494.0)
Center ( 2210.5, 1747.0)
ovvero le coordinate in pixel dell’immagine. Come posso risolvere? L’immagine tif originaria è georeferenziata.
Grazie.
By Andrea Borruso on nov 18, 2011
Ciao Andrea,
non riesco a riprodurre il tuo errore.
Mi scrivi il comando che lanci, e mi mandi un tuo file di esempio su cui testare la cosa?
Io per inviare file uso spesso questo servizio:
http://ge.tt/
Grazie a te,
a
By Andrea Luci on nov 18, 2011
Il link dove scaricare i file è:
http://ge.tt/9XGPd8A
Per effettuare la trasformazione faccio:
gdal_translate -of ECW FileInput.tif FileOutput.ecw
Per verificare che tutto sia andato a buon fine:
gdalinfo FileOutput.ecw
e mi da l’errore che ti ho descritto prima, c’è il sistema di riferimento ma manca la georeferenziazione, se cancello il file con estensiope aux.xml i vertici sono georeferenziati ma manca il sistema di riferimento.
By Andrea Borruso on nov 18, 2011
Ciao Andrea,
il formato ECW è comodo per mille motivi ma porta con se tutto il peso dei formati proprietari. Ci sono diversi modi in cui te ne puoi liberare. Alessandro Furieri, ha scritto un documento molto bello che ti invito a leggere anche soltanto come cultura personale:
http://www.gaia-gis.it/raster_benchmark/index.html
Ma andiamo alla tua domanda. Se io lancio lo stesso tuo comando e non cancello nulla ottengo questo:
https://gist.github.com/1377773
C’è il sistema di riferimento e le coordinate metriche.
Se cancello il file .xml, perdo tutte le info su proiezione e datum, ma mantengo le coordinate metriche:
https://gist.github.com/1377783
Se vuoi invece inserire datum e proiezione all’interno del file ECW, dovrai usare alcune delle opzioni del formato, che trovi qui:
http://www.gdal.org/frmt_ecw.html
La conversione che tu vuoi effettuare andrà fatta in particolare così:
gdal_translate -of "ECW" -co "PROJ=TMBOAGA2" -co "DATUM=MONTROME" 551092.tif output4.ecw
Io uso le librerie GDAL/OGR per windows, scaricabili da qui:
http://vbkto.dyndns.org/sdk/PackageList.aspx?file=release-1600-gdal-1-8-mapserver-6-0.zip
Fammi sapere.
By Andrea Luci on nov 19, 2011
Niente, stesso errore utilizzando FWTools, le librerie gdal non le ho utilizzate perché devo attivare il formato ECW. Anche secondo me è meglio liberarsi dai formati propietari a favore di quelli open source. Leggerò con attenzione l’articolo che mi hai postato e continuerò per quella strada.
Grazie ancora, e continuate così, ottimo BLOG.
By Andrea Borruso on nov 19, 2011
Ciao Andrea,
FWTools è “soltanto” un installer per le utility GDAL/OGR e tra l’altro credo che non venga aggiornato da molto tempo.
Io ti ho segnalato un altro installer delle librerie GDAL/OGR, che contiene però una versione molto più aggiornata.
Ho fatto il test proprio con quest’ultimo, altrimenti non te le avrei segnalato. Se guardi bene infatti in quella pagina c’è anche l”Installer for the GDAL ECW plugin”
Grazie a te,
a
By Andrea Luci on nov 19, 2011
Ok ho provato: RISOLTO, era una questione di libreria. In FWTools le librerie gdal erano relative alla relase 1.7. Grazie.
By rosy on lug 3, 2012
salve,
come creare un geotiff che associ un file jpg e un file jgw? grazie!
By Andrea Borruso on lug 3, 2012
Ciao Rosy,
devi in un certo senso replicare il comando “classico” cambiando il file sorgente e assegnando il sistema di coordinate.
Se il tuo file si chiamasse ad esempio “immagine.jpg”, e la sua proiezione fosse ad esempio la UTM 33 Nord datum WGS84, dovresti scrivere:
gdal_translate -a_srs epsg:32633 immagine.jpg immagine.tif
L’immagine di output sarà una geotiff e con “-a_srs” avrai associato lo spatial refernce system corretto (epsg:32633).
Fammi sapere se ho compreso la tua richiesta.
Grazie a te,
a
By Giovanni Allegri on lug 4, 2012
Se vuoi ottenere il tfw, puoi aggiungere al comando l’opzione per la sua creazione:
gdal_translate -co "TFW=YES" -a_srs epsg:32633 immagine.jpg immagine.tif
Ciao,
Giovanni