Fui encarregado de criar uma análise de adequação das condições das ondas no Golfo do México. Eu tenho mais ou menos 2.000 arquivos raster que têm cerca de 8 MB cada (2438 colunas, 1749 linhas, tamanho de célula de 1 km). O parâmetro nos arquivos de varredura é o período de onda e eu gostaria de reclassificar todos os rasters, de modo que 4<= wave period <=9 then make cell = 1
, se , outra célula = 0. Em seguida, some todos os rasters em uma varredura final e divida pelo número total de rasters para dar uma porcentagem total de observações adequadas e resultado da exportação para algum formato compatível com ESRI ... talvez algo que possa suportar flutuadores, se necessário. Eu não trabalhei muito com Python ou R, mas depois de pesquisar on-line, parece fazer sentido executar esse processo em uma dessas linguagens. Eu criei algum código até agora no R, mas estou confuso sobre como fazer isso funcionar.
library(rgdal)
raster_data <- list.files(path=getwd()) #promt user for dir containing raster files
num_files <- length(raster_data)
for (i in raster_data) { #read in rasters
my_data <- readGDAL(raster_data[i])
Nesse ponto, estou confuso quanto a reclassificar e começar a somar os dados dentro desse loop ou não. Meu palpite seria sim, pois caso contrário, acho que ficaria sem memória no meu computador, mas não tenho certeza. Também não tenho certeza sobre como reclassificar os dados.
Ao pesquisar online, acho que usaria reclass(my_data, c(-Inf,3,0, 4,9,1, 10,Inf,0))
, mas isso parece certo?
E, para resumir, eu usaria sum(stack(my_data))
e, de alguma forma, exibirei isso. Além disso ... se isso puder ser executado ou escrito com mais eficiência em Python, eu também estaria aberto a isso. Eu realmente sou iniciante quando se trata de programação.
Respostas:
Esta é uma maneira concisa de fazer isso no R --- aqui sem arquivos intermediários:
fonte
R
devem ser mantidas na RAM para serem criadass
. (Provavelmente, é necessário o dobro de RAM, porques
provavelmente não será substituídoraster_data
.) Espero que você tenha muita RAM! Sua solução pode ser praticada dividindo as grades de 2000 em grupos menores, executando o cálculo para cada grupo e combinando esses cálculos.stack
ecalc
funcionou como a maioria das outrasR
funções, carregando primeiro todos os dados na RAM.Como observei nos comentários, geralmente você deve evitar o uso de R para fins não estatísticos devido a problemas de desempenho em certos aspectos (trabalhar com ciclos é um exemplo). Aqui está um exemplo de código para você em Pyhton (graças a este artigo ) para reclassificação de um único arquivo com uma única banda. Você poderá modificá-lo facilmente para processamento em lote se souber como obter todos os arquivos do diretório . Observe que os rasters são representados como matrizes; portanto, você pode usar métodos de matriz para melhorar o desempenho, quando aplicável. Para trabalhar com matrizes em Python, consulte a documentação do Numpy .
UPD: o código que publiquei inicialmente era uma versão truncada de um filtro personalizado necessário para o processamento de pixels. Mas para esta pergunta, o uso do Numpy aumentará o desempenho (consulte o código).
fonte
Não use readGDAL. Ele lê um objeto Spatial * que pode não ser uma boa ideia.
Use o
raster
pacote. Ele pode ler coisas GDAL em objetos Raster. Isso é uma coisa boa.r = raster("/path/to/rasterfile.tif")
irá lê-lor
.Sua classificação é então
t = r > 4 & r <= 9
A grande questão é se esses arquivos serão exibidos em novos arquivos de varredura e, em seguida, execute a etapa de resumo em outro loop. Se você tiver o armazenamento, eu os escreveria em novos arquivos apenas porque se o seu loop falhar (porque um desses arquivos de 2000 é lixo), você terá que iniciar novamente. Portanto, use
writeRaster
para criar rasters limiares se você decidir fazer isso.Seu loop é então apenas algo como
isto.
O gerenciamento de memória de R pode ser útil aqui - quando você faz
count=count+r
R, pode fazer uma nova cópia decount
. Então, são potencialmente 2000 cópias dele - mas a coleta de lixo é ativada e limpa, e é aqui que o loop de R costumava ser muito ruim.Em termos de tempo, no meu PC de 4 anos, o limiar de operação demora cerca de 1,5s em uma varredura desse tamanho de números aleatórios entre zero e vinte. Vezes 2000 = você faz as contas. Como sempre, faça um pequeno conjunto de testes para desenvolver o código, inicie-o nos dados reais e tome um café.
fonte
R
2.15.0), a leitura de uma grade de 1,6 megapixel (no formato nativo de ponto flutuante ESRI) leva 0,19 segundos e a execução das cinco operações de loop - duas comparações, uma conjunção, uma adição e uma loja - leva outra 0,09 segundos, por 0,28 segundos por iteração. Quando, em vez disso, o loop é realizado armazenando em cache 100 grades por vez em uma matriz e usando-serowSums
para fazer os totais, o uso da RAM naturalmente aumenta: mas, igualmente obviamente, não há coleta de lixo. O tempo cai apenas para 0,26 segundos por iteração.