매우 큰 토지 표지 데이터 세트를 다시 분류하는 방법은 무엇입니까?


10

알래스카에 대한 NLCD2001 랜드 커버 데이터 세트를 고려하십시오 ( 다운로드 링크 ). 41, 42 및 43 값의 픽셀 만 보존되도록이 데이터 세트를 다시 분류해야합니다. 다른 모든 픽셀 값은 NoData가되어야합니다 (또는 필요한 경우 0).

이것은 간단한 작업처럼 보이며 재 분류 도구를 한 번만 호출하면됩니다. 불행히도 모든 호출은 모호하고 도움이되지 않는 오류 메시지를 발생시킵니다.

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)

이 래스터 데이터 세트를 다시 분류하려면 어떻게해야합니까? Spatial Analyst 확장이 활성화 된 ArcCatalog 10.0, Build 4000을 사용하고 있습니다.


속성 별 추출 도 필요한 작업을 수행하는 것으로 보이지만 불행히도 다른 "예기치 않은 오류"가 발생합니다.
DoggoDougal

다른 데이터 세트를 사용해 보셨습니까? 동일한 데이터 세트에서 실패하는 두 가지 프로세스는 나중에 궁금해합니다.
Chad Cooper

2
일반적 reclassify으로 범위가 너무 일반적이기 때문에 재 분류가 산술적으로나 논리적으로 표현하기 쉬운 경우에 비해 덜 효율적인 방법을 사용할 수 있기 때문에 일반적 으로 최후의 수단이되어야합니다. 현재의 경우, 재 분류에 대한 기준은 매우 간단하므로 먼저 Con빠른 산술 연산을 사용 하거나 직접 산술 연산 을 시도해야 합니다. 예를 들어 "grid" * ("grid" >= 41) * ("grid" <= 43)그렇게해야합니다. RAM은 문제가되지 않아야합니다 .Spatial Analyst는 자동으로 래스터 I / O를 창으로 표시하며 로컬 작업입니다.
whuber

1
Inlist좋은 해결책입니다 (+1). con작업 중에 RAM 사용량 을 사용 하고 모니터링 할 수있었습니다 . 180MB를 초과하지 않았으며 ArcMap을 시작하는 데 사용 된 RAM보다 훨씬 큽니다. ArcGIS의 타일링은 자동으로 제어 할 수 없습니다 (C / Fortran 인터페이스로 프로그래밍하지 않는 한). RAM 제한은 거의 관심이없는 것으로 보입니다.
whuber

1
@ whuber, con조건으로 저를 위해 일했습니다 "Value" >= 41 AND "Value" <= 43. 이 솔루션을 사용했을 수도 있지만 향후 추가 래스터 값이 관심이 있는지 확실하지 않습니다. 분명히 ORwhere 절에를 추가 할 수는 있지만 더 복잡해지기 시작합니다. InList가독성 및 유지 관리 성과 관련하여 가장 간단한 솔루션 인 것 같습니다.
DoggoDougal

답변:


9

첫 번째 첨부 스크립트는 약 15 분 (i7, 12GB RAM 시스템)으로 AK NLCD 데이터를 성공적으로 재 분류했습니다. 원래 데이터 세트가 거의 7GB이므로 메모리 문제가 발생할 수 있습니다. 한 청크로 전체 데이터 세트를 처리 할 수없는 경우 재 분류 전에 두 번째 스크립트로 분할하십시오. 권장 사항은 데이터의 작은 하위 집합 (TOC> 데이터> 데이터 내보내기> 익스텐트 (데이터 프레임)에서 래스터 레이어를 마우스 오른쪽 단추로 클릭하고 첫 번째 스크립트를 테스트하는 것입니다. 또는 전체 데이터 세트 또는 분할 또는 ArcGIS 10.1 SP1 용 64 비트 백그라운드 지오 프로세싱 제품을 여기 에서 다운로드 하십시오 .

스크립트 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")

편집 : 처리하기 전에 데이터를 분할해야하는 경우이 스크립트가 도움이됩니다.

스크립트 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
성능 관점에서 arcpy.RasterToNumPyArray ()를 사용하여 대체 방법을 시도하고 numpy에서 다시 클래스를 작성하는 것이 흥미로울 것입니다. 어쨌든 메모리 목적으로 래스터를 타일로 나누고 싶을 수도 있지만 GDAL을 사용하면 numpy 배열을 다시 분류하는 것이 매우 빠릅니다.
DavidF

@DavidF 동의합니다. 성능이 크게 향상 될 수 있습니다.
Aaron

팁 주셔서 감사합니다, Aaron. 다른 해결 방법을 완료하자마자 색상 표를 제거 해야하는 것처럼 보입니다 ( 여기 참조 ). 이 방법은 래스터 분할도 필요하므로 메모리 사용 또는 다른 이유로 인해 원본 재 분류에 실패했는지 궁금합니다.
DoggoDougal

@torik 문제 없습니다-저는 2 센트를 드리겠습니다. 컬러 맵을 제거하는 것은 좋은 방법이 아니라고 생각합니다. 오히려 데이터 분할 또는 64 비트 백그라운드 처리에 중점을 둘 것입니다.
Aaron

@Aaron, 타일링을 수행하기위한 코드를 제공했다는 점을 염두에두고 그림 결과를 생성하는 데 사용한 하위 집합 래스터를 어떻게 만들었습니까? SplitRaster 타일링을 완료하고 (전체 래스터 데이터 세트의 100 개 하위 세트 생성) 다시 분류하기 위해 모두 반복하려고했습니다. 불행히도 재 분류에 실패하여 동일한 "예기치 않은 오류"메시지가 나타납니다.
DoggoDougal

4

whuber는 이러한 재 분류를 표현하기 위해 논리적 도구의 사용에 관해 의견을 남겼습니다 . 약간의 파기 끝에 Spatial Analyst의 Logical Math 도구 세트의 일부로 InList가 내 필요를 채웠다는 것을 알았습니다 .

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

지금까지 내가 찾을 수있는 단순한 솔루션이며, 가장 빠르게 실행되며, 원래 데이터 세트를 타일링 할 필요가 없습니다. 이 도구는 디스크에서 직접 읽고 결과를 디스크에 바로 저장하므로 머신의 사용 가능한 RAM을 고려할 필요가 없습니다.

InList를 사용하여 필터링 된 알래스카 결과


+1 훌륭하고 훌륭한 솔루션. 호기심으로 처리하는 데 시간이 얼마나 걸렸습니까?
Aaron

@Aaron, 알래스카 전체를 처리하는 데 13 분 23.4 초가 소요됩니다. 에 의해 생성 된 100 개의 동일한 크기의 하위 집합 중 하나 인 샘플 하위 집합SplitRaster_management 은 7.04 초가 소요됩니다.
DoggoDougal

흥미롭게도 두 방법 사이의 처리 시간은 거의 같습니다 (예 : 유사한 시스템을 실행한다고 가정).
Aaron

64 비트 Windows 7을 실행하는 Intel Core 2 Duo E6850 @ 3Ghz, 4GB RAM이 있습니다. 솔루션의 타이밍 분석을 곧 수행하겠습니다. 나는 당분간 Arc 10.0에 갇혀있다. 그렇지 않으면 64 비트 백그라운드 처리를 조사 할 것이다.
DoggoDougal

1

원래 게시물에 언급 된 데이터 세트를 10.4 dev 버전의 arcmap으로 사용했습니다. 재 분류 된 셀 수가 그리드 VAT의 COUNT 필드에 저장할 수있는 용량을 초과하여 출력 래스터가 그리드 인 경우 재 분류가 실패합니다. 출력 래스터가 fgdb 인 경우 Windows 8을 실행하는 이전 4 코어 시스템에서 약 11 분 안에 성공적으로 실행됩니다. 비 그리드 래스터 형식은 개수 필드에 배정도 부동 값을 사용하므로 작동해야합니다. 10.2 또는 10.3 릴리스 버전과 동일한 동작을 수행해야합니다. Reclassify의 기본 출력에 다른 래스터 형식을 사용하여 조사 할 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.