¿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

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 que os.system.
  • Alguien necesita escribir un buen ejemplo de esas funciones de Python; luché con gdal.Warp() durante un par de horas para obtener una PG: fuente de datos como cutlineDSName para conducir el cutlineSQL. (Lo sé, ¿verdad? Un par de horas realmente resolviendo algo ? ¡El horror! < / kidding >). Lo conseguí finalmente, y parece ser significativamente más rápido que os.system() o subprocess.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í ).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *