llamando a gdal_merge.py a otro script de Python que ejecuta procesos GDAL

8

Quiero usar gdal_merge.pypara fusionar una serie de archivos .tif antes de recortar el archivo fusionado en un límite de shapefile, pero quiero hacerlo como parte de otro script más grande que ejecutará una serie de otros procesos. Soy un novato de Python / GDAL y no estoy seguro de cómo llamar gdal_merge.pya otro script.

No puedo simplemente ejecutarlo gdal_merge.pysolo como es, sino un paso en un script que, con suerte, ejecutará varios procesos. ¿Alguna idea sobre la mejor manera de hacer esto?

Miguel
fuente
Bienvenido al sitio Mike. Tal como está esta pregunta, veo cuatro preguntas: ¿Cómo generar una lista de archivos tiff ?; ¿Cómo reproyectar una lista de archivos .tiff? ¿Cómo recortar una lista de archivos tiff ?; ¿Cómo llamar a un script desde un script ?. GIS SE es un sitio de preguntas y respuestas enfocado que es más adecuado para preguntas individuales. Considera enfocar esta publicación en una sola pregunta. Para obtener más información sobre GIS SE, puede realizar el recorrido ( gis.stackexchange.com/tour ) o acceder a nuestro centro de ayuda ( gis.stackexchange.com/help ).
Aaron

Respuestas:

6

La forma más fácil de hacer esto es importando la ruta donde gdal_merge.pyse encuentra, en mi caso, /usr/bin/sustituir la ruta a gdal_mergeen su sistema, que, obviamente, también podría ser una ruta de Windows.

import sys
sys.path.append('/usr/bin/')
import gdal_merge as gm

Ahora tendrá que construir una matriz para sys.argv, como si estuviera llamando gdal_mergedirectamente, por ejemplo,

sys.argv = ['-o','outputfile.tiff','inputfile1.png', 'inputfile2.png', ....'inputfile10.png']
gm.main()

Hay más información sobre esta publicación de desbordamiento de pila

También existe el __init__.pymecanismo , pero esto requiere que el archivo que está importando esté en un subdirectorio desde donde esté ejecutando su archivo de Python.

John Powell
fuente
Muchas gracias por la respuesta, John, lo intentaré y le haré saber cómo va.
Mike
¿Está en condiciones de usar gdalwarp en su lugar (depende de lo que esté haciendo, supongo, pero a menudo se recomienda sobre gdal_merge). Si es así, podría usar el módulo de suproceso ya que es C y no Python. Mire particularmente a Popen.
John Powell el
Así que aquí está la situación. Tengo que escribir un guión que reproyecte una serie de tifs, los fusione y luego los acorte a un límite. Ya he escrito un script usando gdalwarp para reproyectar (usando el módulo de subproceso por otro póster). Dicho esto, ahora tengo que llevar a cabo los otros dos pasos en el mismo script y no estoy seguro de cómo usar el subproceso para múltiples procesos. Además, no sabía que gdalwarp podría fusionar una serie de archivos. Estoy seguro de que esto es bastante simple, pero todo esto es nuevo para mí.
Mike
gdalwarp input_tiles output_tile definitivamente mosaicos mosaicos y también podría llamarlo usando subproceso. Desafortunadamente, tuvimos un corte de energía en el trabajo y la batería de mi computadora portátil está un poco baja, así que no puedo hacer ninguna prueba :(
John Powell
Impresionante John, gracias. ¿Será necesario llamar a gdalwarp en 3 subprocesos diferentes dado que ejecutará tres procesos diferentes (reproyectando 4 mosaicos, mosaicando los cuatro y luego recortándolos) o pueden todas estas características estar contenidas en una sola línea?
Mike
2

Editar:

Acabo de leer que esta opción ya se sugirió en los comentarios. De todos modos, por completo. ¿Quizás alguien puede fusionar las respuestas?

Por supuesto, también es posible usar Python subprocess, por ejemplo

import subprocess
def merge(first, second, out_file):
    """
    This utility will automatically mosaic a set of images.
    All the images must be in the same coordinate system and
    have a matching number of bands, but they may be overlapping,
    and at different resolutions. In areas of overlap,
    the last image will be copied over earlier ones.

    :param first:
    :param second:
    :param out_file:
    :return:
    """
    ps = subprocess.Popen(
        ['gdal_merge.py', '-o', out_file,
         '-of', unipath.Path(out_file).ext,
         '-n', NO_DATA_VALUE,
         first, second],
        stdout=subprocess.PIPE
    )
    output = ps.communicate()[0]
    for line in output.splitlines():
        logger.debug("[*] {0}".format(line))
LarsVegas
fuente