appeler gdal_merge.py dans un autre script python exécutant des processus GDAL

8

Je souhaite utiliser gdal_merge.pypour fusionner une série de fichiers .tif avant de découper le fichier fusionné dans une limite de fichier de formes, mais je souhaite le faire dans le cadre d'un autre script plus grand qui exécutera un certain nombre d'autres processus. Je suis un débutant en python / GDAL et je ne sais pas comment faire pour appeler gdal_merge.pyun autre script.

Je ne peux pas simplement exécuter gdal_merge.pyseul, car ce n'est qu'une étape dans un script qui, espérons-le, exécutera un certain nombre de processus. Avez-vous des réflexions sur la meilleure façon de procéder?

Mike
la source
Bienvenue sur le site Mike. En l'état de cette question, je vois quatre questions: Comment générer une liste de fichiers tiff ?; Comment reprojeter une liste de fichiers .tiff? Comment découper une liste de fichiers tiff ?; Comment appeler un script depuis un script?. GIS SE est un site de questions / réponses ciblé qui convient le mieux aux questions individuelles. Veuillez envisager de concentrer ce message sur une seule question. Pour plus d'informations sur GIS SE, vous pouvez faire le tour ( gis.stackexchange.com/tour ) ou accéder à notre centre d'aide ( gis.stackexchange.com/help ).
Aaron

Réponses:

6

La façon la plus simple de le faire est d'importer le chemin d'accès où gdal_merge.pyse trouve, dans mon cas, /usr/bin/- remplacer par le chemin d'accès à gdal_mergesur votre système, qui, évidemment, pourrait également être un chemin d'accès Windows.

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

Vous devrez maintenant créer un tableau pour sys.argv, comme si vous appeliez gdal_mergedirectement, par exemple,

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

Il y a plus d'informations sur ce post Stack Overflow

Il existe également le __init__.pymécanisme , mais cela nécessite que le fichier que vous importez soit dans un sous-répertoire de l'endroit où vous exécutez votre fichier python.

John Powell
la source
Merci beaucoup pour la réponse John, je vais essayer et vous dire comment ça se passe.
Mike
Êtes-vous en mesure d'utiliser gdalwarp à la place (cela dépend de ce que vous faites, je suppose, mais souvent recommandé par rapport à gdal_merge). Si c'est le cas, vous pouvez utiliser le module suprocess car il s'agit de C et non de Python. Regardez particulièrement Popen.
John Powell
Voici donc la situation. Je dois écrire un script qui reprojetera une série de tifs, les fusionnera, puis les fixera à une limite. J'ai déjà écrit un script en utilisant gdalwarp pour reprojeter (en utilisant le module de sous-processus par une autre affiche). Cela dit, je dois maintenant effectuer les deux autres étapes du même script et je ne sais pas comment utiliser le sous-processus pour plusieurs processus. De plus, je ne savais pas que gdalwarp pouvait fusionner une série de fichiers. Je suis sûr que c'est assez simple, mais c'est tout nouveau pour moi.
Mike
gdalwarp input_tiles output_tile sera certainement des mosaïques et vous pouvez également l'appeler en utilisant un sous-processus. Malheureusement, nous venons d'avoir une coupure de courant au travail et la batterie de mon ordinateur portable est un peu faible, donc je ne peux pas faire de test :(
John Powell
Génial John, merci. Gdalwarp devra-t-il être appelé en 3 sous-processus différents étant donné qu'il exécutera trois processus différents (reprojeter 4 tuiles, mosaïquer les quatre, puis les découper) ou toutes ces fonctionnalités peuvent-elles être contenues sur une seule ligne?
Mike
2

Éditer:

Il suffit de lire que cette option a déjà été suggérée dans les commentaires. Quoi qu'il en soit, par souci d'exhaustivité. Peut-être que quelqu'un peut fusionner les réponses?

Bien sûr, il est également possible d'utiliser des pythons subprocess, par exemple

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
la source