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.