จะเพิ่ม offsets ในเส้นทางได้อย่างไร?


13

แก้ไข:

ตัวอย่าง

ฉันต้องการลบล้างคำถามของฉัน สมมติว่าคุณอยู่ใน "จุด A" และต้องการไปที่ "จุด B" จุดนี้จะไม่อยู่ในตาราง "at_2po_4pgr" สาเหตุไม่ใช่โหนดต้นทาง / ปลายทาง จากนั้นฉันจะค้นหาจุดที่ใกล้ที่สุดสำหรับจุด A และ B (จุดสีเขียว) หลังจากนี้ฉันอาจทำการโทร shortest_path โดยใช้รหัสจุดสีเขียวและฉันจะได้รับเส้นทาง "สีส้ม" แต่เพื่อให้ได้ต้นทุนเส้นทางจริง (ระยะทาง) ในกรณีแรกฉันจะต้องย่อส่วน "offsetA" และในกรณีที่สองเพิ่ม de "offset B" ในการคำนวณระยะทางระหว่างจุดสีแดงและจุดสีเขียวฉันเรียกใช้แบบสอบถามต่อไปนี้:

SELECT * FROM st_distance( ST_GeomFromText('POINT(-3.6963314 42.3498066)',4326), ST_GeomFromText('POINT(-3.6954276 42.3479634)',4326)).

ฉันจะรู้ได้อย่างไรว่าเมื่อเพิ่มหรือชดเชยการชดเชย?

ขอโทษด้วยสำหรับภาษาอังกฤษของฉัน!


1
ยินดีต้อนรับสู่ gis.stackexchange นี่คือเว็บไซต์ถาม - ตอบที่แต่ละกระทู้ควรมีหนึ่งคำถามและคำตอบ โปรดเปิดชุดข้อความแยกต่างหากสำหรับคำถาม # 3 # 2 ได้รับคำตอบในgis.stackexchange.com/questions/33471/…
underdark

1
ผมมีปัญหาเดียวกัน. คุณพบทางออกหรือไม่? ขอบคุณมาก
Robert

1
กรุณาโพสต์โซลูชั่นของคุณในส่วนคำตอบ จากนั้นก็สามารถอัปโหลดได้
underdark

คำตอบ:


2

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

คุณน่าจะพิจารณาสามข้อ! กรณีที่แตกต่างกัน:

  1. จุดสุดยอดเป็นจุดที่ใกล้ที่สุด
  2. โหนดฟอร์มของขอบเป็นโหนดที่ถูกต้อง
  3. เส้นขอบนั้นใกล้กว่า (ฉาก)

ขออภัยนี่ไม่ใช่คำตอบที่ถูกต้อง pgr_trsp - เลี้ยวทางลัดที่สั้นที่สุดของข้อ จำกัด (TRSP) ได้ชดเชยตามที่แสดงสำหรับคำตอบ @amball
Juan Carlos Oropeza

7

คุณสามารถค้นหาฟังก์ชันดังกล่าวได้ที่นี่: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69

มันค้นหาลิงค์ที่ใกล้ที่สุดในเครือข่ายซึ่งมักจะให้ผลลัพธ์ที่ดีกว่า หากคุณใช้ Shooting Star คุณสามารถเริ่มเส้นทางจาก / ไปยังลิงก์นี้ สำหรับ A * หรือ Dijkstra คุณเลือกจุดเริ่มต้นหรือจุดสิ้นสุดของลิงก์หรือคุณสร้างโหนด "เสมือน" โดยแยกลิงก์ออกเป็นสองส่วน


1

ฉันจะอธิบายวิธีแก้ปัญหาที่พบ (อาจไม่ดีที่สุด)

ตามที่โพสต์ภาพสมมติว่าเราอยู่ในจุด Aและเราจะไปที่จุด B ดังที่ฉันได้อธิบายข้างต้นจุดนี้ไม่ได้จุดสุดยอด (แหล่งที่มา / เป้าหมายในตารางที่สร้างขึ้นด้วยเครื่องมือ osm2po)

ด้วยเหตุนี้เราจำเป็นต้องรู้ทิศทางการเดิน / ขับรถ หากเราไปจากจุดสุดยอดที่ใกล้ที่สุดไปยังจุด A (จุดสีเขียว) ผ่านเส้นทางสีส้มเราจะต้องลดการชดเชยระหว่างจุด Aและจุดสีเขียว (จุดสุดที่ใกล้ที่สุด) แต่ถ้าเราต้องผ่านถนนCalle Almirante Bonifazเราควรเพิ่มออฟเซ็ตตามความยาวของขอบนี้ (จากจุดสีเขียวไปจนถึงจุดตัดระหว่างCalle Almirante BonifazและCalle San Juan )

ฉันเรียกใช้แบบสอบถามต่อไปนี้เพื่อรับเส้นทางที่สั้นที่สุด (คุณต้องการส่วนขยาย pgRouting อธิบายที่นี่pgRouting - การติดตั้งและข้อกำหนดที่นี่การติดตั้งและข้อกำหนด ):

SELECT gid, cost, st_astext(the_geom) as the_geom FROM dijkstra_sp_delta('xx_2po_4pgr', source_vertex, target_vertex, 0.1);

ซึ่งส่งผลให้ชุดของขอบที่แสดงถึงเส้นทางที่สมบูรณ์ ตัวอย่างเช่นหนึ่งผลลัพธ์ที่เป็นไปได้สำหรับแบบสอบถามนี้อาจเป็น:

ผลลัพธ์ที่เป็นไปได้

ตำแหน่งที่gid ของฟิลด์( idในตารางที่สร้างจาก osm2po) แสดงถึงตัวระบุขอบ เราต้องตรวจสอบค่าชดเชยในตอนเริ่มต้นและตอนท้าย (คะแนน A / B)

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

SELECT * FROM find_node_by_nearest_link_within_distance(point, 0.1, 'xx_2po_4pgr') as id;

คุณต้องปรับฟังก์ชั่นนี้เพื่อที่จะคืนค่าขอบที่ใกล้ที่สุด ก่อนอื่นคุณต้องปรับเปลี่ยนlink_pointชนิด (เพิ่มnearest_linkเขต):

CREATE TYPE link_point AS
   (id integer,
    name character varying,
    nearest_link integer);
ALTER TYPE link_point
  OWNER TO postgres;

นอกจากนี้คุณยังต้องแก้ไขfind_node_by_nearest_link_within_distance เพียงเพิ่มบรรทัดสุดท้าย (ฉันจะแสดงเฉพาะสารสกัดจากฟังก์ชั่น):

-- Searching for a nearest link

    FOR row in EXECUTE 'select id from find_nearest_link_within_distance('''||point||''', '||distance||', '''||tbl||''') as id'
    LOOP
    END LOOP;
    IF row.id is null THEN
        res.id = -1;
        RETURN res;
    END IF;
    link:=row.id;
    res.nearest_link:=link;

จากนั้นคุณจำเป็นต้องรู้ว่าระยะห่างระหว่างจุดใด ( จุด A / จุด B ) และขอบที่ใกล้ที่สุด (ชดเชย) เพื่อจุดประสงค์นี้ฉันเรียกใช้แบบสอบถามนี้:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

ที่ไหนGeomเป็นthe_geomฟิลด์ในตารางที่สร้าง osm2po

ณ จุดนี้เราจะมีออฟเซ็ตเพื่อเพิ่มหรือย่อส่วน

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

select st_length(the_geom) from (select ST_ASTEXT(the_geom) as the_geom FROM dr_2po_4pgr WHERE id= edge_identifier)t";

หากเราจะตรวจสอบจุดสิ้นสุดของจุดสิ้นสุดเราจะต้องตรวจสอบว่าเส้นทางสุดท้ายของชุดเส้นทางที่ได้จากแบบสอบถามด้านบนนั้นเหมือนกับเส้นทางที่ใกล้ที่สุดไปยังจุดสิ้นสุด ( จุด B ) และเราจะเพิ่ม / ย่อยที่ แบบเดียวกับก่อน

ขอโทษภาษาอังกฤษของฉัน


1

ใน pgrouting, pgr_trsp - Turn Shortest Path Shortest (TRSP) ทำสิ่งที่คุณต้องการอย่างแท้จริง

แทนที่จะระบุโหนดต้นทางและโหนดเป้าหมายคุณสามารถระบุขอบต้นทางและเป้าหมายและเศษส่วนตามขอบที่ต้นทางและปลายทางของคุณตั้งอยู่

(คุณสามารถใช้ ST_Line_Locate_Point เพื่อรับเศษส่วนนั้นจากรูปทรงเรขาคณิตของจุดโดยสมมติว่าคุณรู้ขอบที่ใกล้เคียงที่สุด)

ดูhttp://docs.pgrouting.org/2.0/en/src/trsp/doc/index.html#trsp

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