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?
os.system
realmente 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.?)os.system
parasubprocess
o módulo mais recente e conter várias melhorias (de segurança).-ot Float32
ou algo semelhante para a máscara de qualidade, porque não pode representar frações com uma varredura inteira.Respostas:
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.
fonte
Eu tive esse problema também. Acabei descobrindo que, no meu caso, era porque havia acabado de criar a imagem em disco usando
gdal
ligações Python , mas não havia fechado ogdal.Dataset
objeto na memória, portanto a gravação em disco foi concluída apenas parcialmente. Curiosamente, a única maneira que eu poderia encontrar para fechar umgdal.Dataset
em Python é:del variable_name_of_dataset
- tão feio!Em
C
há umGDALClose()
método que no momento não é implementado pela API Python GDAL, masRasterio
faz: https://github.com/sgillies/rasterio/blob/876b9a1e2bf04e349b485e05ebc4a8674ace3cf0/rasterio/_io.pyx#L1463Veja também: Por que fechar um conjunto de dados no GDAL Python?
fonte