เครือข่ายที่กำหนดเส้นทางได้ง่ายขึ้นได้อย่างไร?


24

ฉันมีกราฟเครือข่ายที่ฉันต้องการที่จะลดความซับซ้อนในแง่ของการลดจำนวนของขอบ แนวคิดจะผสานโหนดที่อยู่ติดกันและลบการเชื่อมต่อขอบสั้น

สิ่งนี้จะเกิดขึ้นได้อย่างไรใน PostGIS หรือ GRASS หรือมีวิธีใดที่ดีกว่าในการทำให้เครือข่ายง่ายขึ้นเช่นนี้โดยอัตโนมัติ

ฉันได้ลองใช้ฟังก์ชั่น ST_SnapToGrid แล้ว แต่ฉันไม่พอใจกับผลลัพธ์ (grey = original, black = snapped):

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


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

สำหรับการวิเคราะห์เส้นทางที่สั้นที่สุด
underdark

2
เนื่องจากอัลกอริธึมเส้นทางลัดที่สั้นที่สุดคือ O (E + V) บางทีคุณอาจไม่ต้องการความเรียบง่ายนี้ ในอีกด้านหนึ่งสำหรับการวิเคราะห์เช่นนี้คุณมักจะทำให้การทำให้เข้าใจง่ายขึ้นอย่างมากขึ้น ตัวอย่างเช่นชุดของสามส่วนแบบขนานและส่วนที่อยู่ติดกันทางด้านซ้าย (ดูเหมือน H-in-a-box) สามารถแทนที่ด้วยรูปสามเหลี่ยมได้หากไม่มีจุดเริ่มต้นหรือปลายทางอยู่ภายในส่วนเหล่านั้น ฉันพูดถึงสิ่งนี้เพราะฉันแน่ใจว่ามีรหัส (ไม่ใช่ GIS) สำหรับการดำเนินการดังกล่าวในกราฟ (นามธรรม)
whuber

คุณต้องการที่จะรักษารูปทรงเรขาคณิตของขอบ (เช่นเส้นโค้ง) หรือเป็นเพียงการบำรุงรักษาโครงสร้าง + โหนด XY เพียงพอหรือไม่ นอกจากนี้คุณต้องตรวจสอบให้แน่ใจว่าโหนดที่ Z ต่าง ๆ (เช่นทางยกระดับ) ไม่ได้ติดกันหรือไม่
AnserGIS

โทโพโลยีเป็นกุญแจสำคัญ เรขาคณิตสามารถเปลี่ยนแปลงได้เพียงเล็กน้อย คำสั่ง Z ต้องไม่เป็นอันตราย
underdark

คำตอบ:


7

สิ่งที่ฉันได้มาใกล้ที่สุดคือ:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

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

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


แน่นอนผลลัพธ์อาจไม่ถูกต้อง แต่การใช้v.cleanนั้นน่าสนใจขอบคุณสำหรับการแบ่งปัน
simo

ภาพนั้นสร้างขึ้นในหญ้าหรือไม่?
NetConstructor.com

ภาพแสดงผลลัพธ์ของ GRASS v.clean ที่มองเห็นได้ใน QGIS
underdark

มีปัญหาอะไรบ้างในการรักษา "ทางแยกที่แปลกประหลาด" หรือถนนที่แยกจากเกรด?
dassouki

วิธีการเกี่ยวกับการประมวลผล ST_SnapToGrid หลังจาก v.clean
kttii

5

คุณลองใช้ GRASS v.generalize แล้วหรือยัง?

v.generalizeอนุญาตให้คุณเลือกอัลกอริทึมการวางนัยทั่วไปด้วยแอททริบิวต์method มีพวงคือ: ดักลาส douglas_reduction, หรั่งลด reumann, Boyle, sliding_averaging, distance_weighting, Chaiken, Hermite งูเครือข่ายเคลื่อนที่

และพารามิเตอร์เพิ่มเติมตามthreshold, degree_thresh, angle_thresh(ขึ้นอยู่กับขั้นตอนวิธีการได้รับการแต่งตั้ง) อาจช่วยให้คุณที่จะได้รับผลที่ถูกต้อง

ที่นี่การสอนมา


ขอบคุณสำหรับลิงค์ ฉันลองใช้ดูแม้ว่าฉันจะไม่ได้รับชุดค่าผสมของวิธีและเกณฑ์ที่จะให้ผลลัพธ์ที่ฉันกำลังมองหา
underdark

ฉันไม่สามารถหาวิธี v.generalize ที่จะทำสิ่งที่ฉันต้องการ
underdark

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

ไม่ใช่ algo-guru ที่นี่ แต่ฉันพบว่าวิธีการที่ดีที่สุดสำหรับงู v.genralize วิ่งที่ฉันทำในอดีต
maning

1
สำหรับเร็กคอร์ดพารามิเตอร์ได้รับการทำให้ง่ายขึ้น ณ วันนี้ใน GRASS SVN เพื่อเป็นส่วนหนึ่งของ GRASS 6.4.2
markus

4

ฉันไม่ได้ทำสิ่งนี้ แต่ฉันคิดว่าฉันสามารถแนะนำทิศทางได้

  1. สร้างโทโพโลยีด้วย PostGIS สำหรับกราฟของคุณ
  2. ค้นหาโหนดทั้งหมดที่มีเพียงสองขอบ
  3. รักษาขอบ

ST_ModEdgeHeal จะผสานขอบหนึ่งเข้ากับอีกขอบหนึ่ง ST_NewEdgeHeal จะแทนที่ทั้งสองด้วยขอบใหม่

PostGIS Topology Manual


ขอบคุณ @Sean มันจะทำอะไรอย่างอื่นมากกว่าการรวมสองขอบหรือไม่? มีแนวคิดใดเกี่ยวกับวิธีการลบขอบสั้น ๆ และจัดเรียงโหนดเข้าด้วยกัน?
underdark

@ อันเดอร์ดาร์กฉันไม่เห็นอะไรง่าย ๆ คุณสามารถทำได้ทั้งหมดใน PL / SQL แต่นั่นอาจไม่ช่วย คุณสามารถเรียกใช้ ST_SnapToGrid ก่อนได้หรือไม่
Sean

1

@underdark ฉันเห็นว่าคุณได้เขียนเครื่องมือเพื่อเพิ่มความหนาแน่นของบรรทัดใน Sextante ดังนั้นฉันขอแนะนำอัลกอริทึมต่อไปนี้เพื่อหลีกเลี่ยงการ "สุ่ม" หนึ่งในคะแนนของคุณ

เลือกส่วนของเส้นที่คุณต้องการกำจัดตามความยาว

สำหรับแต่ละเซ็กเมนต์เหล่านั้นให้สร้างจุดที่จุดกึ่งกลาง

ลบเซกเมนต์ขนาดเล็ก

ตอนนี้คุณสามารถใช้ ST_Snap ใน PostGIS (ดูตัวอย่างได้ที่นี่ )

แก้ไข: โปรดทราบว่าในกรณีของคุณคุณสามารถใช้v.netก่อนเพื่อลบ pseudo-nodes (โหนดที่เชื่อมต่อเพียงสองบรรทัด)


โปรดอธิบายอย่างละเอียดว่า v.net สามารถใช้เพื่อลบ pseudo-nodes ได้อย่างไร ขอบคุณ
osmjit

0

การส่งต่อวิธีที่Michaël Michaud วิเคราะห์สิ่งนี้ในรายชื่อผู้พัฒนา OpenJUMP:

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles

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

เพียงเพราะMichaëlทำการทดสอบอย่างรวดเร็วด้วยเครื่องมือกราฟที่มีอยู่ซึ่งเขาเขียนสำหรับ OpenJUMP และพวกเขาไม่สนับสนุนกราฟที่ไม่ใช่ภาพถ่ายในขณะนี้ ข้ามขั้นตอนแรกหาก QGIS และ GRASS มีเครื่องมือที่คล้ายกันซึ่งรองรับกราฟที่ไม่ใช่ภาพถ่าย
user30184

ฉันคิดว่านี่เป็นวิธีที่ถูกต้อง - แยกเครือข่ายออกเป็นกราฟระนาบ ในระนาบกราฟแต่ละกราฟปัญหานั้นง่ายขึ้นตัวอย่างเช่นเราสามารถใช้วิธีการข้างต้นหรือเพียงแค่หาสามเหลี่ยมและกำจัด TIN ของขอบถนนสั้น จากนั้นแยกขอบถนนอีกครั้งและผสานเลเยอร์เข้าด้วยกัน
AnserGIS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.