Gdal Dataset.ReadAsArray () trava o Python


12

Estou usando o Python 2.6.5 (32 bits) com o Numpy 1.3 e o Gdal 1.9.1 instalados no Windows 7 de 64 bits. Estou tentando ler um conjunto de dados de varredura Imagine de 800 MB Imagine (.img) em uma matriz Numpy para fazer uma álgebra de varredura, mas assim que executo o código a seguir, o Python.exe falha.

from osgeo import gdal

g = gdal.Open(r'path\to\dataset', gdal.GA_Readonly)
b = g.GetRasterBand(1)
data = b.ReadAsArray()

Python.exe trava na b.ReadAsArray()chamada. Pesquisei no Google e encontrei artigos datados do Gdal 1.6 que mencionavam esse problema no Windows 7 de 64 bits, mas também mencionaram que ele havia sido corrigido nas últimas versões de desenvolvimento da época.

Alguém mais teve esse problema? Alguma solução alternativa?

ATUALIZAR:

Decidi depurar o código no PyDev para tentar determinar onde está falhando. Pelo que sei (ainda não recebi nenhuma mensagem de erro), está falhando na linha 22 do gdal_array.py.

_mod = imp.load_module('_gdal_array', fp, pathname, description)

Quando entro na linha de código acima, ele me leva ao módulo init .py do numpy. Quando chego ao final do entorpecido. __ init __ .py, ele retorna à linha de código acima. Então, quando clico no botão step into, o que deve me levar à próxima linha do arquivo gdal_array.py, o script é finalizado sem nenhuma mensagem de erro ou qualquer outra coisa.

ATUALIZAÇÃO # 2:

Desinstalei o GDAL 1.9.1 e instalei o GDAL 1.6.1 a partir do Python Cheeseshop e dos binários do Windows da OSGeo. Ainda tinha o mesmo problema.


Eu estava tendo esse problema. Você está usando as ligações python gdal do Tamas em gis.internals? Nesse caso, mova suas adições ao PATH para a frente. Alguma outra biblioteca estava causando algum problema para mim.
Jay Laura

Eu acredito que fiz o download de seus internos. Vou tentar ajustar meu caminho quando chegar no escritório amanhã. Obrigado pelo conselho.
21712 Brian

1
Se isso não funcionar, recentemente mudei para o uso desses pacotes - lfd.uci.edu/~gohlke/pythonlibs
Jay Laura

Eu tentei mudar as coisas no meu System Path (variável de ambiente PATH no Windows) sem sorte. Também desinstalei minha versão do GDAL e instalei a versão do GDAL no link que você forneceu e ainda tinha o mesmo problema.
21712 Brian

Hmmm .... a versão que eu vinculei foi apenas as ligações, então você ainda precisa ter o núcleo GDAL do Tamas. Se as outras chamadas funcionaram, isso está funcionando bem. Três coisas a tentar são chutes de longe (em ordem de 'longitude'. 1) Atualize sua versão do Numpy. 2) gdal_translate para gtiff e tente o código nessa imagem. 3) acrescente ReadAsArray () com .astype (numpy.float32). A imagem é pública? Eu posso testá-lo na minha máquina. Você pode postar o rastreamento de pilha se nenhum deles funcionar?
Jay Laura

Respostas:


5

Como suspeito de muitos comentaristas, esse foi um problema com minha instalação. Aparentemente, eu não estava prestando muita atenção ao instalar o GDAL e os Python Bindings.

Instalei o GDAL Core e os plugins (dll's) do gisinternals.com, mas de alguma forma não pensei em instalar o Python Bindings a partir daí também. As ligações do Python que instalei eram de um site diferente (não me lembro qual delas neste momento).

Quando reinstalei o GDAL e o Python Bindings, todos do gisinternals.com, consegui o ReadAsArray com êxito.

Obrigado a todos que comentaram e responderam e peço desculpas pela minha ignorância.


3

É possível que seja um problema de memória. Quando você usa o ReadAsArray, ele traz os dados para a memória e, embora 800mb não seja grande, também não é pequeno. Você já tentou ler a matriz em pedaços?

data = b.ReadAsArray(x_offset, y_offset, x_size, y_size)

Você deve poder percorrer a matriz e processá-la em pedaços de cada vez, embora, dependendo do processamento que você está fazendo, provavelmente deva procurar em áreas com sobreposição para evitar efeitos de borda.


Eu tentei usar pedaços. Eu tentei data = b.ReadAsArray(0,0, 500, 500)com o mesmo resultado.
21712 Brian

Hmm. Suponho que você já tentou outros formatos de imagem? Além disso, houve uma mensagem de erro específica?
Omdhenners 21/12/12

Ainda não tentei outros formatos. não houve mensagem de erro, apenas um pop-up que dizia "python.exe parou de funcionar".
21712 Brian

Eu converti o arquivo .img para um GeoTIFF esta manhã e tentei novamente. Sem sorte
21712 Brian

Existe uma maneira de mapear na memória o arquivo do gdal?
CMCDragonkai

1

Desculpe, estou atrasado para esta festa, mas seu problema básico é que o Python de 32 bits não pode armazenar rasters muito grandes na memória. Você pode ler sua grande varredura na memória em pedaços pequenos, mas fica bastante limitado em termos do que você pode processar eficientemente sem ler / gravar extremamente ineficiente / frequente no disco.

O que eu faço (que sacrifica alguma eficiência devido à leitura / gravação de disco) é chamar ( via quebra -arquivo EXE ) a versão gisinternals.com de 64 bits de qualquer método gdal que você precisar. Tenha cuidado ao usar o módulo de subprocesso do python em um loop (ou seja, você pode / precisa chamar o subprocesso sequencialmente ), pois pode gerar inadvertidamente muitos threads abertos para a sua caixa do Windows e receber avisos ameaçadores do sistema. Você sacrifica um pouco a maneira de ler / gravar em disco com essa abordagem gdal, mas sua eficiência de processamento cai apenas (isto é, em relação a uma computação rápida na memória , se a sua caixa / biblioteca suportar isso) por um fator ou 10)

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.