การหาค่าของเซลล์แรสเตอร์ที่ใกล้ที่สุดตามจุดเวกเตอร์


9

ฉันมีสองเลเยอร์ใน ArcGIS: หนึ่งคือเวกเตอร์พอยท์และอีกหนึ่งคือเลเยอร์แรสเตอร์ ฉันต้องการผนวกค่าของตารางข้อมูลแบบแรสเตอร์ที่จุดเวกเตอร์ ปัญหาคือจุดเวกเตอร์อยู่ห่างจากกริดแรสเตอร์ใด ๆ ที่มีอยู่ดังนั้นค่าคำสั่ง "ตัวอย่าง" จะไม่ส่งคืนค่าสำหรับจุดเวกเตอร์เหล่านั้น

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

จริงๆแล้วมีสองสิ่งที่ฉันต้องทำ:

  1. ระบุ outliner ภายในแรนเจอร์ (โดยปกติ 1-2 เซลล์อยู่ห่างจากแรสเตอร์ที่ฉันมีอยู่)
  2. กำหนดค่าจากแรสเตอร์ที่ใกล้ที่สุดให้กับพวกเขาหากพวกเขาอยู่ในช่วง

แก้ไข: ฉันมีจุดเวกเตอร์ประมาณ 3000 จุดและปัญหาของฉันคือ: ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการผนวกค่าแรสเตอร์ตามตำแหน่งตามจุดเวกเตอร์ ฉันใช้เครื่องมือ "ตัวอย่าง" และใช้งานได้ดีกับคะแนนส่วนใหญ่

อย่างไรก็ตามมีสถานการณ์เช่นนี้ ป้อนคำอธิบายรูปภาพที่นี่

จุดที่ถูกต้องสามารถรับค่าได้จาก raster ("ตัวอย่าง") แต่จุดซ้ายไม่สามารถทำได้เนื่องจากปัญหาการจัดตำแหน่ง

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

จุดบนเหล่านั้นไม่ควรรับค่าใด ๆ เพราะอยู่ห่างจากแรสเตอร์มากเกินไป

ฉันคิดถึงการทำงานของเวย์เลย์:

ขั้นตอนที่ 1 ทำ "ตัวอย่าง" ก่อน

ขั้นตอนที่ 2 เลือกค่า Null หลังจากการดำเนินการ "ตัวอย่าง"

ขั้นตอนที่ 3 สร้างเขตบัฟเฟอร์ (ภายใน 1 องศาทศนิยม) ขึ้นอยู่กับจุดว่าง

ขั้นตอนที่ 4 ใช้สถิติเป็นกลุ่ม? ? หรือเครื่องมืออื่น ๆ ที่จะวนลูปผ่านเซลล์แรสเตอร์ทั้งหมดในบัฟเฟอร์ค้นหาอันที่ใกล้ที่สุดแยกค่าของมันและวางลงในจุดเวกเตอร์

ฉันติดอยู่ที่ขั้นตอนที่ 4 ฉันไม่รู้ว่าเครื่องมือใดใน ArcSDK ที่ฉันสามารถใช้เพื่อให้บรรลุหน้าที่นี้

หรืออื่น ๆ ... คุณมีความคิดที่ดีกว่าในการจัดการกับเรื่องนี้หรือไม่?

ฉันมีเลเยอร์แรสเตอร์ 20 ชั้นเช่นนี้และฉันต้องการทำให้เป็นอัตโนมัติ (ใช้ตัวสร้างแบบจำลองและอาร์คอบเจ็กต์)


@whuber: วิธีการของคุณฟังดูฉลาดมาก คำถามของฉันคือฉันกำลังจัดการข้อมูลในระดับโลกและฉันจะกำหนด x0 และ x1 สำหรับแรสเตอร์สรุปได้อย่างไร
เห็น

ตรวจสอบคุณสมบัติของมันหลังจากเพิ่มลงในโครงการ
whuber

1
Zonal stats คือจุดจบ จากการแก้ไขของคุณมีวิธีแก้ปัญหาโดยตรงอย่างง่าย ๆ : ขยายแรสเตอร์รอบ ๆ ขอบเขตและตัวอย่างแรสเตอร์ขยายออกเล็กน้อย มีหลายวิธีในการทำเช่นนี้ แต่พวกเขาทั้งหมดต้องการสิ่งอำนวยความสะดวกเล็กน้อยด้วยการคำนวณแบบแรสเตอร์ หนึ่งในสิ่งที่ง่ายที่สุดคือการขยายขอบเขตการวิเคราะห์คำนวณหาค่าเฉลี่ยและ (โดยใช้ 'คอน') วางค่าลงในเขตขอบเขต NoData สิ่งนี้กำหนดค่าเฉลี่ยของค่าแรสเตอร์ใกล้เคียงกับแต่ละตำแหน่งตัวอย่างแบบแรสเตอร์
whuber

@whuber มีปัญหาอีกอย่างหนึ่งคือฉันไม่รู้ว่าพวกเขาอยู่ที่ไหน ดังนั้นในกระบวนการของฉันมี 2 กระบวนการจริง ๆ : ระบุผู้ที่ทำกำไรและกำหนดค่าให้พวกเขา
เห็น

"outliner" คืออะไร? หากเป็นจุดที่ไม่ครอบคลุมด้วยค่าแรสเตอร์คุณจะไม่สามารถช่วยได้ แต่จะหาได้: นี่จะเป็นจุดที่ไม่ได้รับค่าใด ๆ เมื่อคุณใช้Sampleเครื่องมือ
whuber

คำตอบ:


8

เค้าร่างแรสเตอร์ครอบครองสี่เหลี่ยมผืนผ้าที่ล้อมรอบด้านล่างซ้ายโดยต้นกำเนิดมีพิกัด (พูด) (x0, y0) และที่มุมบนขวาโดย (x1, y1): คุณสมบัติเหล่านี้เป็นคุณสมบัติที่ค้นพบได้ง่ายจากแรสเตอร์ใด ๆ คุณสามารถใช้ข้อมูลนี้เพื่อย้ายจุดใด ๆ ที่อยู่นอกขอบเขตของแรสเตอร์ไปยังจุดที่ใกล้ที่สุดบนขอบเขตของแรสเตอร์และแยกค่าแรสเตอร์ที่ตำแหน่งใหม่

งานเช่นนี้มักจะทำงานพร้อมออกโดยพิจารณามิติที่ต่ำกว่า ขอบเขตของแรสเตอร์หนึ่งมิติเป็นเพียงช่วงเวลาของตัวเลขพูดจาก x0 ถึง x1> x0 ซึ่งเขียนตามปกติ [x0, x1] สมมติว่าคุณต้องการหาจุดที่ใกล้ที่สุดในช่วงเวลานี้เป็นจำนวนที่กำหนด x มีสามกรณี: x <x0 (x อยู่ทางซ้าย), x0 <= x <= x1 (x อยู่ในช่วงเวลา) และ x1 <x (x อยู่ทางขวา) ชัดเจนว่าจุดที่ใกล้ที่สุดคือ x0, x และ x1 ตามลำดับ สูตรสำหรับผลลัพธ์นี้คือ

x -> min (สูงสุด (x, x0), x1),

อย่างที่คุณเห็นโดยพิจารณาแต่ละกรณีทั้งสามแยกกัน

เนื่องจากขอบเขตของแรสเตอร์เป็นผลิตภัณฑ์คาร์ทีเซียนสองช่วงเวลา [x0, x1] * [y0, y1] สูตรเดียวกันจึงทำงานในสองมิติ เพียงใช้กับแต่ละช่วงเวลา ดังนั้นพิกัดของจุดที่คาดการณ์สามารถคำนวณได้ (ในเครื่องคำนวณฟิลด์พูด) เป็น

(x, y) -> (ขั้นต่ำ (สูงสุด (x, x0), x1)) ขั้นต่ำ (สูงสุด (y, y0), y1)

นี่คือสูตรในการดำเนินการโดยมี 100 คะแนนวางแบบสุ่มรอบและภายในขอบเขตของกริด:

รูป

เส้นประที่เชื่อมโยงจะมองเห็นจุดที่อยู่นอกขอบเขตไปยังตำแหน่งที่จะถูกย้าย

สร้างเลเยอร์จุดจากพิกัดที่คำนวณได้เหล่านี้และใช้Sampleเครื่องมือเพื่อแยกค่า raster เข้าร่วมผลลัพธ์กลับไปที่เลเยอร์จุดเริ่มต้น

ในทางปฏิบัติเพื่อหลีกเลี่ยงปัญหาเกี่ยวกับการปัดเศษจุดลอยตัวที่อาจป้องกันไม่ให้จุดใหม่อยู่ภายในขอบเขตของกริดคุณควรทำให้ x0 และ y0 มีขนาดใหญ่กว่าจุดกำเนิดจริงเล็กน้อย (คุณอาจเพิ่มเซลล์ครึ่งหนึ่งให้กับพวกมัน) และในทำนองเดียวกันทำให้ x1 และ y1 มีขนาดเล็กลงเล็กน้อย

โดยสรุปเวิร์กโฟลว์ประกอบด้วยการคำนวณสองฟิลด์ (พิกัดใหม่) ในตารางของเลเยอร์จุดเดิมสร้างเลเยอร์เหตุการณ์จุดจากพิกัดใหม่เหล่านั้นเรียกใช้Sampleเครื่องมือและดำเนินการเข้าร่วมฐานข้อมูล (ไม่ใช่การรวมเชิงพื้นที่)


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

หรือมิฉะนั้นคุณอาจจะเร่งแก้ปัญหา Celenius'โดยใช้การคำนวณแรสเตอร์ที่จะทำให้ตารางจำนวนเต็มมีค่าเพียงตามแนวพรมแดนของตน แปลงที่ชั้นจุดคือที่ง่ายและรวดเร็วเพราะมันจะมีไม่กี่จุด ลองเรียกสิ่งนี้ว่า "เลเยอร์ขอบเขต" ตัวอย่างตารางที่จุดเลเยอร์ขอบเขตดังนั้นการคัดลอกค่ากริดลงในตารางคุณลักษณะของเลเยอร์ขอบเขต หลังจากรันSampleด้วยเลเยอร์จุดเดิมให้ลบจุดทั้งหมดที่ได้รับตัวอย่างสำเร็จ เข้าร่วมชั้นขอบเขตกับจุดที่เหลือเพื่อให้กระบวนการสุ่มตัวอย่างเสร็จสมบูรณ์

(วิธีหนึ่งในการสร้างกริดที่มีค่าตามขอบเขตเท่านั้นคือการใช้การดำเนินงานย่านโฟกัสที่ล้มเหลวตามขอบเขต: ตัวอย่าง ได้แก่ การค้นหาความลาดชันฮิลแรดดิ้งสถิติโฟกัสโฟกัส 3 × 3 ซึ่งจะสร้างกริดด้วยเซลล์เดียว วงแหวนหนาของ NoData รอบ ๆ ขอบใช้ IsNull และ SetNull เพื่อตรวจจับเซลล์ NoData และแปลงระหว่าง NoData และเซลล์ข้อมูลสร้างตารางที่เต็มไปด้วยค่า NoData ยกเว้นรอบขอบเขต)


โดยสรุปเวิร์กโฟลว์ประกอบด้วยการคำนวณสองฟิลด์ (พิกัดใหม่) ในตารางของเลเยอร์จุดเดิมสร้างเลเยอร์เหตุการณ์จุดจากพิกัดใหม่เหล่านั้นเรียกใช้เครื่องมือตัวอย่างและดำเนินการเข้าร่วมฐานข้อมูล (ไม่ใช่การรวมเชิงพื้นที่) คุณสามารถทำอย่างละเอียดได้อย่างไร (คุณสามารถเห็นภาพของฉันสำหรับปัญหาของฉัน) ขอบคุณ!
เห็น

ฉันมีคะแนนประมาณ 15% มีปัญหานี้ คุณจะกำหนด x0 และ x1 สำหรับแต่ละจุดได้อย่างไร
เห็น

1
@ ดู x0, y0, x1, y1 สำหรับกริด พิกัดจุด (x, y) สามารถคำนวณได้ในเครื่องคำนวณภาคสนามตามที่อธิบายไว้ในวิธีใช้ ArcGIS หรือในหลายกระทู้ในเว็บไซต์นี้ มีรายการเมนูสำหรับสร้างเลเยอร์จุด XY และการรวมฐานข้อมูล: สิ่งเหล่านี้เป็นมาตรฐานการดำเนินการขั้นพื้นฐาน
whuber

4

คุณสามารถแปลงแรสเตอร์เป็นคะแนน ( ref ) จากนั้นทำการรวมเชิงพื้นที่กับคะแนน (จากแรสเตอร์) เป็นจุด

(ฉันเพิ่งเรียนรู้ว่าสามารถเข้าร่วมจุดได้ที่นี่เมื่อวานนี้ )


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

ฉันมีเซลล์นับพันของแต่ละชั้นแรสเตอร์และฉันมี 20 เลเยอร์เช่นนั้น ... ดังนั้นการเปลี่ยนเซลล์เหล่านั้นเป็นเวกเตอร์พอยต์นั้นใช้เวลานาน ...
เคยดู

นอกจากนี้เมื่อฉันพยายาม raster เป็นรูปหลายเหลี่ยมฉันได้รับข้อความแสดงข้อผิดพลาดเป็นข้อผิดพลาด 000864 อินพุตแรสเตอร์: อินพุตไม่อยู่ในโดเมนที่กำหนด ข้อผิดพลาด 000863: ชนิดข้อมูล GP ไม่ถูกต้อง
การกระทำ

คุณได้รับข้อผิดพลาดเมื่อแปลงแรสเตอร์เป็นคะแนนหรือไม่
djq

@celenius ใช้งานได้ แต่ใช้เวลานาน
เห็น

1

คุณสามารถแปลงเลเยอร์แรสเตอร์เป็นรูปหลายเหลี่ยมโดยใช้เครื่องมือ Raster เป็นรูปหลายเหลี่ยมและเรียกใช้การรวมเชิงพื้นที่ (คลิกขวาที่เลเยอร์จุดและเลือกเชื่อมต่อและสัมพันธ์ - เข้าร่วมในการดรอปดาวน์แรกเลือกตัวเลือกการเข้าร่วมเชิงพื้นที่ เพื่อตัวเลือกที่ปุ่ม readio) หรือใช้เครื่องมือใกล้


คุณใช้ผลลัพธ์ของการรวมเชิงพื้นที่เพื่อแยกค่า raster ที่เหมาะสมได้อย่างไร
whuber

@whuber ภายในกล่องโต้ตอบข้อมูลการเข้าร่วมเมื่อคุณเลือกตัวเลือก "ใกล้เคียงที่สุด" การเข้าร่วมเชิงพื้นที่จะเลือกคุณลักษณะรูปหลายเหลี่ยมที่ใกล้ที่สุด (ผลจากเครื่องมือ Raster ไปยังรูปหลายเหลี่ยม) และเพิ่มข้อมูลคุณลักษณะนี้ลงในคุณลักษณะจุด นี่คือสิ่งที่คุณถามคำถามหรือไม่ คำตอบเริ่มต้นของฉันถูกโพสต์ก่อนที่เขาจะแก้ไข ฉันเดาว่าแรสเตอร์ของ Seen อาจใหญ่เกินกว่าจะแปลงเป็นรูปหลายเหลี่ยมได้หรือไม่
artwork21

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

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

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