วิธีตรวจจับจุดแยกบนถนนที่มีประสิทธิภาพบนแผนที่คืออะไร


14

ฉันอาจได้รับแผนที่จากแหล่งใด ๆ สำหรับโครงการของฉันและสำหรับอัลกอริทึม C ++ ที่ฉันทำมันเป็นสิ่งจำเป็นสำหรับอัลกอริทึมที่จะทราบว่าทางแยกถนน (โหนดที่มีส่วนของถนนมากกว่าสองแห่งพบกัน) นอกจากนี้ในหลาย ๆ แผนที่ที่ฉันได้รับมีการแก้ไขปัญหาถนนและการตัดทอน (เช่น: ถนนไม่ได้เชื่อมต่ออย่างถูกต้อง) วิธีหนึ่งในการแก้ไขปัญหาคือ 'ทำความสะอาด' เครือข่ายถนนโดยใช้ Autocad คำถามที่ฉันมีคือ:

  1. มีวิธีที่มีประสิทธิภาพ (ซอฟต์แวร์ใดบ้างที่สามารถทำได้?) เพื่อให้ได้แผนที่ของฉันในรูปแบบ GML ซึ่งมีข้อมูลเกี่ยวกับทางแยกถนนในแผนที่? (อาจมีแท็ก GML ซึ่งระบุว่าโหนดใดโหนดหนึ่งเป็นทางแยก)
  2. มีวิธีอื่นในการ 'ทำความสะอาด' เครือข่ายถนนหรือไม่?

เพื่อนร่วมงานแนะนำ FME แต่เกี่ยวข้องกับการเขียนสคริปต์และเราไม่แน่ใจว่าสคริปต์นั้นจะมีความยืดหยุ่นเพียงพอที่จะรองรับแผนที่ทั้งหมดหรือไม่ อีกวิธีหนึ่งในการตรวจสอบทางแยกคือการใช้กำลังดุร้ายและค้นหาว่าส่วนถนนใดที่มีโหนดทั่วไป ArcGIS จะช่วยเหลือไหม? (ยังไม่ได้ใช้ แต่เคยได้ยิน) ฉันแน่ใจว่าควรมีวิธีที่ดีกว่า ...


2
จำเป็นต้องหาถนนที่ตัดกันด้วยตนเองหรือไม่? มันควรจัดการกับรูปทรงที่เสื่อมโทรมอย่างไร (polylines ที่ทุกจุดตรงจึงมีความยาวเป็นศูนย์) มันควรจะจัดการกับเส้นตรงที่จุดตัดเป็นส่วนที่เป็นเส้นตรงไม่ใช่แค่จุดได้อย่างไร
Kirk Kuykendall

@ Kirk: ฉันตกใจเล็กน้อยกับสถานการณ์ที่คุณพูดถึง ฉันใหม่กับ GIS และไม่รู้ด้วยซ้ำว่าความเป็นไปได้นั้นมีอยู่จริง 1. ทางแยกเองต้องมีหลายส่วน ฉันจะถือว่าสี่แยกนั้นเป็นทางแยก 2. ฉันไม่สามารถจินตนาการได้ว่าเรขาคณิตใดที่เสื่อมโทรมดังนั้นฉันไม่รู้ว่าจะตอบอย่างไร 3. การรวมเส้นควรจะถือว่าเป็นถนนสองสายที่แยกกันเพราะนั่นคือวิธีที่ฉันคิดว่าพวกเขาจะอยู่ในชีวิตจริงด้วย
Nav

คำตอบ:


9

หากคุณมีถนนในรูปแบบพื้นที่เช่น Shapefile คุณสามารถโหลดลงใน PostGIS และให้หาถนนที่ใช้แบบสอบถาม SQL โดยอัตโนมัติ ฉันเคยทำมาก่อน - คำสั่ง SQL ถูกออกแบบมาเพื่อค้นหาถนนแต่ละเส้นที่ตัดกันทางภูมิศาสตร์และสร้างจุดปมสำหรับแต่ละจุดตัด

ฉันจะพยายามล้างข้อมูลนี้ในภายหลัง แต่นี่เป็นขั้นตอนพื้นฐานที่คุณสามารถใช้ ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

ฟังก์ชั่น ST_ * เป็นสิ่งที่ทำให้งานนี้ภายใน PostGIS

  • ST_Envelope : คว้ากล่องขอบเขตของรูปทรงที่กำหนด - นี่ใช้เพื่อเร่งอัลกอริธึม เราสามารถ จำกัด การค้นหาทางภูมิศาสตร์ให้แคบลงด้วยช่องว่างในบัตรผ่านที่รวดเร็ว แต่แม่นยำน้อยกว่าจากนั้นสแกนผลลัพธ์ด้วยรูปทรงเรขาคณิตที่แท้จริง
  • ST_Intersects : พิจารณาว่ารูปเรขาคณิตสองรายการตัดกันหรือไม่
  • ST_Intersection : ส่งคืนจุดตัดของรูปทรงเรขาคณิตสองแห่ง

ต่อไปนี้เป็นตัวอย่างเท่านั้นเนื่องจากฉันไม่มีเวลาให้เสร็จบางทีบางคนสามารถแก้ไขได้ก่อนที่ฉันจะกลับมาที่นี่ ...

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id

เพียงแชร์: ฐานข้อมูลอื่นที่ฉันเจอคือ - < oracle.com/technetwork/database/berkeleydb/overview/index.html > เห็นได้ชัดว่าการสืบค้นมีความรวดเร็วมากเนื่องจากการสืบค้นมีอยู่ในไลบรารีซึ่งสามารถฝังในแอปพลิเคชันได้
Nav

1
@ dmsnell- คุณอาจให้ตัวอย่างประเภทของแบบสอบถาม SQL ที่ใช้ในการทำงานนี้ได้หรือไม่
RyanKDalton

11

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

ในกรณีนี้การบัฟเฟอร์ถนนด้วยจำนวนเล็กน้อยจากนั้นบัฟเฟอร์โดยการลบจำนวนเดียวกันจะทำให้ "เกาะ" เล็ก ๆ รอบ ๆ โค้งทั้งหมดและรอบ ๆ ทางแยกทั้งหมด นี่เป็นการพิสูจน์ทางเรขาคณิตได้ง่าย

นี่คือตัวอย่างของบัฟเฟอร์ polyline 10 ม. (สีเทา) และบัฟเฟอร์ -10 m (สีแดงอ่อน) ในแผนที่ที่มีความกว้าง 650 ม.:

รูปที่ 1

ตอนนี้ตัดเลเยอร์ polyline ดั้งเดิมกับรูปหลายเหลี่ยมเกาะเหล่านี้รวมส่วนต่างๆตามตัวระบุเกาะและนับจำนวนชิ้น:

รูปที่ 2

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

เนื่องจากสมมาตรของการบัฟเฟอร์เซนทรอยด์ของเกาะสี่แยกเป็นจุดตัด

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


6

ใช่คุณสามารถทำได้ด้วย FME อย่างแน่นอน มี "หม้อแปลง" จำนวนมากที่จัดการกับการล้างข้อมูลจุดตัดและทอพอโลยี ฉันจะลองใช้หม้อแปลงTopologyBuilderในกรณีนี้

การเขียนสคริปต์ทั้งหมดนั้นกระทำในสภาพแวดล้อมแบบกราฟิกดังนั้นจึงง่ายมากที่จะทำ

คุณสามารถรับรุ่นทดลองได้จาก www.safe.com

(การเปิดเผยข้อมูล: Mark Ireland, aka FME Evangelist, Safe Software Inc. )


ฉันที่สองนี้ FME นั้นยอดเยี่ยมสำหรับปัญหานี้โดยเฉพาะการเปลี่ยนจาก AutoCAD เป็น GML และการล้างข้อมูลเชิงทอพอโลยี มันสามารถเป็นสากลอย่างน่าประหลาดใจในการประยุกต์ใช้
blord-castillo


-1

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


-1

กระบวนการสามารถทำได้ใน ArcGIS กับนักวิเคราะห์เครือข่าย

นอกจากนี้ยังมีอีกวิธีหนึ่งใน ArcGIS: คุณสามารถทำตามขั้นตอนต่อไปนี้: "Arctoolbox" → "เครื่องมือจัดการข้อมูล" → "คุณสมบัติ" → "จุดยอดคุณลักษณะไปยังจุด" และคุณสามารถทำสิ่งที่คุณต้องการได้

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