gdalwarp produzindo rasters vazios quando chamado de script python, mas não via linha de comando

8

Estou tentando agregar alguns dados rasterizados (todos .tif) até uma resolução mais grossa (de 0,05 a 0,25 graus) usando gdalwarp em python, mas o comando não está funcionando. Em vez de obter uma saída com uma ampla faixa de valores, todos os valores da saída são 0. A resolução e a profundidade / tipo de pixel estão corretos, mas os valores não.

Aqui está a documentação do comando gdalwarp: http://www.gdal.org/gdalwarp.html

Eu tenho dois arquivos de entrada que desejo agregar resolução de até 0,25 graus, produzindo várias saídas:

  • 'NDVI_raster': A primeira entrada é uma varredura assinada de 16 bits representando o NDVI, com valores variando de -10.000 a 10.000 e valores nodata de -15.000.

  • 'nodata_mask': o segundo é uma máscara NoData, flutuante de 32 bits, em que 1 = valores de dados "bons" e 0 = NoData.

Com o 'NDVI_raster' como entrada, quero produzir 7 saídas diferentes, cada uma representando uma estatística diferente. Eu faço isso chamando gdalwarp 7 vezes, sempre definindo o método de reamostragem (-r) para um dos seguintes: média, modo, max, min, mediana, q1, q2. Vou chamar as saídas NDVI_ave.tif, NDVI_mode.tif, etc. No momento, estou usando o GDAL 1.10.1, que apenas permite média e modo, por isso estou testando apenas essas duas estatísticas agora.

Usando 'nodata_mask' como entrada, quero produzir um QAL (camada de garantia de qualidade). Para fazer isso, eu uso gdalwarp, com o modo de reamostragem definido como 'médio' para agregar até 0,25 graus. Isso resulta em cada pixel representando a proporção de bons pixels / total de pixels da entrada. Vamos chamar a saída QAL.

Aqui está o que está no meu código (usando o modo como exemplo para a primeira entrada):

os.system('gdalwarp -tr .25 .25 -r mode -srcnodata -15000 %s %s' % (NDVI_raster, NDVI_mode))

E para a camada de controle de qualidade:

os.system('gdalwarp -tr .25 .25 -r average -srcnodata -15000 %s %s' % (nodata_mask, QAL))

Os resultados são rasters com a resolução, projeção e profundidade de pixel corretas, mas os valores de pixel são todos 0.

Alguém familiarizado com python / gdal sabe o que está acontecendo?


Ao chamar o comando gdalwarp na linha de comando (linux), obtenho o resultado desejado. Ao usar o os.system para chamar gdalwarp do python, recebo rasters vazios. Então, talvez algo esteja errado com minhas ligações gdal / python?


Em vez de chamar o comando via os.system, usei o subprocesso. A ferramenta por esse método também parece funcionar sem problemas, mas o resultado é o mesmo: uma varredura cheia de zeros.


Tentei colocar a chamada gdalwarp em um script shell bash e chamar esse script shell a partir de python, mas o resultado é um monte de -1s em vez de 0s. Estranhamente, eu já tinha testado antes e tenho certeza de que funcionou, mas o teste foi excluído do meu servidor e agora não posso recriá-lo por algum motivo.


Colocar o comando gdalwarp em um script do shell bash e depois chamá-lo na linha de comando me fornece o resultado desejado. Chamar o mesmo script de shell do python, no entanto, não. Parece que algo está errado com o python, mas o que e como corrigi-lo?

user20408
fonte
2
Não pode ser um problema obrigatório, você não os usou. Você executa o comando gdalwarp. Você deve verificar o status do erro do comando gdalwarp, consulte: stackoverflow.com/questions/3791465/…
Zoltan
2
Para expandir o que Zoltan está dizendo, você está basicamente chamando o mesmo programa (gdalwarp). os.systemrealmente inicia um shell e executa o comando fornecido. Além do valor de retorno, você provavelmente deve verificar as variáveis que você está tentando passar (ou seja, todas as questões citando etc.?)
Evil Genius
Você também deve considerar passar os.systempara subprocesso módulo mais recente e conter várias melhorias (de segurança).
Kersten
@Zoltan que mensagem de erro? Não recebi uma mensagem de erro porque o comando funcionou tecnicamente, apenas a saída não estava correta (valores de 0) .plz veja minha atualização. obrigado!
usar o seguinte comando
2
Uma questão é que acho que você precisará especificar -ot Float32ou algo semelhante para a máscara de qualidade, porque não pode representar frações com uma varredura inteira.
Nat Wilson

Respostas:

2

Você não diz como iniciar seu script python / gdalwarp. Descobri que um cronjob nem sempre terá o mesmo ambiente que meu ambiente de linha de comando. Eu tive que começar a criar ambientes de tempo de execução para esses tipos de scripts. Com isso dito, se você iniciar o script, digamos, de um ícone na área de trabalho, talvez ele não tenha o mesmo ambiente de tempo de execução que o ambiente da linha de comando. "PYTHONPATH" pode ser uma das variáveis ​​de ambiente que você precisa definir. Além disso, pode ser necessário definir variáveis ​​para o gdalwarp. Por fim, seus arquivos de dados podem não estar no local correto. Pode ser necessário definir um caminho absoluto como / xxx / xxxx / NDVI_raster ou usar tilda ~ / NDVI_raster. Como o PYTHONPATH, você também pode precisar configurar o PATH e outras variáveis ​​de ambiente."exporte ou origine " as mesmas configurações no início do seu script.

Greg
fonte
1

Eu tive esse problema também. Acabei descobrindo que, no meu caso, era porque havia acabado de criar a imagem em disco usando gdalligações Python , mas não havia fechado o gdal.Datasetobjeto na memória, portanto a gravação em disco foi concluída apenas parcialmente. Curiosamente, a única maneira que eu poderia encontrar para fechar um gdal.Datasetem Python é: del variable_name_of_dataset- tão feio!

Em Chá um GDALClose()método que no momento não é implementado pela API Python GDAL, mas Rasteriofaz: https://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io.pyx#L1463

Veja também: Por que fechar um conjunto de dados no GDAL Python?

Hazzles
fonte