Come riclassificare un set di dati di copertura del suolo molto grande?


10

Considera il set di dati NLCD2001 Land Cover per l'Alaska ( link per il download ). Devo riclassificare questo set di dati in modo che vengano conservati solo i pixel con valore 41, 42 e 43; tutti gli altri valori di pixel dovrebbero diventare NoData (o 0, se necessario).

Sembra un'attività semplice, che richiede solo una chiamata allo strumento Ricodifica. Sfortunatamente, ogni chiamata genera un messaggio di errore vago e inutile:

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)

Come posso fare per riclassificare questo set di dati raster? Sto usando ArcCatalog 10.0, Build 4000, con l'estensione Analista spaziale abilitata.


L'estrazione per attributi sembra fare anche ciò di cui ho bisogno, ma sfortunatamente si traduce in un altro "errore imprevisto".
DoggoDougal,

Hai provato un altro set di dati forse? Due processi che falliscono nello stesso set di dati ti fanno meravigliare ...
Chad Cooper

2
Di solito, reclassifydovrebbe essere l'ultima risorsa, perché ha una portata così generale che probabilmente utilizza metodi meno efficienti di quelli che si possono ottenere quando la riclassificazione è facile da esprimere in modo aritmetico o logico. Nel caso presente, il criterio per la riclassificazione è così semplice che dovresti prima provare con Cono anche semplici operazioni aritmetiche (perché sono veloci). Ad esempio, "grid" * ("grid" >= 41) * ("grid" <= 43)dovrebbe farlo. La RAM non dovrebbe essere un problema: Spatial Analyst esegue automaticamente il windows I / O raster e queste sono operazioni locali.
whuber

1
Inlistè una bella soluzione (+1). Sono stato in grado di utilizzare cone monitorare l'utilizzo della RAM durante l'operazione. Non ha mai superato i 180 MB, che è appena maggiore della RAM utilizzata solo per avviare ArcMap. La piastrellatura in ArcGIS è automatica : non è nemmeno possibile controllarla (a meno che non si stia programmando l'interfaccia C / Fortran). Sembra che le limitazioni della RAM siano di scarsa preoccupazione.
whuber

1
@whuber, ha confunzionato anche per me, a condizione "Value" >= 41 AND "Value" <= 43. Sarei andato con questa soluzione, ma non sono sicuro se ulteriori valori raster saranno di interesse in futuro. Ovviamente potrei aggiungere un ORnella clausola where, ma poi inizia a diventare più complicato. InListsembra la soluzione più diretta in termini di leggibilità e manutenibilità.
DoggoDougal,

Risposte:


9

Il primo script allegato ha riclassificato correttamente i dati AK NLCD in circa 15 minuti (i7, macchina da 12 GB di RAM). Poiché il set di dati originale è quasi 7 GB, potresti riscontrare problemi di memoria. Se non è possibile elaborare l'intero set di dati in un blocco, provare a suddividerlo con il secondo script prima della riclassificazione. La mia raccomandazione è di prendere un piccolo sottoinsieme dei dati (fare clic con il pulsante destro del mouse sul livello raster in TOC> Dati> Esporta dati> Estensione (Frame dati) e testare il primo script. Dopo aver composto i parametri per il comando riclassifica, si passa alla riclassificazione l'intero set di dati o suddividendolo. In alternativa, prova a scaricare il prodotto Geoprocessing in background a 64 bit per ArcGIS 10.1 SP1, disponibile qui . Buona fortuna.

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")

Modifica : se è necessario suddividere i dati prima dell'elaborazione, questo script dovrebbe aiutare:

Script 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)

3
Dal punto di vista delle prestazioni, sarebbe interessante provare un approccio alternativo usando arcpy.RasterToNumPyArray () ed eseguire la riclassificazione in numpy. Probabilmente vorrai comunque dividere il raster in riquadri per motivi di memoria, ma so che con GDAL, riclassificare gli array intorpiditi è molto veloce.
DavidF,

@DavidF D'accordo, probabilmente ci sarebbe un significativo miglioramento delle prestazioni.
Aaron

Grazie per i suggerimenti, Aaron. Lo eseguirò non appena avrò finito un'altra soluzione, che sembra richiedere la rimozione della mappa dei colori ( indicata qui ). Questo metodo richiede anche la suddivisione del raster, quindi mi chiedo se la riclassificazione dell'originale non è riuscita a causa dell'utilizzo della memoria o di altri motivi.
DoggoDougal,

@torik Nessun problema - Sono felice di dare i miei due centesimi. Penso che rimuovere la mappa dei colori non sia la strada da percorrere. Piuttosto, mi concentrerei sulla divisione dei dati o sull'elaborazione in background a 64 bit.
Aaron

@Aaron, tenendo presente che hai fornito il codice per eseguire la piastrellatura, come hai creato il sottoinsieme raster che hai usato per produrre i risultati illustrati? Ho completato la piastrellatura SplitRaster (producendo 100 sottoinsiemi dell'intero set di dati raster) e ho tentato di ricircolarli tutti per riclassificarli. La riclassificazione non è riuscita, sfortunatamente, con lo stesso messaggio "Errore imprevisto".
DoggoDougal,

4

whuber ha commentato l'uso di strumenti logici per esprimere questa riclassificazione . Dopo un po 'di ricerche , ho trovato InList , come parte del set di strumenti di Logical Math di Spatial Analyst, riempito il mio bisogno.

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')

È di gran lunga la soluzione più semplice che sono riuscito a trovare, esegue il più veloce e non richiede di considerare la piastrellatura del set di dati originale. Non è necessario considerare la RAM disponibile della macchina, poiché questo strumento leggerà direttamente dal disco e memorizzerà i risultati direttamente sul disco.

Risultato dell'Alaska filtrato usando InList


+1 Ben fatto e un'ottima soluzione. Per curiosità, quanto tempo ha richiesto l'elaborazione?
Aaron

@Aaron, l'elaborazione di tutto l'Alaska richiede 13 minuti e 23,4 secondi. Il sottoinsieme di esempio , che è uno dei 100 sottoinsiemi di dimensioni uguali creati da SplitRaster_management, richiede 7,04 secondi.
DoggoDougal,

Interessanti, all'incirca gli stessi tempi di elaborazione tra i due metodi (ovvero supponendo che stessimo eseguendo sistemi simili).
Aaron

Ho un Intel Core 2 Duo E6850 a 3 Ghz, 4 GB di RAM, con Windows a 64 bit a 7. A breve farò un'analisi della tempistica della tua soluzione. Sono bloccato con Arc 10.0 per il momento, altrimenti avrei studiato l'elaborazione in background a 64 bit.
DoggoDougal,

1

Ho usato il set di dati menzionato nel post originale con una versione 10.4 dev di arcmap. La riclassificazione non riesce quando il raster di output è una griglia, poiché i conteggi di celle riclassificati stanno traboccando ciò che può essere memorizzato nel campo COUNT di un'IVA di griglia. Quando l'output raster è un fgdb, viene eseguito correttamente per me in circa 11 minuti su un vecchio computer a 4 core che esegue Windows 8. I formati raster non grid dovrebbero funzionare poiché utilizzano valori flottanti a doppia precisione per il campo di conteggio. Mi aspetto che tu abbia lo stesso comportamento con le versioni 10.2 o 10.3 rilasciate. Esamineremo utilizzando un formato raster diverso per l'output predefinito per Reclassify.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.