GDALプロセスを実行する別のPythonスクリプトにgdal_merge.pyを呼び出す


8

を使用gdal_merge.pyして一連の.tifファイルをマージしてから、マージしたファイルをシェープファイルの境界にクリップしたいのですが、他の多くのプロセスを実行する別の大きなスクリプトの一部としてそうしたいと思います。私はpython / GDALの初心者で、gdal_merge.py別のスクリプトを呼び出す方法がわかりません。

単純にgdal_merge.pyそのまま実行することはできませんが、多くのプロセスを実行できるスクリプトの1つのステップです。これを行うための最良の方法について何か考えはありますか?


サイトマイクへようこそ。この質問のように、私は4つの質問を見ます:tiffファイルのリストを生成する方法?; .tiffファイルのリストを再投影する方法は?TIFFファイルのリストをクリップする方法?; スクリプト内からスクリプトを呼び出す方法は?GIS SEは、単一の質問に最適なQ&Aサイトです。この投稿を1つの質問にまとめることを検討してください。GIS SEの詳細については、ツアー(gis.stackexchange.com/tour)を利用するか、ヘルプセンター(gis.stackexchange.com/help)にアクセスしてください。
アーロン

回答:


6

これを行う最も簡単な方法gdal_merge.pyは、私の場合、が置かれている場所のパスをインポートすることです。システムの/usr/bin/へのパスに置き換えてgdal_mergeください。これは明らかに、Windowsパスでもかまいません。

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

直接sys.argv呼び出しているかのように、の配列を作成する必要がありますgdal_merge。たとえば、

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

このスタックオーバーフローの投稿に関する詳細情報があります

__init__.pyメカニズムもありますが、これには、インポートするファイルが、Pythonファイルを実行している場所のサブディレクトリにあることが必要です。


Johnの返信に感謝します。試してみて、その様子をお知らせします。
Mike

代わりにgdalwarpを使用する立場にありますか(おそらく、何をしているのかによって異なりますが、gdal_mergeよりもお勧めします)。そうであれば、PythonではなくCであるため、suprocessモジュールを使用できます。特にPopenを見てください。
John Powell

これが状況です。一連のTIFを再投影してマージし、境界にクリップするスクリプトを作成する必要があります。再投影するためにgdalwarpを使用するスクリプトをすでに書いています(別のポスターに従ってサブプロセスモジュールを使用)。そうは言っても、同じスクリプトで他の2つのステップを実行する必要があり、複数のプロセスにサブプロセスを使用する方法がわかりません。さらに、gdalwarpが一連のファイルをマージできることを知りませんでした。これはかなりシンプルだと思いますが、これはまったく新しいものです。
マイク

gdalwarp input_tiles output_tileは間違いなくタイルをモザイク化し、サブプロセスを使用して呼び出すこともできます。残念ながら、仕事中に停電が発生し、ラップトップのバッテリーが少し低いため、テストを実行できません:(
John Powell

素晴らしいジョン、ありがとう。gdalwarpは、3つの異なるプロセス(4つのタイルを再投影し、4つのタイルをモザイク化してからクリップする)を実行する場合、3つの異なるサブプロセスで呼び出す必要がありますか?
Mike

2

編集:

このオプションはすでにコメントで提案されていることを読んでください。とにかく、完全を期すために。たぶん誰かが答えをマージできますか?

もちろんsubprocess、Pythonを使用することもできます。たとえば、

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))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.