¿Es posible usar alguna API de gdal para llamar a gdal_translate
desde el código Python? No me refiero simplemente a ejecutar gdal_translate.exe desde el sistema de archivos, sino llamarlo de alguna manera en el código para que no necesite saber el directorio exacto en el que se encuentra el ejecutable gdal_translate.
Comentarios
- Sí, a partir de gdal-2.1. Esta respuesta debe aceptarse como correcta.
Respuesta
Desde GDAL 2.1 (más información aquí ), las utilidades GDAL y OGR se pueden utilizar como funciones de biblioteca. Por ejemplo:
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
Comentarios
- Todas las opciones que
gdal.Translate()
las tomas se enumeran aquí: gdal.org/python/osgeo.gdal-module.html#TranslateOptions - I ' intenté usar esto y no ' obtuve ningún error, pero el archivo de salida no es ' t creado. ¿Alguna idea de por qué?
- Tampoco obtiene ningún archivo de salida ni errores. Las rutas de salida y los parámetros de projWin son correctos.
Respuesta
Consulte el GDAL Tutorial de API .
#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
Si desea más control de salida, como cambio de tamaño, subconjunto, etc … use un VRT como entrada, así es como gdal_translate lo hace internamente.
Comentarios
- Desafortunadamente, esto no ' no incluye reporyección, ¿verdad?
- @butcher – no. Porque la pregunta no mencionó la reprobación. Por supuesto, puede reproyectar rásteres con la API de Python de gdal. Si quieres saber cómo, haz una nueva pregunta.
- Ya lo hice aquí: gis.stackexchange.com/questions/103874/… pero thius se marcó como un duplicado 🙁
- @butcher – que se cerró como un duplicado de esta pregunta. Su pregunta también es sobre gdal_translate . ¿Sabe que gdal_translate no reproyecta? Si desea reproyectar, use gdalwarp o el método de la API de gdal python – gdal.ReprojectImage
Answer
Sí, puede llamar a las utilidades de GDAL desde Python. Hay diferencias muy pequeñas en el enfoque dependiendo de si la utilidad es un archivo ejecutable por derecho propio o también un fragmento de código Python. De cualquier manera, debes usar el módulo subproceso :
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)
Notará que agrego comillas de escape alrededor de mis rutas. Esto se debe a que, en Windows, he tenido tr Problemas con rutas, especialmente aquellas con espacios o donde uno de los caracteres «\» crea otro carácter de escape accidental. Por lo tanto, solo conservo la ruta correcta en aspec, por así decirlo.
Si está utilizando una de las utilidades de Python, haga lo mismo, excepto que su exe al comienzo de la cadena de comando del subproceso es ahora » C: \ python32 \ python.exe «(o la versión que tenga) y su segundo elemento es la utilidad de Python que desea usar.
Obviamente, también puede iterar sobre su sistema de archivos en lugar de usar hardware constantes codificadas, pero esto es solo un ejemplo.
EDIT: generalización para complementos de QGIS
QGIS crea / modifica una serie de variables de entorno al inicio. Por lo tanto, puede crear variables de ruta generalizadas a las bibliotecas / utilidades de GDAL utilizando estas (consulte Configuración-> Opciones-> Sistema) en lugar de las rutas codificadas en el ejemplo anterior.
Comentarios
- Entonces, ¿puedo ' hacer esto? importar gdal_translate y luego llamar a .main ()?
- No, eso no ' no funcionará. gdal_translate no es un paquete de Python, así que Python no ' sabe nada al respecto. Obtendrá un error que dice " ImportError No Module named gdal_translate ". Use el módulo de subproceso para llamarlo en su lugar.
- ok, una pregunta similar a usar gdal_retile.py .. Traté de hacer lo siguiente: import gdal_retile gdal_retile.main (" -v -r bilineal -niveles 4 -ps 2048 2048 -co \ " tiled = YES \ " -targetDir pirámide de cables – optfile files.txt ") pero obtengo el error: Opción de comando no reconocida: – ¿Alguna idea de por qué?
- De repente, puedo ' No veo el problema, excepto que supongo que es posible que no le guste el interruptor ' –optfile '. Este último no está documentado.
- @MappaGnosis ¿Existe una alternativa de gdal_translate dentro de la biblioteca gdal de Python?
Responder
Hago esto con varios comandos gdal usando os.system que puede usar para llamar a funciones simplemente desde la línea de comando:
os.system("gdal_translate -of GTiff " + sourcefile + " " + destinationfile)
También se describe en la lección 7 aquí: http://www.gis.usu.edu/~chrisg/python/2009/
Comentarios
- Los comandos GDAL están disponibles como funciones de Python en GDAL 2.1 a RFC 59.1 . Además,
subprocess.call
es más seguro queos.system
. - Alguien necesita escribir un buen ejemplo de esas funciones de Python; luché con
gdal.Warp()
durante un par de horas para obtener unaPG:
fuente de datos comocutlineDSName
para conducir elcutlineSQL
. (Lo sé, ¿verdad? Un par de horas realmente resolviendo algo ? ¡El horror! < / kidding >). Lo conseguí finalmente, y parece ser significativamente más rápido queos.system()
osubprocess.call()
. Está ' haciendo ~ 2 millones de líneas de corte, así que no ' sé si ' s en realidad más rápido hasta algún momento de esta noche … pero ' está funcionando exactamente bien.
Respuesta
Aquí hay un código rápido para cualquiera que desee guardar bandas de un TIF compuesto multibanda en archivos individuales usando GDAL Translate en 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
Esto podría ser útil para un procesamiento posterior (por ejemplo, usando Rasterio, como aquí ).