วิธีการจัดกลุ่มชุดข้อมูลครอบคลุมพื้นที่ขนาดใหญ่มากอีกครั้งอย่างไร


10

พิจารณาชุดข้อมูล Land Cover NLCD2001 สำหรับ Alaska ( ลิงค์ดาวน์โหลด ) ฉันจำเป็นต้องจัดกลุ่มชุดข้อมูลนี้ใหม่เพื่อให้มีการรักษาพิกเซลของค่า 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)

ฉันจะจัดกลุ่มชุดข้อมูลแรสเตอร์นี้ใหม่ได้อย่างไร ฉันใช้ ArcCatalog 10.0, Build 4000 ด้วยการเปิดใช้งานส่วนขยาย Spatial Analyst


แยกตามคุณสมบัติดูเหมือนจะทำในสิ่งที่ฉันต้องการ แต่ก็น่าเสียดายที่ผลลัพธ์ใน "ข้อผิดพลาดที่ไม่คาดคิด"
DoggoDougal

พยายามชุดข้อมูลอื่นอาจจะ? สองกระบวนการล้มเหลวในชุดเดียวกันทำให้ยาสงสัย ...
ชาดคูเปอร์

2
ตามปกติแล้วreclassifyควรเป็นทางเลือกสุดท้ายเนื่องจากเป็นเรื่องทั่วไปในขอบเขตที่เป็นไปได้ที่จะใช้วิธีการที่มีประสิทธิภาพน้อยกว่าที่จะได้รับเมื่อการจัดประเภทใหม่นั้นง่ายต่อการแสดงออกทางคณิตศาสตร์หรือทางตรรกะ ในกรณีปัจจุบันเกณฑ์สำหรับการจัดประเภทใหม่นั้นง่ายมากคุณควรลองใช้งานด้วยตัวเองConหรือแม้กระทั่งการดำเนินการเกี่ยวกับคณิตศาสตร์แบบตรง (เพราะมันรวดเร็ว) ตัวอย่างเช่น"grid" * ("grid" >= 41) * ("grid" <= 43)ควรทำ RAM ไม่ควรเป็นปัญหา - Spatial Analyst จะเปิดหน้าต่าง I / O แรสเตอร์โดยอัตโนมัติและสิ่งเหล่านี้เป็นการดำเนินการในท้องถิ่น
whuber

1
Inlistเป็นทางออกที่ดี (+1) ฉันสามารถใช้conและตรวจสอบการใช้ RAM ในระหว่างการดำเนินการได้ ไม่เกิน 180 MB ซึ่งใหญ่กว่า RAM ที่เพิ่งใช้เพื่อเรียกใช้ ArcMap การเรียงลำดับใน ArcGIS เป็นไปโดยอัตโนมัติ -คุณไม่ต้องควบคุมมัน (ยกเว้นว่าคุณกำลังตั้งโปรแกรมไปยังส่วนต่อประสาน C / Fortran) ดูเหมือนว่าข้อ จำกัด ของ RAM มีความกังวลเล็กน้อย
whuber

1
@whuber, ทำงานให้ฉันเป็นอย่างดีกับสภาพcon "Value" >= 41 AND "Value" <= 43ฉันจะไปด้วยวิธีนี้ แต่ฉันไม่แน่ใจว่าค่า raster เพิ่มเติมจะเป็นที่สนใจในอนาคต เห็นได้ชัดว่าฉันสามารถเพิ่มORเข้าไปในส่วนคำสั่งที่ไหน แต่แล้วก็เริ่มที่จะซับซ้อนมากขึ้น InListดูเหมือนว่าเป็นทางออกที่ตรงไปตรงมามากที่สุดเกี่ยวกับความสามารถในการอ่านและการบำรุงรักษา
DoggoDougal

คำตอบ:


9

สคริปต์ที่แนบมาครั้งแรกประสบความสำเร็จในการจัดประเภทข้อมูล AK NLCD ของคุณใหม่ในเวลาประมาณ 15 นาที (เครื่อง i7, 12GB RAM) เนื่องจากชุดข้อมูลดั้งเดิมเกือบ 7GB คุณอาจประสบปัญหาหน่วยความจำ หากคุณไม่สามารถประมวลผลชุดข้อมูลทั้งหมดในหนึ่งชิ้นลองแยกมันด้วยสคริปต์ที่สองก่อนที่จะจัดประเภทใหม่ คำแนะนำของฉันคือการใช้ชุดย่อยของข้อมูลขนาดเล็ก (คลิกขวาที่เลเยอร์แรสเตอร์ใน TOC> ข้อมูล> ส่งออกข้อมูล> ขอบเขต (Data Frame) และทดสอบสคริปต์แรกเมื่อคุณหมุนหมายเลขในพารามิเตอร์สำหรับคำสั่งจัดประเภทใหม่ ชุดข้อมูลทั้งหมดหรือแยกออกหรือลองดาวน์โหลดผลิตภัณฑ์ประมวลผลพื้นหลัง 64 บิตสำหรับ ArcGIS 10.1 SP1 ซึ่งมีให้ที่นี่ขอให้โชคดี

สคริปต์ 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 () และทำการจัดเรียงใหม่ในจำนวนมาก คุณอาจต้องการแยกแรสเตอร์ออกเป็นแบบเรียงต่อกันเพื่อจุดประสงค์ด้านความจำ แต่ฉันรู้ว่าด้วย GDAL การจัดประเภทอาร์เรย์แบบนัมมีอีกครั้งนั้นรวดเร็วมาก
DavidF

@DavidF เห็นด้วยน่าจะมีการปรับปรุงที่สำคัญในประสิทธิภาพ
แอรอน

ขอบคุณสำหรับเคล็ดลับแอรอน ฉันจะให้มันทำงานทันทีที่ฉันเสร็จสิ้นการแก้ปัญหาอื่นซึ่งดูเหมือนจะต้องมีการลบแผนที่สี ( อ้างอิงที่นี่ ) วิธีการนี้ต้องใช้การแยก raster เช่นกันดังนั้นฉันจึงสงสัยว่าการจัดประเภทต้นฉบับใหม่ล้มเหลวเนื่องจากการใช้หน่วยความจำหรือเหตุผลอื่น
DoggoDougal

@torik ไม่มีปัญหา - ฉันยินดีที่จะให้สองเซ็นต์ของฉัน ฉันคิดว่าการลบแผนที่สีไม่ใช่วิธีที่จะไป ฉันจะมุ่งเน้นไปที่การแยกข้อมูลหรือการประมวลผลพื้นหลัง 64 บิต
แอรอน

@Aaron โปรดทราบว่าคุณให้รหัสเพื่อให้การเรียงไฟล์สำเร็จคุณสร้างชุดย่อยแรสเตอร์ที่คุณใช้เพื่อสร้างผลลัพธ์ที่เป็นภาพได้อย่างไร ฉันได้เสร็จสิ้นการเรียงกระเบื้อง SplitRaster (ผลิต 100 ชุดย่อยของชุดข้อมูลแรสเตอร์ทั้งหมด) และพยายามวนรอบทั้งหมดเพื่อจัดประเภทใหม่ การจัดประเภทใหม่ล้มเหลวโชคไม่ดีส่งผลให้เกิดข้อความ "ข้อผิดพลาดที่ไม่คาดคิด"
DoggoDougal

4

whuber ได้แสดงความคิดเห็นเกี่ยวกับการใช้เครื่องมือเชิงตรรกะเพื่อแสดงการจัดประเภทใหม่นี้ หลังจากการขุดเล็กน้อยฉันพบInListซึ่งเป็นส่วนหนึ่งของชุดเครื่องมือ Logical Math ของนักวิเคราะห์เชิงพื้นที่เต็มความต้องการของฉัน

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 ประมวลผลอลาสก้าทั้งหมดใช้เวลา 13 นาทีและ 23.4 วินาที เซตตัวอย่างซึ่งเป็นหนึ่งใน 100 ส่วนย่อยอย่างเท่าเทียมกันขนาดที่สร้างขึ้นโดยSplitRaster_managementใช้เวลา 7.04 วินาที
DoggoDougal

น่าสนใจประมาณเวลาประมวลผลเดียวกันระหว่างสองวิธี (เช่นสมมติว่าเราใช้ระบบที่คล้ายกัน)
แอรอน

ฉันมี Intel Core 2 Duo E6850 @ 3 Ghz, RAM 4GB, ใช้งาน Windows 7 64 บิตฉันจะทำการวิเคราะห์เวลาของโซลูชันของคุณในไม่ช้า ฉันติดกับ Arc 10.0 แล้วในตอนนี้ฉันจะตรวจสอบการประมวลผลพื้นหลัง 64 บิต
DoggoDougal

1

ฉันใช้ชุดข้อมูลที่กล่าวถึงในการโพสต์ต้นฉบับด้วย arcmap เวอร์ชัน 10.4 dev การจัดประเภทใหม่ล้มเหลวเมื่อเอาท์พุทแรสเตอร์เป็นกริดเนื่องจากจำนวนเซลล์ที่จัดประเภทใหม่จะล้นซึ่งจะถูกเก็บไว้ในฟิลด์ COUNT ของ VAT VAT เมื่อเอาท์พุทแรสเตอร์เป็น fgdb มันจะประมวลผลสำเร็จสำหรับฉันในเวลาประมาณ 11 นาทีสำหรับเครื่อง 4 แกนรุ่นเก่าที่ใช้ Windows 8 รูปแบบแรสเตอร์ที่ไม่ใช่ตารางควรทำงานได้เนื่องจากใช้ค่าความแม่นยำสองเท่าสำหรับฟิลด์นับ ฉันคาดว่าคุณควรได้รับพฤติกรรมเดียวกันกับรุ่นที่วางจำหน่าย 10.2 หรือ 10.3 เราจะตรวจสอบโดยใช้รูปแบบแรสเตอร์ที่แตกต่างกันเพื่อหาเอาต์พุตเริ่มต้นสำหรับจัดประเภทใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.