Làm thế nào để phân loại lại một tập dữ liệu đất rất lớn?


10

Hãy xem xét bộ dữ liệu NLCD2001 Land Cover cho Alaska ( liên kết tải xuống ). Tôi cần phân loại lại tập dữ liệu này để chỉ các pixel có giá trị 41, 42 và 43 được giữ nguyên; tất cả các giá trị pixel khác sẽ trở thành NoData (hoặc 0, nếu cần).

Đây có vẻ như là một nhiệm vụ đơn giản, chỉ yêu cầu một cuộc gọi đến công cụ Reclassify. Thật không may, mọi cuộc gọi đều dẫn đến một thông báo lỗi mơ hồ và không có ích:

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)

Làm thế nào tôi có thể đi phân loại lại bộ dữ liệu raster này? Tôi đang sử dụng ArcCatalog 10.0, Build 4000, với tiện ích mở rộng Spatial Analyst được bật.


Trích xuất bởi các thuộc tính dường như cũng làm những gì tôi cần, nhưng không may dẫn đến một "Lỗi không mong muốn" khác.
DoggoDougal

Đã thử dữ liệu khác có thể? Hai quá trình thất bại trên cùng một tập dữ liệu khiến bạn ngạc nhiên ...
Chad Cooper

2
Thông thường, reclassifynên là giải pháp cuối cùng, bởi vì nó có phạm vi chung đến mức nó có thể sử dụng các phương pháp kém hiệu quả hơn có thể đạt được khi phân loại lại dễ dàng diễn đạt một cách hợp lý hoặc hợp lý. Trong trường hợp hiện tại, tiêu chí phân loại lại rất đơn giản, trước tiên bạn nên thử nó với Conhoặc thậm chí các thao tác số học thẳng (vì chúng nhanh). Ví dụ, "grid" * ("grid" >= 41) * ("grid" <= 43)nên làm điều đó. RAM không phải là một vấn đề - Nhà phân tích không gian tự động cửa sổ I / O raster của nó và đây là những hoạt động cục bộ.
whuber

1
Inlistlà một giải pháp tốt đẹp (+1). Tôi đã có thể sử dụng convà theo dõi việc sử dụng RAM trong quá trình hoạt động. Nó không bao giờ vượt quá 180 MB, tức là lớn hơn RAM được sử dụng chỉ để khởi chạy ArcMap. Việc ốp lát trong ArcGIS là tự động - thậm chí bạn không được điều khiển nó (trừ khi bạn đang lập trình với giao diện C / Fortran). Có vẻ như các hạn chế RAM là ít quan tâm.
whuber

1
@whuber, conlàm việc cho tôi là tốt, với điều kiện "Value" >= 41 AND "Value" <= 43. Tôi đã đi với giải pháp này, nhưng tôi không chắc liệu các giá trị raster bổ sung sẽ được quan tâm trong tương lai hay không. Rõ ràng tôi có thể thêm một ORvào mệnh đề where, nhưng sau đó nó bắt đầu trở nên phức tạp hơn. InListdường như là giải pháp đơn giản nhất liên quan đến khả năng đọc và bảo trì.
DoggoDougal

Câu trả lời:


9

Tập lệnh đính kèm đầu tiên phân loại lại thành công dữ liệu AK NLCD của bạn trong khoảng 15 phút (i7, máy RAM 12GB). Vì bộ dữ liệu ban đầu là gần 7GB, bạn có thể gặp phải các vấn đề về bộ nhớ. Nếu bạn không thể xử lý toàn bộ tập dữ liệu trong một đoạn, hãy thử chia nhỏ nó với tập lệnh thứ hai trước khi phân loại lại. Đề nghị của tôi là lấy một tập hợp con dữ liệu nhỏ (Lớp raster nhấp chuột phải trong TOC> Dữ liệu> Xuất dữ liệu> Mức độ mở rộng (Khung dữ liệu) và kiểm tra tập lệnh đầu tiên. Sau khi bạn quay số trong tham số cho lệnh phân loại lại Ngoài ra, hãy thử tải xuống sản phẩm Xử lý địa lý nền 64 bit cho ArcGIS 10.1 SP1, có sẵn tại đây .

Kịch bản 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")

Chỉnh sửa : Nếu bạn cần chia dữ liệu của mình trước khi xử lý, tập lệnh này sẽ giúp:

Kịch bản 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
Từ quan điểm hiệu suất, sẽ rất thú vị khi thử một cách tiếp cận khác bằng cách sử dụng arcpy.RasterToNumPyArray () và thực hiện reclass trong numpy. Bạn có thể muốn chia raster thành các ô dù cho mục đích bộ nhớ, nhưng tôi biết rằng với GDAL, việc phân loại lại các mảng numpy rất nhanh.
DavidF

@DavidF Đồng ý, có khả năng sẽ có sự cải thiện đáng kể về hiệu suất.
Aaron

Cảm ơn bạn cho lời khuyên, Aaron. Tôi sẽ cho nó chạy ngay khi tôi hoàn thành một cách giải quyết khác, dường như yêu cầu xóa bản đồ màu ( tham khảo tại đây ). Phương pháp này cũng yêu cầu chia raster, vì vậy nó khiến tôi tự hỏi liệu Reclassify ban đầu có bị lỗi do sử dụng bộ nhớ hay một số lý do khác.
DoggoDougal

@torik Không có vấn đề gì - Tôi rất vui khi đưa hai xu của mình. Tôi nghĩ rằng loại bỏ bản đồ màu không phải là cách để đi. Thay vào đó, tôi sẽ tập trung vào việc tách dữ liệu hoặc xử lý nền 64 bit.
Aaron

@Aaron, hãy nhớ rằng bạn đã cung cấp mã để hoàn thành việc ốp lát, làm thế nào bạn tạo ra tập hợp con raster mà bạn đã sử dụng để tạo ra kết quả như hình? Tôi đã hoàn thành việc phân chia SplitRaster (tạo ra 100 tập hợp con của toàn bộ tập dữ liệu raster) và cố gắng lặp lại tất cả chúng để phân loại lại. Thật không may, việc phân loại lại không thành công, dẫn đến cùng một thông báo "Lỗi không mong muốn".
DoggoDougal

4

whuber đã bình luận về việc sử dụng các công cụ logic để thể hiện sự phân loại lại này . Sau khi đào bới một chút, tôi thấy InList , như một phần của bộ công cụ Toán học logic của Nhà phân tích không gian, đáp ứng nhu cầu của tôi.

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

Đó là giải pháp đơn giản mà tôi có thể tìm thấy, thực hiện nhanh nhất và không yêu cầu xem xét việc sắp xếp bộ dữ liệu gốc. Không cần phải xem xét RAM có sẵn của máy, vì công cụ này sẽ đọc trực tiếp từ đĩa và lưu trữ kết quả ngay trên đĩa.

Đã lọc kết quả Alaska bằng InList


+1 Hoàn thành tốt và một giải pháp tuyệt vời. Vì tò mò, quá trình xử lý mất bao lâu?
Aaron

@Aaron, xử lý tất cả Alaska mất 13 phút và 23,4 giây. Tập hợp con mẫu , là một trong 100 tập hợp con có kích thước bằng nhau được tạo bởi SplitRaster_management, mất 7,04 giây.
DoggoDougal

Thật thú vị, khoảng thời gian xử lý giống nhau giữa hai phương thức (giả sử chúng ta đang chạy các hệ thống tương tự).
Aaron

Tôi có Intel Core 2 Duo E6850 @ 3 Ghz, RAM 4GB, chạy Windows 64 bit 7. Tôi sẽ sớm phân tích thời gian giải pháp của bạn. Hiện tại tôi đang bị kẹt với Arc 10.0, nếu không tôi sẽ điều tra xử lý nền 64 bit.
DoggoDougal

1

Tôi đã sử dụng tập dữ liệu được đề cập trong bài đăng gốc với phiên bản arcmap 10,4 dev. Phân loại lại thất bại khi raster đầu ra là một lưới, bởi vì số lượng ô được phân loại lại đang tràn ra những gì có thể được lưu trữ trong trường COUNT của VAT lưới. Khi raster đầu ra là một fgdb, nó sẽ thực thi thành công cho tôi trong khoảng 11 phút trên máy 4 lõi cũ hơn chạy Windows 8. Các định dạng raster không lưới sẽ hoạt động vì chúng sử dụng các giá trị nổi chính xác kép cho trường đếm. Tôi hy vọng bạn sẽ có được hành vi tương tự với các phiên bản phát hành 10.2 hoặc 10.3. Chúng tôi sẽ điều tra bằng cách sử dụng định dạng raster khác cho đầu ra mặc định cho Reclassify.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.