PgRouting - วิธีคลิปลิงค์เมื่อถึงต้นทุนสูงสุด?


13

ฉันมี polyfile เชพไฟล์ที่เป็นตัวแทนเครือข่ายถนนและมีไฟล์รูปร่างที่สองที่มีจุด ฉันต้องการใช้ PostGIS (น่าจะเป็น PgRouting) เพื่อระบุเครือข่ายย่อยหรือพื้นที่ให้บริการที่แผ่จากจุดเหล่านี้

โดยพื้นฐานแล้วฉันหวังว่าจะถามคำถาม "เริ่มต้นจากจุดที่ X ฉันจะเดินไปในทิศทางใดได้บ้างโดยกำหนดงบประมาณการเดินทางทั้งหมด 1 กม. ตามเครือข่ายถนน" ผลที่ได้จะเป็นชุดของโพลิลีนที่ถูกตัดซึ่งแสดงถึงความเป็นไปได้ในการเดินทางทั้งหมดโดยมีงบประมาณการเดินทาง 1 กม.

สำหรับการอ้างอิงการวิเคราะห์ GRASS นี้ดูเหมือนจะเป็นสิ่งที่ฉันต้องการทำ (ยกเว้นฉันต้องการทำสิ่งนี้ใน PostGIS): http://www.gdf-hannover.de/lit_html/grass60_v1.2_th/node57.html#sec: optalloc

ตัวอย่างต่อไปนี้ดูเหมือนจะเป็นเกือบสิ่งที่ฉันต้องการจะทำ แต่มันดูเหมือนว่าจะตอบคำถาม "ซึ่งโหนดฉันสามารถเดินทางไปรับงบประมาณการเดินทางของ X ระยะทาง?" http://underdark.wordpress.com/2011/02/12/drive-time-isochrones/

อย่างที่สองนั้นไม่ใช่คำตอบที่ฉันกำลังมองหาเพราะฉันต้องการให้ polylines ตัดกับระยะทางในการเดินทางของฉัน - ฉันไม่สนใจหรอกว่าฉันจะไปถึงจุดใด


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

คำตอบ:


2

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

หากคุณยังไม่ได้ติดตามการสนทนาในรายชื่อผู้ใช้ pgRoutingพวกเขาได้พูดคุยเกี่ยวกับตัวเลือกเพิ่มเติมเมื่อเร็ว ๆ นี้ (หัวข้อพฤษภาคม & มิถุนายน 2011)


1
การสนทนารายชื่อผู้ใช้ที่น่าสนใจ น่าเสียดายที่ฟังก์ชั่นการขับรถระยะไกลไม่ดี
underdark

1

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

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


1
มีความละเอียดอ่อนในขั้นตอนสุดท้าย: ขอบบางอย่างสามารถเข้าถึงได้จากจุดปลายอย่างใดอย่างหนึ่ง สิ่งนี้อาจทำให้บางส่วนของปลายทั้งสองถูกรวมไว้หรือแม้แต่ขอบทั้งหมดแม้ว่าการข้ามขอบทั้งหมดจากจุดปลายด้านใดด้านหนึ่งจะเกินขีด จำกัด งบประมาณ เช่นพิจารณาการเดินทางจากจุดaไปตามกราฟที่ไม่ได้บอกทิศทางด้วยหน่วยความยาวขอบ {(a, b), (a, c), (b, c)} และงบประมาณ 1.6 คุณสามารถเข้าถึงbหรือcในราคา 1 โดยเหลือ 0.6 ที่จะใช้จ่าย ทำให้ทุกจุดตามขอบ (b, c) สามารถเข้าถึงได้
whuber

คุณถูกต้องแล้ว :) +1
Ragi Yaser Burhum

1

"เริ่มต้นจากจุด X ฉันสามารถเดินไปในทิศทางใดได้ไกลแค่ไหนด้วยงบประมาณการเดินทางทั้งหมด 1 กม. ตามเครือข่ายถนน"

เนื่องจากคุณจะต้องพิจารณาพื้นที่เล็ก ๆ (รัศมี 1 กม. สูงสุด) คุณอาจหนีไปได้ด้วยการแบ่งลิงก์ออกเป็นชิ้นเล็ก ๆ หลายชิ้น (ขึ้นอยู่กับความแม่นยำที่คุณต้องการบรรลุ) และสร้างโหนดที่จำเป็น เครือข่าย "ความละเอียดสูง" ที่ได้ควรจะยังคงสามารถจัดการได้

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