¿Cómo reclasificar un conjunto de datos de cobertura terrestre muy grande?

10

Considere el conjunto de datos NLCD2001 Land Cover para Alaska ( enlace de descarga ). Necesito reclasificar este conjunto de datos para que solo se conserven los píxeles de valor 41, 42 y 43; todos los demás valores de píxeles deben convertirse en NoData (o 0, si es necesario).

Esto parece una tarea simple, que solo requiere una llamada a la herramienta Reclasificar. Desafortunadamente, cada llamada da como resultado un mensaje de error vago e inútil:

Executing: Reclassify "D:\ak_nlcd_2001_land_cover_3-13-08_se5.img" Value "0 40 0;41 41;42 42;43 43;44 255 0;NODATA 0" "D:\alaska_reclassified.tif" DATA 
Start Time: Thu Jan 03 09:23:13 2013
ERROR 999998: Unexpected Error.
Failed to execute (Reclassify).
Failed at Thu Jan 03 09:23:13 2013 (Elapsed Time: 0.00 seconds)

¿Cómo puedo reclasificar este dataset ráster? Estoy usando ArcCatalog 10.0, Build 4000, con la extensión Spatial Analyst habilitada.

DoggoDougal
fuente
Extraer por atributos parece hacer también lo que necesito, pero desafortunadamente da como resultado otro "error inesperado".
DoggoDougal
¿Intentó otro conjunto de datos tal vez? Dos procesos que fallan en el mismo conjunto de datos te hacen preguntarte ...
Chad Cooper
2
Por lo general, reclassifydebería ser un último recurso, porque tiene un alcance tan general que probablemente utiliza métodos que son menos eficientes que los que se pueden obtener cuando la reclasificación es fácil de expresar de forma aritmética o lógica. En el presente caso, el criterio para la reclasificación es tan simple que primero debe intentarlo Cono incluso con operaciones aritméticas directas (porque son rápidas). Por ejemplo, "grid" * ("grid" >= 41) * ("grid" <= 43)debería hacerlo. La RAM no debería ser un problema: Spatial Analyst abre automáticamente su E / S ráster y estas son operaciones locales.
whuber
1
InlistEs una buena solución (+1). Pude usar cony monitorear el uso de RAM durante la operación. Nunca superó los 180 MB, que es apenas mayor que la RAM utilizada solo para iniciar ArcMap. El mosaico en ArcGIS es automático: ni siquiera puede controlarlo (a menos que esté programando en la interfaz C / Fortran). Parece que las limitaciones de RAM son poco preocupantes.
whuber
1
@whuber, contrabajó para mí también, con la condición "Value" >= 41 AND "Value" <= 43. Me hubiera ido con esta solución, pero no estoy seguro de si los valores ráster adicionales serán de interés en el futuro. Obviamente podría agregar una ORcláusula where, pero luego comienza a complicarse. InListParece la solución más sencilla en cuanto a legibilidad y facilidad de mantenimiento.
DoggoDougal

Respuestas:

9

El primer script adjunto reclasificó con éxito sus datos AK NLCD en aproximadamente 15 minutos (i7, máquina de 12 GB de RAM). Dado que el conjunto de datos original es de casi 7 GB, es posible que tenga problemas de memoria. Si no puede procesar todo el conjunto de datos en un fragmento, intente dividirlo con el segundo script antes de la reclasificación. Mi recomendación es tomar un pequeño subconjunto de los datos (haga clic con el botón derecho en la capa ráster en TOC> Datos> Exportar datos> Extensión (Marco de datos) y pruebe el primer script. Una vez que marque los parámetros para el comando de reclasificación, luego avance hacia la reclasificación todo el conjunto de datos o dividiéndolo. Alternativamente, intente descargar el producto de geoprocesamiento en segundo plano de 64 bits para ArcGIS 10.1 SP1, disponible aquí . Mucha suerte.

Script 1

# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *

# Overwrite output
env.overwriteOutput = 1

# Set environment settings
env.workspace = r'C:\temp'
Dir = env.workspace

# Set local variables
inRaster = Dir + "\\" + "nlcd_subset.img"
reclassField = "Value"
remap = RemapValue([[0, 40, 0], [41, 41],[42,42], [43,43], [44, 256, 0]])

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute Reclassify
outReclassify = Reclassify(inRaster, reclassField, remap, "NODATA")

# Save the output 
outReclassify.save(r"C:\temp\nlcd_test.img")

Editar : si necesita dividir sus datos antes del procesamiento, este script debería ayudarlo:

Guión 2

# Import system modules
import arcpy
from arcpy import env
from arcpy.sa import *

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Overwrite output
env.overwriteOutput = 1

# Set environment settings
env.workspace = r'C:\temp'
Dir = env.workspace

# Set local variables
inRaster = Dir + "\\" "nlcd" + "\\" + "nlcd_ak.img"
outFolder = Dir
reclassField = "Value"
remap = RemapValue([[0, 40, 0], [41, 41],[42,42], [43,43], [44, 256, 0]])

# Split Rasters
# Equally split a large TIFF image by number of images
arcpy.SplitRaster_management(inRaster, outFolder, "split", "NUMBER_OF_TILES", "#",
                             "NEAREST", "2 2", "#", "4", "PIXELS",\
                             "#", "#")

# List rasters for processing
rasters = arcpy.ListRasters()


for ras in rasters:
    print "processing..." + ras

    # Define new name
    name = "class_" + ras  

    # Execute Reclassify
    outReclassify = Reclassify(ras, reclassField, remap, "NODATA")

    # Save the output 
    outReclassify.save(Dir + "\\" + name)
Aaron
fuente
3
Desde el punto de vista del rendimiento, sería interesante probar un enfoque alternativo usando arcpy.RasterToNumPyArray () y hacer la reclasificación en numpy. Es probable que desee dividir el ráster en mosaicos de todos modos para fines de memoria, pero sé que con GDAL, volver a clasificar las matrices numpy es muy rápido.
DavidF
@DavidF De acuerdo, es probable que haya una mejora significativa en el rendimiento.
Aaron
Gracias por los consejos, Aaron. Lo ejecutaré tan pronto como termine otra solución alternativa, que parece requerir la eliminación del mapa de colores (al que se hace referencia aquí ). Este método también requiere dividir el ráster, por lo que me pregunto si Reclassify original falló debido al uso de memoria o alguna otra razón.
DoggoDougal
@torik No hay problema, estoy feliz de dar mis dos centavos. Creo que eliminar el mapa de colores no es el camino a seguir. Más bien, me enfocaría en dividir datos o en el procesamiento de fondo de 64 bits.
Aaron
@ Aaron, teniendo en cuenta que proporcionó el código para lograr el mosaico, ¿cómo creó el ráster de subconjunto que utilizó para producir los resultados ilustrados? Completé el mosaico SplitRaster (produciendo 100 subconjuntos de todo el dataset ráster) e intenté recorrerlos todos para reclasificar. La reclasificación falló, desafortunadamente, dando como resultado el mismo mensaje "Error inesperado".
DoggoDougal
4

whuber hizo un comentario sobre el uso de herramientas lógicas para expresar esta reclasificación . Después de un poco de investigación, encontré que InList , como parte del conjunto de herramientas Logical Math de Spatial Analyst, llenaba mi necesidad.

import arcpy

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")
from arcpy.sa import InList

# Pixel values of interest, named according to Table 2 of
#  http://landcover.usgs.gov/pdf/anderson.pdf
DECIDUOUS_FOREST = 41
EVERGREEN_FOREST = 42
MIXED_FOREST = 43

inRaster = r'D:\AK_NLCD_2001_land_cover_3-13-08\ak_nlcd_2001_land_cover_3-13-08_se5.img'
accepted_raster_values = [DECIDUOUS_FOREST, EVERGREEN_FOREST, MIXED_FOREST]
filteredAlaska = InList(inRaster, accepted_raster_values)
filteredAlaska.save(r'C:\alaska\ak_woods')

Es, con mucho, la solución simplista que pude encontrar, se ejecuta más rápido y no requiere considerar el mosaico del conjunto de datos original. No es necesario tener en cuenta la RAM disponible de la máquina, ya que esta herramienta leerá directamente desde el disco y almacenará los resultados directamente en el disco.

Resultado filtrado de Alaska usando InList

DoggoDougal
fuente
+1 Bien hecho y una gran solución. Por curiosidad, ¿cuánto tiempo llevó el procesamiento?
Aaron
@ Aaron, procesar toda Alaska lleva 13 minutos y 23,4 segundos. El subconjunto de muestra , que es uno de los 100 subconjuntos de igual tamaño creados por SplitRaster_management, toma 7.04 segundos.
DoggoDougal
Interesante, aproximadamente los mismos tiempos de procesamiento entre los dos métodos (es decir, suponiendo que estuviéramos ejecutando sistemas similares).
Aaron
Tengo un Intel Core 2 Duo E6850 @ 3 Ghz, 4 GB de RAM, con Windows 7. de 64 bits. En breve analizaré su solución. Estoy atascado con Arc 10.0 por el momento, de lo contrario investigaría el procesamiento de fondo de 64 bits.
DoggoDougal
1

He usado el conjunto de datos mencionado en la publicación original con una versión de desarrollo 10.4 de arcmap. La reclasificación falla cuando el ráster de salida es una cuadrícula, porque los recuentos de celdas reclasificadas están desbordando lo que se puede almacenar en el campo COUNT de un IVA de cuadrícula. Cuando el ráster de salida es un fgdb, se ejecuta con éxito para mí en aproximadamente 11 minutos en una máquina de 4 núcleos más antigua que ejecuta Windows 8. Los formatos de ráster sin cuadrícula deberían funcionar ya que usan valores flotantes de precisión doble para el campo de recuento. Espero que deba tener el mismo comportamiento con las versiones 10.2 o 10.3 lanzadas. Investigaremos usando un formato ráster diferente para la salida predeterminada para Reclassify.

jt64
fuente