memanggil gdal_merge.py ke skrip python lain yang menjalankan proses GDAL


8

Saya ingin menggunakan gdal_merge.pyuntuk menggabungkan serangkaian file .tif sebelum kliping file yang digabungkan ke batas shapefile, tetapi ingin melakukannya sebagai bagian dari skrip lain yang lebih besar yang akan menjalankan sejumlah proses lainnya. Saya seorang pemula python / GDAL dan tidak yakin bagaimana cara memanggil gdal_merge.pyke skrip lain.

Saya tidak bisa hanya menjalankannya gdal_merge.pysendiri karena itu hanyalah satu langkah dalam sebuah skrip yang diharapkan akan menjalankan sejumlah proses. Adakah pemikiran tentang cara terbaik untuk melakukan ini?


Selamat datang di situs Mike. Sebagai pertanyaan ini berdiri, saya melihat empat pertanyaan: Bagaimana cara menghasilkan daftar file tiff ?; Bagaimana cara memproyeksi ulang daftar file .tiff? Bagaimana cara klip daftar file tiff?; Bagaimana cara memanggil skrip dari dalam skrip ?. GIS SE adalah situs tanya jawab yang terfokus yang paling cocok untuk satu pertanyaan. Silakan pertimbangkan untuk memfokuskan posting ini menjadi satu pertanyaan. Untuk informasi lebih lanjut tentang GIS SE, Anda dapat mengikuti tur ( gis.stackexchange.com/tour ) atau mengakses pusat bantuan kami ( gis.stackexchange.com/help ).
Aaron

Jawaban:


6

Cara termudah untuk melakukan ini adalah dengan mengimpor jalur di mana gdal_merge.pyberada, dalam kasus saya, /usr/bin/- gantikan dengan jalur gdal_mergedi sistem Anda, yang, tentu saja, bisa menjadi jalur Windows juga.

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

Anda sekarang harus membangun array untuk sys.argv, seolah-olah Anda memanggil gdal_mergelangsung, misalnya,

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

Ada informasi lebih lanjut tentang pos Stack Overflow ini

Ada juga __init__.pymekanismenya , tetapi ini membutuhkan file yang Anda impor berada di sub-direktori di mana pun Anda menjalankan file python Anda.


Terima kasih banyak atas tanggapannya, John, saya akan mencobanya dan memberi tahu Anda bagaimana hasilnya.
Mike

Apakah Anda berada dalam posisi untuk menggunakan gdalwarp sebagai gantinya (tergantung apa yang Anda lakukan, saya kira, tetapi sering direkomendasikan daripada gdal_merge). Jika demikian, Anda bisa menggunakan modul suprocess karena C dan bukan Python. Terlihat khususnya pada Popen.
John Powell

Jadi inilah situasinya. Saya harus menulis sebuah skrip yang akan memproyeksikan ulang serangkaian tif, menggabungkannya, dan kemudian menjepitnya ke batas. Saya sudah menulis skrip menggunakan gdalwarp untuk memproyeksikan ulang (menggunakan modul subproses per poster lain). Yang mengatakan, saya sekarang harus melakukan dua langkah lain dalam skrip yang sama dan saya tidak yakin bagaimana menggunakan subproses untuk banyak proses. Selain itu, saya tidak menyadari bahwa gdalwarp dapat menggabungkan serangkaian file. Saya yakin ini cukup sederhana, tetapi ini semua baru bagi saya.
Mike

gdalwarp input_tiles output_tile pasti akan membuat ubin mosaik dan Anda bisa menyebutnya menggunakan subproses juga. Sayangnya, kami baru saja mati listrik di tempat kerja dan baterai laptop saya agak rendah, jadi tidak bisa melakukan pengujian :(
John Powell

John yang luar biasa, terima kasih. Akankah gdalwarp perlu dipanggil dalam 3 subproses yang berbeda mengingat bahwa ia akan menjalankan tiga proses yang berbeda (memproyeksikan 4 ubin, merapikan empat, dan kemudian memotongnya) atau dapatkah semua fitur ini terkandung dalam satu baris?
Mike

2

Edit:

Baca saja bahwa opsi ini sudah disarankan di komentar. Pokoknya, demi kelengkapan. Mungkin seseorang bisa menggabungkan jawaban?

Tentu saja juga dimungkinkan untuk menggunakan python subprocess, misalnya

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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.