gọi gdal_merge.py vào một tập lệnh python khác đang chạy các quy trình GDAL


8

Tôi muốn sử dụng gdal_merge.pyđể hợp nhất một loạt các tệp .tif trước khi cắt tệp đã hợp nhất thành một ranh giới shapefile, nhưng muốn thực hiện như một phần của một tập lệnh lớn hơn sẽ thực thi một số quy trình khác. Tôi là một người mới chơi python / GDAL và không biết làm thế nào để gọi về gdal_merge.pymột kịch bản khác.

Tôi không thể gdal_merge.pytự mình chạy một mình mà chỉ một bước trong một kịch bản hy vọng sẽ thực thi một số quy trình. Bất kỳ suy nghĩ về cách tốt nhất để làm điều này?


Chào mừng đến với trang web Mike. Khi câu hỏi này xuất hiện, tôi thấy bốn câu hỏi: Làm thế nào để tạo danh sách các tệp tiff?; Làm thế nào để từ chối một danh sách các tập tin .tiff? Làm thế nào để cắt một danh sách các tập tin tiff?; Làm thế nào để gọi một tập lệnh từ trong một tập lệnh?. GIS SE là một trang web Hỏi & Đáp tập trung, phù hợp nhất cho các câu hỏi đơn. Vui lòng xem xét tập trung bài viết này vào một câu hỏi duy nhất. Để biết thêm thông tin về GIS SE, bạn có thể tham quan ( gis.stackexchange.com/tour ) hoặc truy cập trung tâm trợ giúp của chúng tôi ( gis.stackexchange.com/help ).
Aaron

Câu trả lời:


6

Cách dễ nhất để làm điều này là bằng cách nhập đường dẫn gdal_merge.pyđược đặt, trong trường hợp của tôi, /usr/bin/- thay thế bằng đường dẫn đến gdal_mergetrên hệ thống của bạn, rõ ràng cũng có thể là đường dẫn Windows.

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

Bây giờ bạn sẽ phải xây dựng một mảng cho sys.argv, như thể bạn đang gọi gdal_mergetrực tiếp, ví dụ:

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

Có nhiều thông tin hơn về bài viết Stack Overflow này

Ngoài ra còn có __init__.pycơ chế , nhưng điều này đòi hỏi tệp bạn đang nhập phải nằm trong thư mục con của bất cứ nơi nào bạn đang chạy tệp python của mình.


Cảm ơn rất nhiều vì câu trả lời của John, tôi sẽ thử và cho bạn biết nó diễn ra như thế nào.
Mike

Bạn có ở vị trí để sử dụng gdalwarp thay thế (phụ thuộc vào những gì bạn đang làm, tôi đoán, nhưng thường được đề xuất hơn gdal_merge). Nếu vậy, bạn có thể sử dụng mô đun siêu xử lý vì nó là C chứ không phải Python. Nhìn đặc biệt vào Popen.
John Powell

Vì vậy, đây là tình hình. Tôi phải viết một kịch bản sẽ trích dẫn lại một loạt các tif, hợp nhất chúng và sau đó đưa chúng vào một ranh giới. Tôi đã viết một tập lệnh bằng cách sử dụng gdalwarp để chiếu lại (sử dụng mô đun quy trình con trên một poster khác). Điều đó nói rằng, bây giờ tôi phải thực hiện hai bước còn lại trong cùng một tập lệnh và không chắc chắn làm thế nào để sử dụng quy trình con cho nhiều quy trình. Hơn nữa, tôi không biết rằng gdalwarp có thể hợp nhất một loạt các tệp. Tôi chắc chắn rằng điều này khá đơn giản, nhưng đây là tất cả thương hiệu mới đối với tôi.
Mike

gdalwarp input_tiles output_tile chắc chắn sẽ khảm gạch và bạn cũng có thể gọi nó bằng cách sử dụng quy trình con. Thật không may, chúng tôi vừa bị cắt điện tại nơi làm việc và pin máy tính xách tay của tôi hơi thấp, vì vậy không thể thực hiện bất kỳ thử nghiệm nào :(
John Powell

John tuyệt vời, cảm ơn. Gdalwarp sẽ cần phải được gọi trong 3 quy trình khác nhau nếu nó sẽ chạy ba quy trình khác nhau (từ chối 4 gạch, ghép bốn, và sau đó cắt chúng) hoặc có thể chứa tất cả các tính năng này trong một dòng không?
Mike

2

Biên tập:

Chỉ cần đọc rằng tùy chọn này đã được đề xuất trong các ý kiến ​​đã. Dù sao, vì lợi ích hoàn toàn. Có lẽ ai đó có thể hợp nhất các câu trả lời?

Tất nhiên cũng có thể sử dụng python's subprocess, vd

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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.