Comment reclasser un très grand ensemble de données sur la couverture terrestre?

10

Considérez l'ensemble de données sur la couverture terrestre NLCD2001 pour l'Alaska ( lien de téléchargement ). J'ai besoin de reclasser cet ensemble de données afin que seuls les pixels de valeur 41, 42 et 43 soient conservés; toutes les autres valeurs de pixels doivent devenir NoData (ou 0, si nécessaire).

Cela semble être une tâche simple, ne nécessitant qu'un seul appel à l'outil Reclassifier. Malheureusement, chaque appel entraîne un message d'erreur vague et 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)

Comment reclasser ce jeu de données raster? J'utilise ArcCatalog 10.0, Build 4000, avec l'extension Spatial Analyst activée.

DoggoDougal
la source
L'extrait par attributs semble également faire ce dont j'ai besoin, mais entraîne malheureusement une autre "erreur inattendue".
DoggoDougal
Vous avez peut-être essayé un autre ensemble de données? Deux processus qui échouent sur le même ensemble de données vous font vous demander ...
Chad Cooper
2
Habituellement, reclassifydevrait être un dernier recours, car il est d'une portée si générale qu'il utilise probablement des méthodes moins efficaces que celles qui peuvent être obtenues lorsque le reclassement est facile à exprimer de manière arithmétique ou logique. Dans le cas présent, le critère de reclassement est si simple que vous devez d'abord l'essayer avec Conou même des opérations arithmétiques droites (car elles sont rapides). Par exemple, "grid" * ("grid" >= 41) * ("grid" <= 43)devrait le faire. La RAM ne devrait pas être un problème - Spatial Analyst Windows automatiquement ses E / S raster et ce sont des opérations locales.
whuber
1
Inlistest une bonne solution (+1). J'ai pu utiliser conet surveiller l'utilisation de la RAM pendant l'opération. Il n'a jamais dépassé 180 Mo, ce qui est à peine supérieur à la RAM utilisée juste pour lancer ArcMap. La mosaïque dans ArcGIS est automatique - vous ne pouvez même pas le contrôler (sauf si vous programmez vers l'interface C / Fortran). Il semble que les limitations de la RAM soient peu préoccupantes.
whuber
1
@whuber, a aussi confonctionné pour moi, avec la condition "Value" >= 41 AND "Value" <= 43. J'aurais opté pour cette solution, mais je ne sais pas si des valeurs raster supplémentaires seront intéressantes à l'avenir. Évidemment, je pourrais ajouter un ORdans la clause where, mais cela commence à devenir plus compliqué. InListsemble la solution la plus simple en termes de lisibilité et de maintenabilité.
DoggoDougal

Réponses:

9

Le premier script joint a reclassé avec succès vos données AK NLCD en environ 15 minutes (i7, machine de 12 Go de RAM). Étant donné que l'ensemble de données d'origine mesure près de 7 Go, vous pouvez rencontrer des problèmes de mémoire. Si vous ne pouvez pas traiter l'intégralité de l'ensemble de données en un seul bloc, essayez de le fractionner avec le deuxième script avant la reclassification. Ma recommandation est de prendre un petit sous-ensemble des données (Couche raster clic droit dans Table des matières> Données> Exporter les données> Étendue (trame de données) et tester le premier script. Une fois que vous avez composé les paramètres de la commande reclassifier, puis passer à la reclassification l'ensemble des données ou le fractionner. Sinon, essayez de télécharger le produit de géotraitement en arrière-plan 64 bits pour ArcGIS 10.1 SP1, disponible ici . Bonne chance.

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

Modifier : si vous devez diviser vos données avant le traitement, ce script devrait vous aider:

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)
Aaron
la source
3
Du point de vue des performances, il serait intéressant d'essayer une approche alternative en utilisant arcpy.RasterToNumPyArray () et de faire la reclassification dans numpy. Vous voudrez probablement diviser le raster en tuiles de toute façon à des fins de mémoire, mais je sais qu'avec GDAL, le reclassement des tableaux numpy est très rapide.
DavidF
@DavidF D'accord, il y aurait probablement une amélioration significative des performances.
Aaron
Merci pour les conseils, Aaron. Je lui donnerai une course dès que j'aurai terminé une autre solution de contournement, qui semble nécessiter la suppression de la palette de couleurs ( référencée ici ). Cette méthode nécessite également le fractionnement du raster, donc je me demande si Reclassifier l'original a échoué en raison de l'utilisation de la mémoire ou d'une autre raison.
DoggoDougal
@torik Pas de problème - je suis heureux de donner mes deux cents. Je pense que la suppression de la carte couleur n'est pas la voie à suivre. Je me concentrerais plutôt sur le fractionnement des données ou le traitement en arrière-plan 64 bits.
Aaron
@Aaron, sachant que vous avez fourni du code pour effectuer le tuilage, comment avez-vous créé le raster de sous-ensemble que vous avez utilisé pour produire les résultats illustrés? J'ai terminé la mosaïque SplitRaster (produisant 100 sous-ensembles de l'ensemble de données raster) et j'ai tenté de les parcourir tous pour reclassifier. La reclassification a échoué, malheureusement, entraînant le même message "Erreur inattendue".
DoggoDougal
4

whuber a fait un commentaire concernant l'utilisation d'outils logiques pour exprimer ce reclassement . Après avoir creusé un peu, j'ai trouvé InList , dans le cadre du jeu d'outils Logical Math de Spatial Analyst, qui répondait à mes besoins.

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

C'est de loin la solution la plus simple que j'ai pu trouver, s'exécute le plus rapidement et ne nécessite aucune considération de la mosaïque de l'ensemble de données d'origine. Il n'est pas nécessaire de considérer la RAM disponible de la machine, car cet outil lira directement à partir du disque et stockera les résultats directement sur le disque.

Résultat filtré de l'Alaska à l'aide d'InList

DoggoDougal
la source
+1 Bien joué et une excellente solution. Par curiosité, combien de temps a duré le traitement?
Aaron
@Aaron, le traitement de l'ensemble de l'Alaska prend 13 minutes et 23,4 secondes. L' exemple de sous - ensemble , qui est l'un des 100 sous-ensembles de taille égale créés par SplitRaster_management, prend 7,04 secondes.
DoggoDougal
Intéressant, à peu près les mêmes temps de traitement entre les deux méthodes (c'est-à-dire en supposant que nous utilisions des systèmes similaires).
Aaron
J'ai un Intel Core 2 Duo E6850 @ 3 Ghz, 4 Go de RAM, exécutant Windows 7 64 bits. Je ferai une analyse temporelle de votre solution sous peu. Je suis bloqué avec Arc 10.0 pour le moment, sinon j'examinerais le traitement en arrière-plan 64 bits.
DoggoDougal
1

J'ai utilisé l'ensemble de données mentionné dans la publication d'origine avec une version 10,4 dev de arcmap. La reclassification échoue lorsque le raster en sortie est une grille, car le nombre de cellules reclassées déborde de ce qui peut être stocké dans le champ COUNT d'une grille TVA. Lorsque le raster en sortie est un fgdb, il s'exécute avec succès en environ 11 minutes sur une ancienne machine à 4 cœurs exécutant Windows 8. Les formats raster non-grille devraient fonctionner car ils utilisent des valeurs flottantes double précision pour le champ de comptage. Je pense que vous devriez obtenir le même comportement avec les versions 10.2 ou 10.3. Nous étudierons l'utilisation d'un format raster différent pour la sortie par défaut de Reclassification.

jt64
la source