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?


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.


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?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.