การสร้างแรสเตอร์โดยการสุ่มเลือกค่าของเซลล์จากแรสเตอร์ที่ซ้อนกันหลายอัน?


10

ฉันใช้ ArcGIS Desktop 10 กับส่วนขยาย Spatial Analyst

ฉันจะรวมแรสเตอร์หลาย ๆ ตัวไว้ในที่เดียวโดยเลือกแบบสุ่มจากค่าของเซลล์ที่ทับซ้อนกันได้อย่างไร

ฉันมีภาพที่อาจอธิบายสิ่งนี้ดีกว่า:

ตัวอย่าง

คำตอบ:


7

เลือกถูกสร้างขึ้นสำหรับปัญหาเช่นนี้ คิดว่าเป็น "สวิตช์" (หรือ "กรณี") รุ่น "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 ในตัวอย่างนี้): ไม่ควรมี

แม้ว่าตัวอย่างการรันนี้ใช้เพียงสามกริดเพื่อเลือกจากฉันได้เขียนในลักษณะที่ทำให้ง่ายต่อกริดจำนวนเท่าใดก็ได้ ด้วยกริดจำนวนมากการเขียนสคริปต์ (เพื่อวนซ้ำการดำเนินการซ้ำ ๆ ) จะมีค่ายิ่ง


คุณรู้หรือไม่ว่าฉันจะเพิกเฉยค่า NoData จากการคำนวณได้อย่างไร (ด้วย Raster Calculator และ Python)
Sam

แซม "เพิกเฉย" ได้อย่างไร ฉันเชื่อว่าพฤติกรรมเริ่มต้นคือการส่งออก NoData ที่ใดก็ตามหนึ่งหรือมากกว่า rasters การป้อนข้อมูลเป็น NoData (แต่ฉันไม่แน่ใจว่าในกรณีของpick: ถ้า inPositionRaster และ raster ที่เลือกทั้งสองมีค่าที่ถูกต้องในเซลล์แล้วน่าเชื่อถือผลลัพธ์ สำหรับเซลล์นั้นควรเป็นค่าของแรสเตอร์ที่เลือกโดยไม่คำนึงถึงสิ่งที่แรสเตอร์อื่น ๆ อาจมี) คุณกำลังคิดพฤติกรรมทางเลือกอะไร
whuber

ฉันต้องการให้เลือกจากค่าตัวเลขทั้งหมดเท่านั้น สมมุติว่าฉันมีแรสเตอร์สามตัว สำหรับเซลล์ค่าจะเป็นดังนี้: 4,5, NoData ฉันต้องการ outraster ที่จะมี 4 หรือ 5 ในเซลล์นั้น แต่ไม่เคย NoData
Sam

ฉันมีปัญหาในการทำให้ 1 + Int (n * CreateRandomRaster ()) นี้ทำงาน
Sam

"ปัญหา" ในสิ่งที่เหมาะสม? โปรดระบุ!
whuber

4

ใช้ 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ค่าเพื่อให้ชิ้นส่วนสามารถออก


ฉันยังคงพัฒนาทักษะ Python ของฉันอยู่ มีวิธีป้อนสิ่งนี้ใน Raster Calculator ที่จะแยกค่า NoData ออกจากกระบวนการด้วยหรือไม่ ฉันมีแรสเตอร์ 10 อันและบางตัวมี NoData ที่คนอื่นมีค่า
Sam

ฉันคิดว่าคุณสามารถสร้างเงื่อนไขโดยใช้สิ่งนี้ในเครื่องคิดเลขแบบแรสเตอร์Con(IsNull(ras1), 0, ras2)
djq

น่าเสียดายที่สิ่งนี้ไม่ได้ยกเว้นค่า NoData จริง ๆ เพียงแค่แทนที่ด้วยค่าศูนย์ ในบางกรณีที่อาจเหมาะสม แต่อาจไม่ใช่ที่นี่!
whuber

อืมจุดดี @whuber ดังนั้นการยกเว้นNoDataคืออะไร มันเป็นเพียงเพื่อให้แน่ใจว่าพวกเขาจะไม่เลือกเมื่อเลือกแบบสุ่ม?
djq

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

1

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

หวังว่าจะทำให้รู้สึก :)


คุณรู้วิธีเลือกจาก rasters ด้วยค่าเท่านั้นหรือไม่ ยกตัวอย่างเช่นในรูปของฉันมีสี่ 2 และสอง 3 ที่ทับซ้อนกับ NoData ฉันต้องการตรวจสอบให้แน่ใจว่าเลือกจาก rasters ที่มีค่าในเซลล์ไม่ใช่ไม่ใช่ข้อมูล
แซม

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