chamando gdal_merge.py para outro script python executando processos GDAL

8

Quero usar gdal_merge.pypara mesclar uma série de arquivos .tif antes de recortar o arquivo mesclado em um limite de shapefile, mas quero fazer isso como parte de outro script maior que executará vários outros processos. Eu sou um novato em python / GDAL e não tenho certeza de como proceder gdal_merge.pypara chamar outro script.

Não posso simplesmente executar gdal_merge.pypor conta própria, pois é apenas uma etapa de um script que, esperançosamente, executará vários processos. Alguma idéia sobre a melhor maneira de fazer isso?

Mike
fonte
Bem-vindo ao site Mike. Como esta pergunta está, eu vejo quatro perguntas: Como gerar uma lista de arquivos tiff ?; Como reprojetar uma lista de arquivos .tiff? Como recortar uma lista de arquivos tiff ?; Como chamar um script de dentro de um script? O GIS SE é um site de perguntas e respostas focado, mais adequado para perguntas únicas. Por favor, considere focar este post em uma única pergunta. Para obter mais informações sobre o GIS SE, você pode fazer o tour ( gis.stackexchange.com/tour ) ou acessar nossa Central de Ajuda ( gis.stackexchange.com/help ).
Aaron

Respostas:

6

A maneira mais fácil de fazer isso é importando o caminho onde gdal_merge.pyestá localizado, no meu caso, /usr/bin/- substitua pelo caminho gdal_mergeno sistema, que, obviamente, também pode ser um caminho para o Windows.

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

Agora você precisará criar uma matriz para sys.argv, como se estivesse ligando gdal_mergediretamente, por exemplo,

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

Há mais informações sobre esta publicação Stack Overflow

Também existe o __init__.pymecanismo , mas isso requer que o arquivo que você está importando esteja em um subdiretório de onde quer que esteja executando o arquivo python.

John Powell
fonte
Muito obrigado pela resposta, John, vou tentar e informar como vai.
Mike
Você está em posição de usar o gdalwarp (depende do que você está fazendo, eu acho, mas frequentemente recomendado sobre o gdal_merge). Nesse caso, você pode usar o módulo suprocess porque ele é C e não Python. Olhe particularmente para Popen.
John Powell
Então aqui está a situação. Eu tenho que escrever um script que reprojetar uma série de tifs, mesclá-los e prendê-los em um limite. Eu já escrevi um script usando gdalwarp para reprojetar (usando o módulo subprocesso por outro pôster). Dito isto, agora tenho que executar as outras duas etapas no mesmo script e não sei como usar o subprocesso para vários processos. Além disso, eu não sabia que o gdalwarp poderia mesclar uma série de arquivos. Tenho certeza de que isso é bastante simples, mas tudo isso é novo para mim.
Mike
O gdalwarp input_tiles output_tile definitivamente irá mosaicos e você pode chamá-lo usando o subprocesso também. Infelizmente, nós só tinha um corte de energia no trabalho e minha bateria do laptop é um pouco baixo, de modo que não pode fazer qualquer teste :(
John Powell
John impressionante, obrigado. O gdalwarp precisará ser chamado em 3 subprocessos diferentes, uma vez que estará executando três processos diferentes (reprojetando 4 blocos, mosaicando os quatro e depois cortando-os) ou todos esses recursos podem estar contidos em uma única linha?
Mike
2

Editar:

Basta ler que essa opção já foi sugerida nos comentários. Enfim, por uma questão de integridade. Talvez alguém possa mesclar as respostas?

Claro que também é possível usar python subprocess, por exemplo

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
fonte