ฉันใช้ ArcGIS Desktop 10 กับส่วนขยาย Spatial Analyst
ฉันจะรวมแรสเตอร์หลาย ๆ ตัวไว้ในที่เดียวโดยเลือกแบบสุ่มจากค่าของเซลล์ที่ทับซ้อนกันได้อย่างไร
ฉันมีภาพที่อาจอธิบายสิ่งนี้ดีกว่า:
ฉันใช้ ArcGIS Desktop 10 กับส่วนขยาย Spatial Analyst
ฉันจะรวมแรสเตอร์หลาย ๆ ตัวไว้ในที่เดียวโดยเลือกแบบสุ่มจากค่าของเซลล์ที่ทับซ้อนกันได้อย่างไร
ฉันมีภาพที่อาจอธิบายสิ่งนี้ดีกว่า:
คำตอบ:
เลือกถูกสร้างขึ้นสำหรับปัญหาเช่นนี้ คิดว่าเป็น "สวิตช์" (หรือ "กรณี") รุ่น "con" ซึ่งเป็นการใช้งานพีชคณิตแผนที่ของ "if ... else"
หากมีแรสเตอร์ซ้อนทับกัน 3 ตัวไวยากรณ์ (Python) จะมีลักษณะดังนี้
inPositionRaster = 1 + int(3 * CreateRandomRaster())
Pick(inPositionRaster, [inRas01, inRas02, inRas03])
โปรดทราบว่าpick
เริ่มการทำดัชนีที่ 1 ไม่ใช่ 0
(ดูหัวข้อความคิดเห็น)
เพื่อรับมือกับค่า NoData อันดับแรกคุณต้องปิดการจัดการ NoData ของ ArcGIS ทำได้โดยการสร้างกริดที่มีความพิเศษ ( แต่ที่ถูกต้อง) มูลค่าในสถานที่ของไม่มีข้อมูลตัวเลขเช่น 99999 (หรืออะไรก็ตาม แต่ให้แน่ใจว่าจะเลือกค่าที่มีขนาดใหญ่กว่าจำนวนที่ถูกต้องใด ๆ ที่สามารถปรากฏ: นี้จะเป็นประโยชน์ในภายหลัง) . สิ่งนี้ต้องใช้คำขอ IsNull เช่นเดียวกับใน
p01 = Con(IsNull(inRas01), 99999, inRas01)
p02 = Con(IsNull(inRas02), 99999, inRas01)
p03 = Con(IsNull(inRas03), 99999, inRas01)
ตัวอย่างเช่นพิจารณากรณีของกริดแบบหนึ่งแถว (NoData แสดงเป็น "*"):
inRas01: 1 2 19 4 * * * *
inRas02: 9 2 * * 13 14 * *
inRas03: 17 * 3 * 21 * 23 *
ผลลัพธ์คือใส่ 99999 แทน "*" แต่ละตัว
จากนั้นลองนึกภาพทั้งหมดเหล่านี้เป็นแรสเตอร์แบบแบนของบล็อกไม้ที่มี NoData ที่สอดคล้องกับบล็อกที่ขาดหายไป (หลุม) เมื่อคุณเรียงแรสเตอร์เหล่านี้ในแนวตั้งบล็อคจะตกลงไปในหลุมใด ๆ ที่อยู่ด้านล่าง เราต้องการพฤติกรรมนั้นเพื่อหลีกเลี่ยงการเลือกค่า NoData: เราไม่ต้องการช่องว่างแนวตั้งใด ๆ ในกองบล็อก ลำดับของบล็อกในแต่ละหอคอยนั้นไม่สำคัญ ด้วยเหตุนี้เราสามารถรับแต่ละหอคอยได้โดยจัดอันดับข้อมูล :
q01 = Rank(1, [p01, p02, p03])
q02 = Rank(2, [p01, p02, p03])
q03 = Rank(3, [p01, p02, p03])
ในตัวอย่างเราได้รับ
q01: 1 2 3 4 13 14 23 99999
q02: 9 2 19 99999 21 99999 99999 99999
q03: 17 99999 99999 99999 99999 99999 99999 99999
โปรดทราบว่าอันดับนั้นมาจากต่ำสุดไปหาสูงสุดดังนั้น q01 มีค่าต่ำสุดในแต่ละตำแหน่ง q02 มีอันดับที่สองที่ต่ำที่สุด ฯลฯ รหัส NoData จะไม่เริ่มแสดงจนกว่าจะมีการรวบรวมหมายเลขที่ถูกต้องทั้งหมดเนื่องจากรหัสเหล่านั้น มีขนาดใหญ่กว่าหมายเลขที่ถูกต้องใด ๆ
เพื่อหลีกเลี่ยงการเลือกรหัส NoData เหล่านี้ในระหว่างการเลือกแบบสุ่มคุณจำเป็นต้องรู้จำนวนบล็อกที่ซ้อนกันในแต่ละตำแหน่ง: สิ่งนี้บอกเราว่ามีค่าที่ถูกต้องเกิดขึ้นจำนวนเท่าใด วิธีหนึ่งในการจัดการสิ่งนี้คือการนับจำนวนรหัส NoDataและลบออกจากจำนวนกริดการเลือกทั้งหมด:
n0 = 3 - EqualToFrequency(99999, [q01, q02, q03])
อัตราผลตอบแทนนี้
n0: 3 2 2 1 2 1 1 0
หากต้องการจัดการเคสที่ n = 0 (ดังนั้นจึงไม่มีอะไรให้เลือก) ให้ตั้งเป็น NoData:
n = SetNull(n0 == 0, n0)
ตอนนี้
n: 3 2 2 1 2 1 1 *
นี่จะเป็นการรับประกันว่ารหัส NoData (ชั่วคราว) ของคุณจะหายไปในการคำนวณขั้นสุดท้าย สร้างค่าสุ่มระหว่าง 1 ถึง n:
inPositionRaster = 1 + int(n * CreateRandomRaster())
ตัวอย่างเช่นแรสเตอร์นี้อาจดูเหมือน
inPositionRaster: 3 2 1 1 2 1 1 *
ค่าทั้งหมดจะอยู่ระหว่าง 1 และค่าที่สอดคล้องกันใน [n]
เลือกค่าเหมือนก่อนหน้า:
selection = Pick(inPositionRaster, [q01, q02, q03])
ซึ่งจะส่งผลให้
selection: 17 2 3 4 21 14 23 *
ในการตรวจสอบว่าทั้งหมดเป็นปกติให้ลองเลือกเซลล์ผลลัพธ์ทั้งหมดที่มีรหัส NoData (99999 ในตัวอย่างนี้): ไม่ควรมี
แม้ว่าตัวอย่างการรันนี้ใช้เพียงสามกริดเพื่อเลือกจากฉันได้เขียนในลักษณะที่ทำให้ง่ายต่อกริดจำนวนเท่าใดก็ได้ ด้วยกริดจำนวนมากการเขียนสคริปต์ (เพื่อวนซ้ำการดำเนินการซ้ำ ๆ ) จะมีค่ายิ่ง
pick
: ถ้า inPositionRaster และ raster ที่เลือกทั้งสองมีค่าที่ถูกต้องในเซลล์แล้วน่าเชื่อถือผลลัพธ์ สำหรับเซลล์นั้นควรเป็นค่าของแรสเตอร์ที่เลือกโดยไม่คำนึงถึงสิ่งที่แรสเตอร์อื่น ๆ อาจมี) คุณกำลังคิดพฤติกรรมทางเลือกอะไร
ใช้ python และ ArcGIS 10 และใช้ฟังก์ชั่นการแย้งซึ่งมีไวยากรณ์ต่อไปนี้:
Con (in_conditional_raster, in_true_raster_or_constant, {in_false_raster_or_constant}, {where_clause})
แนวคิดในที่นี้คือดูว่าค่าในแรสเตอร์แบบสุ่มน้อยกว่า 0.5 หรือไม่ถ้าเลือก raster1 มิฉะนั้นให้เลือก raster2 NoData
+ data = NoData
ดังนั้นก่อนอื่นให้ตั้งค่าเหล่านี้จัดประเภทค่าใด ๆ ด้วยNoData
เป็น 0:
import arcpy
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/sapyexamples/data"
ras1_NoNull = Con(IsNull("elevation1"),0, "elevation1") # remove NoData
ras2_NoNull = Con(IsNull("elevation2"),0, "elevation2") # remove NoData
randRaster = CreateRandomRaster(100, 2, Extent(0, 0, 150, 150)) # raster generated between 0 and 1; 100 is seed value
outCon = Con(randRaster < 0.5, ras1_NoNull, ras2_NoNull)
outCon.save("C:/outcon.img") # save raster
แก้ไข: เพิ่งรู้ว่าคุณไม่ได้เพิ่มNoData
ค่าเพื่อให้ชิ้นส่วนสามารถออก
Con(IsNull(ras1), 0, ras2)
NoData
คืออะไร มันเป็นเพียงเพื่อให้แน่ใจว่าพวกเขาจะไม่เลือกเมื่อเลือกแบบสุ่ม?
ฉันแค่สร้างแรสเตอร์แบบสุ่ม ( ความช่วยเหลือ ) ที่มีขนาดเท่ากันและขนาดเซลล์ จากนั้นใช้ CON ( ช่วย ) ตั้งค่าให้เลือกค่าจากแรสเตอร์ที่ 1 หากเซลล์จากแรสเตอร์แบบสุ่มมีค่า <128 (ถ้าแรสเตอร์แบบสุ่มจะเป็น 0 - 255) มิฉะนั้นให้เลือกค่าจากแรสเตอร์ที่ 2
หวังว่าจะทำให้รู้สึก :)