È possibile utilizzare alcune API gdal per chiamare gdal_translate
dal codice Python? Non intendo semplicemente eseguire gdal_translate.exe dal file system, ma piuttosto chiamarlo in qualche modo nel codice, quindi non ho bisogno di conoscere la directory esatta in cui si trova leseguibile gdal_translate?
Commenti
- Sì, a partire da gdal-2.1. Questa risposta deve essere accettata come corretta.
Risposta
A partire da GDAL 2.1 (maggiori informazioni qui ), le utilità GDAL e OGR possono essere utilizzate come funzioni di libreria. Ad esempio:
from osgeo import gdal ds = gdal.Open("input.tif") ds = gdal.Translate("output.tif", ds, projWin = [-75.3, 5.5, -73.5, 3.7]) ds = None
Commenti
- Tutte le opzioni che
gdal.Translate()
le riprese sono elencate qui: gdal.org/python/osgeo.gdal-module.html#TranslateOptions - I ' ho provato a usarlo e non ' t ottiene errori ma il file di output non è ' t creato. Qualche idea sul perché?
- anche senza file di output e senza errori. I percorsi di output e i parametri projWin sono corretti.
Risposta
Vedi il GDAL Tutorial sullAPI .
#Import gdal from osgeo import gdal #Open existing dataset src_ds = gdal.Open( src_filename ) #Open output format driver, see gdal_translate --formats for list format = "GTiff" driver = gdal.GetDriverByName( format ) #Output to new format dst_ds = driver.CreateCopy( dst_filename, src_ds, 0 ) #Properly close the datasets to flush to disk dst_ds = None src_ds = None
Se desideri un maggiore controllo sulloutput, come ridimensionamento, sottoimpostazione, ecc … utilizza un VRT come input, è così che gdal_translate lo fa internamente.
Commenti
- sfortunatamente questo ' t include la reporiezione, vero?
- @butcher – no. Perché la domanda non menzionava la riproiezione. Ovviamente puoi riproiettare i raster con lAPI python gdal. Se vuoi sapere come, fai una nuova domanda.
- Lho già fatto qui: gis.stackexchange.com/questions/103874/… ma thius è stato contrassegnato come duplicato 🙁
- @butcher – che è stato chiuso come duplicato di questa domanda. La tua domanda riguarda anche gdal_translate . Sei consapevole che gdal_translate non riproietta? Se vuoi riproiettare, utilizza gdalwarp o il metodo API gdal python – gdal.ReprojectImage
Answer
Sì, puoi chiamare le utilità GDAL da Python. Ci sono differenze minime nellapproccio a seconda che lutilità sia un exe a sé stante o anche una parte di codice Python. In ogni caso, però, è necessario utilizzare il modulo sottoprocesso :
import subprocess # constants gdalTranslate = r"C:\Program Files\GDAL\gdal_translate.exe" src = r"C:\somefolder\somefile.tif" dst = r"C:\someotherfolder\myresul.tif" cmd = "-ot float32 -outsize 25 25" # just for example! # see note below def youCanQuoteMe(item): return "\"" + item + "\"" fullCmd = " ".join([gdalTranslate, cmd, youCanQuoteMe(src), youCanQuoteMe(dst)]) subprocess.popen(fullCmd)
Noterai che aggiungo virgolette di escape intorno ai miei percorsi. Questo perché, su Windows, ho avuto tr doppio con i percorsi, specialmente quelli con spazi o dove uno dei caratteri “\” crea un altro carattere sfuggito accidentalmente. Quindi, conservo semplicemente il percorso corretto in aspec per così dire.
Se stai usando una delle utility python, fai la stessa cosa tranne che il tuo exe allinizio della stringa di comando del sottoprocesso è ora ” C: \ python32 \ python.exe “(o qualunque versione tu abbia) e il tuo secondo elemento è lutilità python che vuoi usare.
Ovviamente puoi anche iterare sul tuo file system piuttosto che usare hard- costanti codificate, ma questo è solo un esempio.
EDIT – Generalizzazione per plugin QGIS
QGIS crea / modifica un numero di variabili dambiente allavvio. Quindi, puoi costruire variabili di percorso generalizzate per le librerie / utilità GDAL usando queste (vedi Impostazioni-> Opzioni-> Sistema) invece dei percorsi codificati nellesempio sopra.
Commenti
- Quindi non posso ' farlo? importare gdal_translate e quindi chiamare .main ()?
- No, ' non funzionerà. gdal_translate non è un pacchetto Python, quindi ' non ne sa nulla. Riceverai un errore che dice " ImportError No Module named gdal_translate ". Usa il modulo subprocess per chiamarlo.
- ok una domanda simile a quella di gdal_retile.py .. Ho provato a fare quanto segue: import gdal_retile gdal_retile.main (" -v -r bilinear -levels 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir cablepyramid – optfile files.txt ") ma ottengo lerrore: Opzione comando non riconosciuto: – Qualche idea del perché?
- Posso ' Non vedo il problema tranne la mia ipotesi è che potrebbe non gradire lopzione ' –optfile '. Questultimo non è documentato.
- @MappaGnosis Cè unalternativa a gdal_translate allinterno della libreria gdal di Python?
Risposta
Lo faccio con vari comandi gdal usando os.system che puoi usare per chiamare funzioni solo come da riga di comando:
os.system("gdal_translate -of GTiff " + sourcefile + " " + destinationfile)
È anche descritto nella lezione 7 qui: http://www.gis.usu.edu/~chrisg/python/2009/
Commenti
- I comandi GDAL sono disponibili come funzioni Python da GDAL 2.1 a RFC 59.1 . Inoltre
subprocess.call
è più sicuro dios.system
. - Qualcuno deve scrivere un buon esempio di quelle funzioni Python; Ho lottato con
gdal.Warp()
per un paio dore per ottenere correttamente unPG:
origine dati comecutlineDSName
per guidare ilcutlineSQL
. (Lo so, giusto? Un paio di ore sta effettivamente lavorando a qualcosa ? Lorrore! < / scherzando >). Alla fine ha funzionato e sembra essere significativamente più veloce dios.system()
osubprocess.call()
. ' sta facendo ~ 2 milioni di linee di taglio, quindi non ho ' sapere se ' è effettivamente più veloce fino a stasera … ma ' funziona perfettamente.
risposta
Ecco un codice rapido per chiunque desideri salvare bande da un TIF composito multibanda in singoli file utilizzando GDAL Translate in Python.
import gdal in_path = "C:/GIS/Sample.tif" #input composite raster out_path = "C:/GIS/Output/" #output directory for individual bands as files #Open existing raster ds src_ds = gdal.Open(in_path) for i in range(1,src_ds.RasterCount +1): #Save bands as individual files out_ds = gdal.Translate(out_path + "band" + str(i) + ".tiff", src_ds, format="GTiff", bandList=[i]) out_ds=None
Questo potrebbe essere utile per ulteriori elaborazioni (ad esempio utilizzando Rasterio, come qui ).