Jak przeklasyfikować bardzo duży zestaw danych dotyczących pokrycia terenu?


10

Zastanów się nad zestawem danych dotyczących pokrycia terenu NLCD2001 dla Alaski ( link do pobrania ). Muszę przeklasyfikować ten zestaw danych, aby zachowane były tylko piksele o wartości 41, 42 i 43; wszystkie pozostałe wartości w pikselach powinny stać się NoData (lub 0, jeśli to konieczne).

To wydaje się prostym zadaniem, wymagającym tylko jednego połączenia z narzędziem Przeklasyfikowania. Niestety każde połączenie powoduje niejasny i nieprzydatny komunikat o błędzie:

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)

Jak mogę zmienić klasyfikację tego zestawu danych rastrowych? Korzystam z ArcCatalog 10.0, Build 4000, z włączonym rozszerzeniem Spatial Analyst.


Wydaje się, że wyodrębnianie według atrybutów również robi to, czego potrzebuję, ale niestety powoduje kolejny „Nieoczekiwany błąd”.
DoggoDougal,

Może spróbowałeś innego zestawu danych? Dwa procesy, które zawodzą w tym samym zbiorze danych, powodują, że zastanawiasz się ...
Chad Cooper

2
Zwykle reclassifypowinno to być ostatecznością, ponieważ ma tak ogólny zakres, że prawdopodobnie wykorzystuje metody, które są mniej wydajne niż te, które można uzyskać, gdy przeklasyfikowanie łatwo wyrazić arytmetycznie lub logicznie. W niniejszej sprawie kryterium przeklasyfikowania jest tak proste, że najpierw należy wypróbować je, Cona nawet proste operacje arytmetyczne (ponieważ są one szybkie). Na przykład "grid" * ("grid" >= 41) * ("grid" <= 43)powinien to zrobić. Pamięć RAM nie powinna stanowić problemu - Spatial Analyst automatycznie wyświetla okna we / wy rastrowych i są to operacje lokalne.
whuber

1
Inlistto fajne rozwiązanie (+1). Byłem w stanie używać coni monitorować użycie pamięci RAM podczas operacji. Nigdy nie przekroczył 180 MB, czyli niewiele więcej niż pamięć RAM używana tylko do uruchomienia ArcMap. Kafelkowanie w ArcGIS jest automatyczne - nawet nie możesz go kontrolować (chyba że programujesz w interfejsie C / Fortran). Wygląda na to, że ograniczenia pamięci RAM nie mają większego znaczenia.
whuber

1
@ whuber, również condla mnie pracował, pod warunkiem "Value" >= 41 AND "Value" <= 43. Wybrałbym to rozwiązanie, ale nie jestem pewien, czy dodatkowe wartości rastrowe będą w przyszłości interesujące. Oczywiście mógłbym dodać ORdo klauzuli where, ale potem zaczyna się to komplikować. InListwydaje się najprostszym rozwiązaniem w zakresie czytelności i łatwości konserwacji.
DoggoDougal,

Odpowiedzi:


9

Pierwszy dołączony skrypt pomyślnie przeklasyfikował dane AK NLCD w ciągu około 15 minut (i7, 12 GB pamięci RAM). Ponieważ oryginalny zestaw danych ma prawie 7 GB, możesz mieć problemy z pamięcią. Jeśli nie możesz przetworzyć całego zestawu danych w jednym fragmencie, spróbuj podzielić go na drugi skrypt przed przeklasyfikowaniem. Polecam wziąć niewielki podzbiór danych (kliknij prawym przyciskiem myszy warstwę rastrową w Spisie treści> Dane> Eksportuj dane> Rozszerz (ramka danych) i przetestuj pierwszy skrypt. Po wybraniu parametrów polecenia przeklasyfikowania, przejdź do przeklasyfikowania cały zestaw danych lub jego podział. Alternatywnie spróbuj pobrać 64-bitowy produkt Geoprocessing w tle dla ArcGIS 10.1 SP1, dostępny tutaj . Powodzenia.

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

Edycja : jeśli musisz podzielić swoje dane przed przetwarzaniem, ten skrypt powinien pomóc:

Skrypt 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
Z punktu widzenia wydajności byłoby interesujące wypróbować alternatywne podejście za pomocą arcpy.RasterToNumPyArray () i dokonać przeklasyfikowania w numpy. Prawdopodobnie zechcesz podzielić raster na kafelki dla celów pamięci, ale wiem, że dzięki GDAL przeklasyfikowanie tablic numpy jest bardzo szybkie.
DavidF

@DavidF Zgoda, prawdopodobnie nastąpiłaby znaczna poprawa wydajności.
Aaron

Dziękuję za wskazówki, Aaron. Przeanalizuję go, jak tylko skończę kolejne obejście, które wydaje się wymagać usunięcia mapy kolorów ( o której tu mowa ). Ta metoda wymaga również podziału rastra, więc zastanawiam się, czy przeklasyfikowanie oryginału nie powiodło się z powodu użycia pamięci lub z innego powodu.
DoggoDougal

@torik Nie ma problemu - cieszę się, że mogę dać dwa centy. Myślę, że usunięcie mapy kolorów nie jest dobrym rozwiązaniem. Skoncentrowałbym się raczej na dzieleniu danych lub 64-bitowym przetwarzaniu tła.
Aaron

@Aaron, pamiętając, że dostarczyłeś kod do wykonania kafelkowania, w jaki sposób stworzyłeś podzbiór rastra, którego użyłeś do wygenerowania przedstawionych wyników? Ukończyłem kafelkowanie SplitRaster (tworząc 100 podzbiorów całego zestawu danych rastrowych) i próbowałem przejrzeć je wszystkie w celu przeklasyfikowania. Zmiana klasyfikacji nie powiodła się, niestety, powodując pojawienie się tego samego komunikatu „Nieoczekiwany błąd”.
DoggoDougal

4

whuber skomentował użycie narzędzi logicznych do wyrażenia tej przeklasyfikowania . Po krótkim kopaniu znalazłem InList , jako część zestawu narzędzi Logical Math programu Spatial Analyst, który spełnił moją potrzebę.

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

Jest to zdecydowanie najprostsze rozwiązanie, jakie udało mi się znaleźć, działa najszybciej i nie wymaga uwzględnienia oryginalnego zestawu danych. Nie ma potrzeby rozważania dostępnej pamięci RAM maszyny, ponieważ to narzędzie będzie czytać bezpośrednio z dysku i zapisywać wyniki z powrotem na dysku.

Filtrowany wynik na Alasce za pomocą InList


+1 Dobra robota i świetne rozwiązanie. Z ciekawości, jak długo trwało przetwarzanie?
Aaron

@Aaron, przetwarzanie całej Alaski zajmuje 13 minut i 23,4 sekundy. Podzbioru próbki , który jest jednym ze 100 o identycznej wielkości podzbiorów przez SplitRaster_managementbierze 7,04 sekundy.
DoggoDougal,

Interesujące, mniej więcej takie same czasy przetwarzania między dwiema metodami (tj. Zakładając, że działaliśmy na podobnych systemach).
Aaron

Mam procesor Intel Core 2 Duo E6850 @ 3 Ghz, 4 GB pamięci RAM, działający pod kontrolą 64-bitowego systemu Windows 7. Wkrótce dokonam analizy czasowej twojego rozwiązania. Na razie utknąłem z Arc 10.0, w przeciwnym razie zbadałbym 64-bitowe przetwarzanie w tle.
DoggoDougal

1

Użyłem zestawu danych wspomnianego w oryginalnym poście z wersją arcmap w wersji 10.4 dev. Przeklasyfikowanie kończy się niepowodzeniem, gdy wyjściowym rastrem jest siatka, ponieważ liczba przeklasyfikowanych komórek jest przepełniona, co można zapisać w polu COUNT podatku VAT od siatki. Kiedy wyjściowy raster jest fgdb, wykonuje się dla mnie z powodzeniem za około 11 minut na starszym 4-rdzeniowym komputerze z systemem Windows 8. Nie-gridowe formaty rastrowe powinny działać, ponieważ używają zmiennoprzecinkowych wartości podwójnej precyzji dla pola zliczania. Oczekuję, że powinieneś uzyskać takie samo zachowanie w wersjach wydanych 10.2 lub 10.3. Zbadamy użycie innego formatu rastrowego jako domyślnego wyjścia dla Przeklasyfikowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.