Me gustaría reclasificar un archivo ráster de un ráster con 10 clases a un ráster con 8 clases usando pyhton, gdal y / o numpy. Las clases se representan como enteros. He intentado seguir los pasos de esta publicación Reclasificar rásteres usando GDAL y Python , el numpy.equal doc y también gdal_calc doc. Sin embargo, fue en vano.
El archivo ráster que se reclasificará tiene valores enteros que van del 0 al 11 y también incluye los valores 100 y 255. A continuación se muestra la reclasificación (del valor: al 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: nodata,
Lo que he podido hacer es seleccionar el archivo ráster que se reclasificará usando tkinter.FileDialog y obtener la información ráster como la geotransformación y el tamaño de píxel con reclass = gdal.Open (raster, GA_ReadOnly).
¿Cómo hago para resolver lo anterior?
Cabe mencionar que los rásteres a reclasificar pueden ser bastante grandes en algunos casos (500mb a 5gb).
fuente
Respuestas:
Aquí tienes un script de Python simple para la reclasificación, lo escribí y funciona para mí:
Solo cambia los rangos.
Espero que sea de ayuda.
fuente
file2
condel file2
ofile2 = None
para asegurarse de que se escribe en el disco..FlushCache()
solo influye en el caché de teselas interno de GDAL.En lugar de hacer la reclasificación como un bucle doble para descrito por dmh126, hágalo usando
np.where
:En una matriz de 6163 por 3537 píxeles (41,6 mb), la clasificación se realiza en 1,59 segundos, donde se requieren 12 minutos y 41 s con el doble bucle for. En total, solo una aceleración de 478x.
En pocas palabras, nunca use un bucle doble para usar
numpy
fuente
Aquí hay un ejemplo básico usando rasterio y numpy:
fuente
Solo para completar la respuesta de @Mattijn, creo que eso conducirá a un problema si las clases de entrada se superponen con las clases de salida. No quiero que la próxima regla cambie mi nuevo valor.
No sé si pierdo velocidad, pero debería hacer una copia profunda:
fuente
Aquí hay otro enfoque de Rasterio que pirateé juntos usando el Rasterio Cookbook y la respuesta de @ Mattijn.
fuente
En algunos casos, digitalizar numpy puede ser útil para pasar rápidamente de rangos a contenedores.
fuente
Con soporte de tabla de color ráster RGB:
fuente
Una alternativa ligeramente diferente podría ser la siguiente:
Este script se reproduce con numpy.where ( https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html ): en todos los pasos, excepto el último, en lugar de devolver un valor cuando condición no se cumple, devuelve otro np.where. Y continúa hasta que se consideren todos los valores posibles del ráster.
fuente