อัลกอริทึมในการคำนวณการครอบคลุม + ทับซ้อนจากชุดของส่วนโค้ง


10

ฉันมีไฟล์รูปร่างที่มีส่วนโค้งที่แสดงเส้นทางที่รถบรรทุกแพร่กระจายไปสู่ฟาร์ม

สมมติว่าฉันรู้ว่าความกว้างสเปรดคือ 30 ม. นั่นคือรถบรรทุกสามารถแพร่กระจายปุ๋ยได้ 15 ม. ทั้งสองข้างของยานพาหนะ

ฉันต้องการสร้างชุดรูปหลายเหลี่ยมซึ่งแสดง:
1) พื้นที่ทั้งหมดที่ได้รับปุ๋ย
2) พื้นที่ของการทับซ้อนคือที่สองรอบที่แยกจากกันอยู่ใกล้กันเกินไปเช่นบางส่วนของฟาร์มได้รับ "ปริมาณที่ถูกต้องสองครั้ง "ปุ๋ย

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

หากมีความเกี่ยวข้องฉันกำลังใช้ TatukGIS VCL DK แต่ฉันกำลังมองหาอัลกอริทึมมากกว่าโซลูชันเฉพาะ

ชี้แจงบางอย่างในการตอบสนองต่อการสนทนาจนถึง:

1) ฉันไม่สามารถพึ่งพาข้อมูลเวกเตอร์ที่มีข้อมูลเมตาใด ๆ (เช่นบันทึก GPS หรืออัตราการแพร่กระจาย) ฉันอนุญาตให้ผู้ใช้เลือกเลเยอร์และระบุความกว้างสเปรดจากนั้นเรียกใช้รายงาน

2) วัตถุประสงค์ของรายงานคือเพื่อแสดงให้ผู้ใช้เห็นว่า "ผู้ชำนาญ" ผู้ประกอบการยานพาหนะเป็นอย่างไรโดยที่ "ผู้ชำนาญ" หมายถึง "ได้รับความคุ้มครองสูงสุดด้วยการทับซ้อนที่ต่ำที่สุด"

3) ฉันรู้สึกสบายใจในที่ดินเวกเตอร์มากกว่าแรสเตอร์ที่ดินดังนั้นจะชอบโซลูชันที่ใช้เวกเตอร์

ขอบคุณ

คาร์เรน


1
ฉันสงสัยว่าสิ่งนี้จะคล้ายกับวิธีที่ทำนายการตกตะกอนสะสมตามเส้นทางของพายุที่คาดการณ์ไว้หรือไม่
Kirk Kuykendall

คำตอบ:


3

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

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

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


ขอบคุณ ฉันกำลังคิดตามคำแนะนำแรกของคุณ - แบ่งเรขาคณิตออกเป็นเซ็กเมนต์ & บัฟเฟอร์พวกเขา ฉันคิดว่าฉันต้องบัฟเฟอร์ส่วนท้ายของเซ็กเมนต์ด้วยเพื่อที่ฉันจะได้มุมมนที่มุม คิดกรณีที่ฉันเริ่มต้นด้วยเส้นมุมฉาก - ถ้าฉันไม่บัฟเฟอร์ปลายฉันจะจบลงด้วยสองสี่เหลี่ยมที่ทับซ้อนกันกับสี่เหลี่ยมที่หายไปที่ด้านนอกของมุม (ยากที่จะแสดงเป็นข้อความ!)
dbruning

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

2

ไม่มีวิธีแก้ปัญหา แต่มีอินพุตบางส่วน:

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

ป้อนคำอธิบายรูปภาพที่นี่

เอกสารนี้ pp. 176 ถึง 180 (เป็นภาษาฝรั่งเศส ... ขอโทษ) ให้อัลกอริทึมในการตรวจสอบชิ้นส่วนที่ตัดกันด้วยตนเอง หลักการคือตามที่เสนอโดยscwเพื่อใช้บัฟเฟอร์ด้านเดียวของแต่ละส่วนที่ประกอบด้วยส่วนบวก 0, 1 หรือ 2 วงกลมโค้ง JTSมีการใช้งานบัฟเฟอร์ด้านเดียวซึ่งอาจมีประโยชน์


ทำไมคุณถึงกังวลเกี่ยวกับการตรวจหาจุดแยกด้วยตนเอง? และทำไมคุณถึงเสนอบัฟเฟอร์ "ด้านเดียว" ดูเหมือนว่าจะไม่มีปัญหากับเชื้อโรค
whuber

จุดประสงค์คือเพื่อตรวจสอบตำแหน่งที่รถบรรทุกแพร่กระจายปุ๋ยหลายครั้งซึ่งเป็นจุดที่พื้นที่การแพร่กระจายกระจายตัวเอง
julien

2

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

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

การเป็นตัวแทน raster สามารถจัดการกับปัญหาเหล่านี้ได้ ปรับเส้นทางของรถแทรคเตอร์ใหม่ สิ่งนี้ตั้งค่าเซลล์ทั้งหมดที่ไม่ข้ามโดยแทรคเตอร์เป็นค่า NoData (หรือเป็นศูนย์) ถ้าแทรคเตอร์นั้นเคลื่อนที่ด้วยความเร็วมาตรฐานคงที่พอเพียงที่จะใส่ค่าคงที่ในแต่ละเซลล์ข้อมูล ยกตัวอย่างเช่นตอนนี้ถ้าแทรคเตอร์เคลื่อนที่ด้วยความเร็วนี้สองเท่า (น่าจะเป็น) อัตราการใช้งานจะลดลงครึ่งหนึ่ง

โดยทั่วไปค่าที่จะใส่ในมือถือใด ๆ ที่เป็นอัตราการประยุกต์ใช้ต่อหน่วยพื้นที่ หากแทรคเตอร์มีการกระจายปุ๋ยอย่างสม่ำเสมอx Kg ต่อวินาทีออกไปที่ 15 เมตรในแต่ละด้านในขณะที่เดินทางด้วยความเร็วy m / วินาทีจากนั้นจะกระจาย x / y Kg / วินาที / [m / sec] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 ปุ๋ย ดังนั้นx / (30 y ) คือค่าที่ใส่ในแต่ละเซลล์ xถูกกำหนดและyคำนวณจากข้อมูล GPS

การตัดกันด้วยตนเองนั้นไม่มีปัญหาในหลักการ หากเส้นทางของรถแทรคเตอร์ข้ามตัวเองให้เพิ่มการสนับสนุนในแต่ละครั้งที่มันข้ามเซลล์ อาจต้องใช้การประมวลผลพิเศษบางอย่างเพื่อให้บรรลุผลนี้ขึ้นอยู่กับวิธีการสร้างกริดและความสามารถของซอฟต์แวร์ GIS

เมื่อทำการเตรียมการเสร็จแล้วส่วนที่เหลือก็รวดเร็วและง่ายดาย: ผลรวมของตารางนี้โดยใช้ย่านวงกลมที่มีรัศมี 15 เมตรพบว่ามีการกระจายจำนวนสะสมต่อหน่วยพื้นที่ในทุกเซลล์


1
+1 ดูเหมือนว่าหากคุณมีเครื่องมือที่อนุญาตให้เคอร์เนล (แทนแทรคเตอร์) เพื่อเลื่อนไปตามเส้นทาง (แทนที่จะใส่ตามแต่ละแถว) ปัญหานี้จะสามารถจัดการได้มากกว่า
Kirk Kuykendall

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

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

@dbruning วิธีนี้ดูเหมือนจะไม่ต้องการอัตราความเร็ว / สเปรดที่ทราบ มันช่วยให้พวกเขา (+ แบบจำลองที่แม่นยำยิ่งขึ้นของความเป็นจริง) หากคุณมี อย่างไรก็ตามจะต้องมีการเพิ่มจำนวนเซลล์การนับเวลาใหม่เพื่อให้ตัวชี้วัดที่คุณต้องการ (ความครอบคลุมพื้นที่โดยรวมพื้นที่ที่ทับซ้อนกัน) ออกจากระบบและยังมีการแลกเปลี่ยนความแม่นยำที่แม่นยำ
Dan S.

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

2

ฉันไม่แน่ใจ 100% ในโปรโตคอล StackExchange ดังนั้นฉันโพสต์สิ่งนี้เป็นคำตอบสำหรับคำถามของฉัน มันเป็นคำตอบที่ฉันใช้

อัลกอริทึมพื้นฐานคือ:
1. แยกส่วนของเรขาคณิตบนเลเยอร์ออกเป็นเซ็กเมนต์ไม่เกิน 1/2 ของความกว้างสเปรด
2. สำหรับแต่ละเซ็กเมนต์:
- สร้าง "บัฟเฟอร์การกลิ้ง" โดยมองย้อนกลับไปตามรูปร่างและบัฟเฟอร์เซ็กเมนต์ก่อนหน้าทั้งหมดที่ความยาวสะสมของเซ็กเมนต์เหล่านั้นน้อยกว่าความกว้างการแพร่กระจาย (รัศมีบัฟเฟอร์ = 1/2 ความกว้างสเปรด)
- สร้าง "บัฟเฟอร์เซ็กเมนต์ถัดไป" ของเซ็กเมนต์ถัดไป (บัฟเฟอร์รัศมี = 1/2 ความกว้างการแพร่กระจาย)
- ลบ "บัฟเฟอร์บัฟเฟอร์" จาก "บัฟเฟอร์เซ็กเมนต์ถัดไป" เพื่อรับ "บัฟเฟอร์ใหม่"
- เข้าร่วมทั้งหมดของ "บัฟเฟอร์ใหม่" รูปหลายเหลี่ยมร่วมกันเพื่อให้ได้รูปหลายเหลี่ยมเดียวต่อรูปร่าง

โดยพื้นฐานแล้วสิ่งนี้ช่วยให้ผู้ขับขี่ยานพาหนะ spreader ทำมุมฉาก (หรือกว้างกว่า) โดยไม่มีการทับซ้อนกัน แต่ถ้าพวกเขาหันหลังกลับอย่างแรงเกินไปเช่นที่พวกเขากระจายไปทั่ว "พื้นเก่า" เราเริ่มทับซ้อนกัน

ทับซ้อนในสีน้ำเงิน

ก้นหูดูเหมือนว่าฉันต้องการ:

เกลียว

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