Gostaria de reclassificar um arquivo rasterizado de um raster com 10 classes para um raster com 8 classes usando pyhton, gdal e / ou numpy. As classes são representadas como números inteiros. Eu tentei seguir as etapas deste post Reclassificar rasters usando GDAL e Python , o numpy.equal doc e também gdal_calc doc. No entanto, sem sucesso.
O arquivo rasterizado a ser reclassificado possui valores inteiros que variam de 0 a 11 e também incluem os valores 100 e 255. A seguir, é apresentada a reclasse (de valor: para valor):
nodata: 4, 0: 4, 1: 1, 2: 2, 3: 3, 4: 3, 5: 4, 6: 5, 7: 5, 8: 6, 9: 7, 10: 8, 100: nodata, 255:
O que eu pude fazer é selecionar o arquivo rasterizado a ser reclassificado usando tkinter.FileDialog e obter informações rasterizadas, como geotransformações e tamanho de pixel com reclass = gdal.Open (raster, GA_ReadOnly).
Como faço para resolver o exposto acima.
Vale a pena mencionar que os rasters a serem reclassificados podem ser razoavelmente grandes em alguns casos (500mb a 5gb).
fonte
Respostas:
Aqui você tem um script python simples para reclassificação, eu escrevi e funciona para mim:
Apenas mude os intervalos.
Eu espero que isso ajude.
fonte
file2
comdel file2
oufile2 = None
para garantir que ele seja gravado no disco..FlushCache()
influencia apenas o cache interno do bloco GDALs.Em vez de fazer a reclassificação como um loop for duplo descrito por dmh126, faça-o usando
np.where
:Em uma matriz de 6163 por 3537 pixels (41,6mb), a classificação é feita em 1,59 segundos, onde são necessários 12min 41s usando o loop for duplo. No total, apenas uma aceleração de 478x.
Bottomline, nunca use um loop for duplo usando
numpy
fonte
Aqui está um exemplo básico usando rasterio e numpy:
fonte
Apenas para completar a resposta de @Mattijn, acho que isso causará um problema se as classes de entrada se sobreporem às classes de saída. Não quero que meu novo valor seja alterado pela próxima regra.
Não sei se perco a velocidade, mas devo fazer uma cópia profunda:
fonte
Aqui está outra abordagem do Rasterio que eu hackeei usando o Rasterio Cookbook e a resposta de @ Mattijn.
fonte
Em alguns casos, a digitalização numpy pode ser útil para ir rapidamente dos intervalos aos compartimentos.
fonte
Com suporte para tabela de cores RGB raster:
fonte
Uma alternativa ligeiramente diferente pode ser a seguinte:
Esse script é reproduzido com numpy.where ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html ): em todas as etapas além da última, em vez de retornar um valor quando o condição não for atendida, ele retorna outro np.where. E continua até que todos os valores possíveis da varredura sejam considerados.
fonte