การนับค่าพิกเซลต่อเนื่องสำหรับชุดแรสเตอร์โดยใช้ ArcGIS Spatial Analyst?


23

ฉันใช้ ArcGIS 10 กับนักวิเคราะห์เชิงพื้นที่

ฉันมีชุด rasters (รวม 8) ที่ทุกคนมี 1 หรือ 0 สำหรับแต่ละเซลล์ แต่ละแรสเตอร์แสดงค่าปีของข้อมูลที่แตกต่างกัน เพื่อประโยชน์ในการปี 1 ถึงปี 8

ฉันสามารถเพิ่มแรสเตอร์ทั้งหมดเข้าด้วยกันซึ่งจะให้กริดสุดท้ายกับค่าตั้งแต่ 0 ถึง 8 8 บ่งบอกว่าเซลล์เป็น 1 อย่างต่อเนื่องสำหรับชุดแรสเตอร์ (ทุกปี)

ฉันอยากทราบว่าแต่ละเซลล์มีจำนวน 1 ต่อเนื่องกันนานที่สุด

ตัวอย่างเช่นกริดรวมอาจบันทึกค่าเซลล์เดียวที่บอกว่า 5 แต่เหนือ 8 กริดที่เซลล์มีจำนวนติดต่อกันมากที่สุด 1 เท่ากับ 3 หรือวิธีการแสดงนี้เป็นเวลา 3 ปีที่เซลล์เป็น 1 จากนั้นก็เริ่มสั่นระหว่างศูนย์และคน

ทักษะการประมวลผลแบบแรสเตอร์ของฉันไม่ร้อนเท่ากับทักษะการประมวลผลเวกเตอร์ของฉันและฉันได้ดูไฟล์ช่วยเหลือ ESRI ได้ดี แต่ฉันไม่สามารถคิดได้ว่าจะทำได้อย่างไรโดยใช้เครื่องมือการประมวลผลเชิงภูมิศาสตร์ชั้นวาง

ความคิดใด ๆ


1
นั่นเป็นการวิเคราะห์ที่ยอดเยี่ยมจริงๆ ตามปกติมีมากกว่าหนึ่งวิธีในการทำสิ่งที่คุณพยายามทำ ฉันคิดว่าคุณจะต้องทำการเขียนโปรแกรมเพื่อวนรอบชุดค่าผสมทั้งหมดแม้ว่า
MLowry

1
ความคิดเห็นทั่วไป (ได้รับแรงบันดาลใจจากคำพูดนี้โดย @MLowry): โปรดตอบคำถามเมื่อใดก็ตามที่พวกเขาดูน่าสนใจหรือชัดเจน คำถามที่ดีทำให้ทุกอย่างบนเว็บไซต์ของเรา; โปรดทำสิ่งที่เราทำได้เพื่อตอบแทนผู้ที่ถามพวกเขา!
whuber

คำตอบ:


14

เพราะนี่เป็นการดำเนินงานในท้องถิ่นเรามาดูวิธีการทำเซลล์เดียว: Map Algebra จะดูแลส่วนที่เหลือ

โปรดทราบก่อนว่าลำดับของแรสเตอร์นั้นสำคัญ ดังนั้นสถิติเซลล์นัดเดียวเช่นผลรวมของเซลล์จะไม่ทำเช่นนั้น

หากเราต้องพบกับลำดับเช่น 01110101 ในเซลล์ที่กำหนดเราจะดำเนินการสิ่งนี้ตั้งแต่ต้นจนจบและ

  1. เริ่มต้นด้วยการนับที่ศูนย์

  2. เพิ่มจำนวนครั้งที่เราพบ 1

  3. รีเซ็ตนับทุกครั้งที่เราพบ 0, หลังจากบันทึกนับที่ผ่านมา

  4. ในตอนท้ายให้นับจำนวนสูงสุดที่บันทึกไว้ (รวมถึงจำนวนสุดท้าย)

ขั้นตอนที่ 1 ถูกนำมาใช้กับกริดศูนย์คงที่ ขั้นตอนที่ 2 และ 3 ขึ้นอยู่กับสิ่งที่เราพบ: มันเป็นการดำเนินการตามเงื่อนไข ขั้นตอนที่ 4 เป็นค่าสูงสุดในท้องถิ่นอย่างชัดเจน เราจะรหัสนี้แล้วอย่างเป็นทางการอีกเล็กน้อยเป็น:

count = 0
result = 0
For each value:
    If (value==1):
        count=count+1
    else
        result = max(result, count)
        count=0
result = max(result, count)

ทำได้ดีที่สุดด้วยสคริปต์ Python เมื่อคุณมีกริดจำนวนมาก แต่ด้วยข้อที่แปดมันไม่ใช่เรื่องง่ายเลยที่จะปลดลูปและเขียนขั้นตอนด้วยมือ สิ่งนี้แสดงให้เห็นว่ามีปัญหาเล็กน้อย: การresult=max(longest,count)เรียงลำดับของ "ผลข้างเคียง" ที่ยากในการเขียนโค้ดด้วยการดำเนินการเชิงภาพ (แต่สามารถทำได้ดังที่แสดงในโซลูชันที่สองด้านล่าง) นอกจากนี้ยังไม่มีประสิทธิภาพเนื่องจากจะเพิ่มการคำนวณพิเศษในแต่ละขั้นตอน ดังนั้นเราจึงปรับเปลี่ยนวิธีการเล็กน้อยโดยมีจุดประสงค์เพื่อยกเลิกการmaxดำเนินการจนกระทั่งสิ้นสุด สิ่งนี้จะต้องมีการบันทึกการนับแยกในแต่ละขั้นตอน

ในขั้นตอนนี้ฉันพบทางลัดสำหรับขั้นตอนแรกด้วย สิ่งนี้นำไปสู่การแก้ปัญหาต่อไปนี้ซึ่งแม้จะใช้เวลานานและใช้ RAM น้อย แต่ก็ง่ายและเกี่ยวข้องกับขั้นตอนที่ดำเนินการอย่างรวดเร็ว:

result1 = "grid1"
result2 = con("grid2"==1, "result1"+1, 0)
result3 = con("grid3"==1, "result2"+1, 0)
result4 = con("grid4"==1, "result3"+1, 0)
result5 = con("grid5"==1, "result4"+1, 0)
result6 = con("grid6"==1, "result5"+1, 0)
result7 = con("grid7"==1, "result6"+1, 0)
result8 = con("grid8"==1, "result7"+1, 0)
CellStatistics(["result1", "result2", "result3", "result4", "result5", "result6", "result7" "result8"], "max")

ไวยากรณ์ที่แท้จริงจะแตกต่างกันไปตามเวอร์ชั่นของ ArcMap (ตัวอย่างเช่นCellStatisticsเป็นของใหม่สำหรับเวอร์ชัน 10 ฉันเชื่อว่า แต่มีการดำเนินการสูงสุดในท้องถิ่นอยู่เสมอ)

ในตัวอย่างที่มีอินพุต 01110101 ลำดับของกริด "result *" จะมีค่า 0, 1, 2, 3, 0, 1, 0, 1 ดังนั้นท้ายที่สุดCellStatisticsจะคืนค่า 3 ความยาวของสตริงที่ยาวที่สุดของ 1

หาก RAM มีน้อยโซลูชันสามารถแก้ไขได้เพื่อนำผลลัพธ์ระดับกลางกลับมาใช้ใหม่โดยมีค่าใช้จ่ายประมาณสองเท่าของเวลาดำเนินการ:

result = "grid1"
temp = con("grid2"==1, "result"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
temp = con("grid3"==1, "temp"+1, 0)
result = CellStatistics[["temp", "result"], "max"]
...
temp = con("grid8"==1, "temp"+1, 0)
CellStatistics[["temp", "result"], "max"]

ในตัวอย่างที่มีอินพุต 01110101 ค่า ("temp", "result") จะเป็น (NoData, 0) หลังจากบรรทัดแรกและหลังจากการดำเนินการ ("Con", "CellStatistics") แต่ละคู่ค่าจะเป็น (1 , 1), (2, 2), (3, 3), (0, 3), (1, 3), (0, 3), (1, 3) ค่าสุดท้ายอีกครั้งคือ 3

รูปแบบปกติของนิพจน์พีชคณิตในโซลูชันทั้งสองระบุวิธีเขียนโค้ดอัลกอริทึมเป็นวนรอบในสคริปต์โดยเปลี่ยนดัชนีตามความเหมาะสมกับการวนซ้ำแต่ละครั้ง


อาจมีการพิมพ์ผิดในบล็อกรหัสประเภท: count = count = 1 น่าจะเป็น count = count + 1
MLowry

1
@ML ขอบคุณ (ดวงตาดี!): ตอนนี้ได้รับการแก้ไขแล้ว มันยากที่จะทำให้ pseudocode ถูกต้องอย่างแน่นอน การตรวจสอบโดยคนเป็นสินทรัพย์ที่แท้จริงในการค้นหาข้อผิดพลาด นอกจากนี้แม้ว่าฉันจะไม่ได้ทดสอบโซลูชันใน ArcGIS แต่ฉันใช้โซลูชันแรกใน R ดังนั้นฉันจึงมั่นใจได้ว่าแนวทางนี้ถูกต้อง
whuber

1
"whuber" อีกครั้งคุณเป็นคนที่รู้! พระเจ้าช่วยพวกเราที่เหลือถ้าคุณถูกรถบัสวิ่ง! วิธีการเริ่มต้นของคุณเป็นงูเหลือมทิศทางที่ฉันคิด แต่ฉันรู้ด้วย rasters หนึ่งมักจะสามารถทำทุกอย่างสั่นไหวมากที่คุณได้พิสูจน์แล้ว หากคุณพบว่าตัวเองอยู่ในสหราชอาณาจักรมันเป็นเกียรติที่ได้ซื้อเบียร์แบนอุณหภูมิห้องที่ดีที่สุดของเรา! :)
Hornbydd

ขอบคุณ Duncan: แต่ลองดูทางออกที่ยอดเยี่ยมของ Andy Harfoot!
whuber

14

เพียงแค่พูดคุยเกี่ยวกับเรื่องนี้และสงสัยว่าคุณจะสามารถเข้าถึงปัญหาได้หรือไม่โดยการจัดการกับกริดอินพุตให้เป็นไบนารีสตรีม สิ่งนี้จะช่วยให้คุณสามารถรวมพวกเขาเพื่อให้เป็นจำนวนเต็มสรุปที่ไม่ซ้ำกันสำหรับลำดับ - เช่น 01110101 = 117 จากนั้นค่านี้สามารถจัดประเภทใหม่เพื่อให้จำนวนสูงสุดของ 1s ติดต่อกัน

นี่คือตัวอย่างที่แสดงวิธีหนึ่งในการรวมแปดกริด:

2*(2*(2*(2*(2*(2*(2*"g8" + "g7") + "g6") + "g5") + "g4") + "g3") + "g2") + "g1"

การดำเนินการBitwiseสามารถถูกกดลงในเซอร์วิสสำหรับขั้นตอนนี้ หรือคุณสามารถใช้การรวมตามด้วยการคำนวณฟิลด์ (การคำนวณฟิลด์จะมีนิพจน์คล้ายกับนิพจน์ก่อนหน้า)

ตารางจัดประเภทรายการใหม่มีความยาวเพื่อให้การทำงานสูงสุดสำหรับค่าทั้งหมดระหว่าง 00000000B = 0 และ 11111111B = 255 ในการสั่งซื้อที่นี่พวกเขาจะ:

0, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 1, 1, 1, 2, 1, 1, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 6, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 3, 4, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8

วิธีนี้ถูก จำกัด ไว้ที่ประมาณ 20 กริดใน ArcGIS: การใช้มากกว่านี้สามารถสร้างตารางแอตทริบิวต์ที่เทอะทะได้ ( Combineจำกัด เฉพาะ 20 กริด)


+1 ขนาดใหญ่: นี่เป็นความคิดที่ดีมาก (ข้อ จำกัด เพียงอย่างเดียวคือเมื่อมีตารางมากกว่า 31 แห่งที่เกี่ยวข้องคุณจะใช้บิตน้อยกว่าในการใช้งาน) ฉันใช้เสรีภาพในการแยกความคิดของคุณออกเล็กน้อยเพื่อให้ผู้อื่นเห็นว่าการนำไปปฏิบัติได้ง่ายเพียงใด
whuber

3

คุณเคยคิดที่จะเปลี่ยนค่าจาก 0 และ 1 เป็นค่าที่มีกำลัง 2 (1,2,4,8,16,32) หรือไม่ เมื่อคุณรวม 8 กริดคุณจะได้รับค่าที่ไม่ซ้ำกันสำหรับแต่ละเซลล์ซึ่งจะให้ข้อมูลที่ต่อเนื่องกัน (เช่น: ค่า 3 หมายถึงปี 1 และ 2 ซึ่งค่า 54 จะเป็นปี 6 ถึง 8)

แค่ความคิด


นี่คือสิ่งที่ @Andy Harfoot แนะนำเมื่อไม่กี่ชั่วโมงก่อนหน้านี้ Ryan :-)
whuber

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