Aufruf von gdal_merge.py in ein anderes Python-Skript, in dem GDAL-Prozesse ausgeführt werden

8

Ich möchte gdal_merge.pyeine Reihe von .tif-Dateien zusammenführen, bevor ich die zusammengeführte Datei an eine Shapefile-Grenze schneide, möchte dies jedoch als Teil eines anderen größeren Skripts tun, das eine Reihe anderer Prozesse ausführt. Ich bin ein Python / GDAL-Neuling und nicht sicher, wie ich ein gdal_merge.pyanderes Skript aufrufen soll .

Ich kann nicht einfach gdal_merge.pyalleine laufen, wie es ist, sondern nur einen Schritt in einem Skript, das hoffentlich eine Reihe von Prozessen ausführen wird. Irgendwelche Gedanken darüber, wie man das am besten macht?

Mike
quelle
Willkommen auf der Seite Mike. Bei dieser Frage sehe ich vier Fragen: Wie erstelle ich eine Liste von TIFF-Dateien?; Wie projiziere ich eine Liste von .tiff-Dateien neu? Wie schneide ich eine Liste von TIFF-Dateien ab?; Wie rufe ich ein Skript aus einem Skript heraus auf? GIS SE ist eine fokussierte Q & A-Site, die sich am besten für einzelne Fragen eignet. Bitte konzentrieren Sie diesen Beitrag auf eine einzige Frage. Weitere Informationen zu GIS SE erhalten Sie auf der Tour ( gis.stackexchange.com/tour ) oder in unserer Hilfe ( gis.stackexchange.com/help ).
Aaron

Antworten:

6

Der einfachste Weg, dies zu tun, besteht darin, den Pfad zu importieren, in dem gdal_merge.pysich in meinem Fall befindet. /usr/bin/Ersetzen Sie ihn durch den Pfad zu gdal_mergeauf Ihrem System, der natürlich auch ein Windows-Pfad sein kann.

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

Sie müssen jetzt ein Array für erstellen sys.argv, als ob Sie gdal_mergedirekt anrufen würden , z.

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

Weitere Informationen zu diesem Beitrag zum Stapelüberlauf finden Sie hier

Es gibt auch den __init__.pyMechanismus , aber dies erfordert, dass sich die zu importierende Datei in einem Unterverzeichnis befindet, von dem aus Sie Ihre Python-Datei ausführen.

John Powell
quelle
Vielen Dank für die Antwort John, ich werde es versuchen und Sie wissen lassen, wie es geht.
Mike
Sind Sie in der Lage, stattdessen gdalwarp zu verwenden (hängt davon ab, was Sie tun, denke ich, wird aber häufig über gdal_merge empfohlen). In diesem Fall können Sie das Suprocess-Modul verwenden, da es C und nicht Python ist. Schauen Sie sich besonders Popen an.
John Powell
Hier ist also die Situation. Ich muss ein Skript schreiben, das eine Reihe von TIFs neu projiziert, sie zusammenführt und sie dann an eine Grenze schneidet. Ich habe bereits ein Skript mit gdalwarp zum Neuprojektieren geschrieben (unter Verwendung des Unterprozessmoduls für ein anderes Poster). Das heißt, ich muss jetzt die beiden anderen Schritte im selben Skript ausführen und bin mir nicht sicher, wie ich den Unterprozess für mehrere Prozesse verwenden soll. Außerdem war mir nicht bewusst, dass gdalwarp eine Reihe von Dateien zusammenführen kann. Ich bin mir sicher, dass dies ziemlich einfach ist, aber das ist alles brandneu für mich.
Mike
gdalwarp input_tiles output_tile wird definitiv Mosaikkacheln und Sie können es auch mit einem Unterprozess aufrufen. Leider hatten wir gerade einen Stromausfall bei der Arbeit und mein Laptop-Akku ist etwas schwach, so dass ich keine Tests durchführen kann :(
John Powell
Super John, danke. Muss gdalwarp in 3 verschiedenen Unterprozessen aufgerufen werden, da drei verschiedene Prozesse ausgeführt werden (4 Kacheln neu projizieren, die vier kacheln und dann abschneiden) oder können alle diese Funktionen in einer einzigen Zeile enthalten sein?
Mike
2

Bearbeiten:

Lesen Sie einfach, dass diese Option bereits in den Kommentaren vorgeschlagen wurde. Der Vollständigkeit halber. Vielleicht kann jemand die Antworten zusammenführen?

Natürlich ist es auch möglich, Pythons zu verwenden subprocess, z

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
quelle