Làm thế nào để thêm offset cho tuyến đường?


13

Đã chỉnh sửa:

mẫu vật

Tôi muốn phản bác lại câu hỏi của tôi. Giả sử rằng bạn đang ở "Điểm A" và muốn đến "Điểm B". Điểm này sẽ không nằm trong bảng "at_2po_4pgr" vì không phải các nút nguồn / đích. Sau đó, tôi sẽ tìm kiếm nút gần nhất cho các điểm A và B (điểm xanh). Sau này, tôi có thể thực hiện một cuộc gọi ngắn nhất bằng cách sử dụng id điểm xanh và tôi sẽ nhận được đường dẫn "màu cam". Nhưng để có được chi phí đường dẫn thực (khoảng cách) trong trường hợp đầu tiên, tôi sẽ phải trừ "offsetA" và trong trường hợp thứ hai thêm de "offset B". Để tính khoảng cách giữa điểm đỏ và điểm xanh, tôi chạy truy vấn sau:

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

Làm thế nào tôi biết khi thêm hoặc trừ phần bù?

Xin lỗi vì tiếng Anh của tôi!


1
Chào mừng đến với gis.stackexchange. Đây là một trang web Hỏi & Đáp trong đó mỗi chủ đề nên chứa chính xác một câu hỏi và câu trả lời của nó. Vui lòng mở một chủ đề riêng cho câu hỏi số 3. # 2 được trả lời trong gis.stackexchange.com/questions/33471/...
Underdark

1
Tôi có cùng một vấn đề. bạn đã tìm ra được giải pháp nào chưa? Cảm ơn rất nhiều
Robert

1
Xin vui lòng gửi giải pháp của bạn trong phần câu trả lời. Sau đó, nó có thể được nâng cấp.
underdark

Câu trả lời:


2

Tôi không nghĩ rằng bạn có thể dựa vào đỉnh gần nhất. Hãy tưởng tượng nguồn và đích được đặt trên cùng một cạnh gần với cùng một đỉnh.

Bạn muốn xem xét ba! các trường hợp khác nhau:

  1. một đỉnh là điểm gần nhất.
  2. một nút hình thức của cạnh là một nút bên phải
  3. đường biên chính gần hơn. (trực giao)

Xin lỗi nhưng đây không phải là câu trả lời đúng. pgr_trsp - Đường dẫn giới hạn ngắn nhất (TRSP) đã bù đắp như hiển thị cho câu trả lời @amball.
Juan Carlos Oropeza

7

Bạn có thể tìm thấy một chức năng như vậy ở đây: https://github.com/pgRouting/pgrouting-contrib/blob/master/wrapper/routing_core_smart.sql#L69

Nó tìm kiếm liên kết gần nhất trong mạng, thường cho kết quả tốt hơn. Nếu bạn sử dụng Star Star, bạn có thể bắt đầu định tuyến từ / đến liên kết này. Đối với A * hoặc Dijkstra, bạn chọn điểm bắt đầu hoặc điểm kết thúc của liên kết hoặc bạn tạo nút "ảo" bằng cách chia liên kết thành hai.


1

Tôi sẽ giải thích giải pháp mà tôi đã tìm thấy (có lẽ không phải là tốt nhất).

Theo hình ảnh bưu điện, chúng ta hãy giả sử rằng chúng ta đang ở điểm A và chúng tôi sẽ đi đến điểm B . Như tôi đã giải thích ở trên, điểm này không phải là đỉnh (nguồn / mục tiêu trong bảng được tạo bằng công cụ osm2po).

Do đó, chúng ta cần biết hướng đi / lái xe. Nếu chúng ta đi từ đỉnh gần nhất đến Điểm A (điểm xanh lục) qua đường màu cam, chúng ta sẽ phải trừ phần bù giữa Điểm A và điểm xanh lục (đỉnh gần nhất). Nhưng nếu chúng ta phải đi qua đường Calle Almirante Bonifaz , thì chúng ta nên thêm phần bù vào chiều dài của cạnh này (từ điểm xanh đến điểm giao giữa Calle Almirante BonifazCalle San Juan ).

Tôi chạy truy vấn sau để có được đường dẫn ngắn nhất (bạn cần phần mở rộng pgRouting được giải thích ở đây pgRouting - cài đặt và các yêu cầu ở đây cài đặt & yêu cầu ):

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

Điều này dẫn đến một tập hợp các cạnh thể hiện tuyến đường hoàn chỉnh. Ví dụ: một đầu ra có thể cho truy vấn này có thể là:

đầu ra có thể

Trong đó trường gid ( id trong bảng được tạo osm2po) đại diện cho mã định danh cạnh. Chà, chúng ta phải kiểm tra độ lệch ở đầu và cuối (Điểm A / B).

Nếu chúng ta kiểm tra phần bù bắt đầu, chúng ta phải kiểm tra xem cạnh đầu tiên của tập hợp các cạnh thu được trong truy vấn trên có giống với đường dẫn gần nhất đến Điểm A không . Nếu chúng khớp, thì chúng ta sẽ trừ phần bù. Nếu chúng không khớp, chúng tôi sẽ thêm phần bù. Để có được liên kết gần nhất đến một điểm, tôi chạy truy vấn sau:

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

Bạn phải điều chỉnh chức năng này để nó trả về cạnh gần nhất. Trước tiên, bạn phải sửa đổi loại link_point (thêm trường Recent_link ):

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

Bạn cũng phải sửa đổi find_node_by_nearest_link_within_distance . Chỉ cần thêm dòng cuối cùng (tôi chỉ hiển thị một trích xuất từ ​​hàm):

-- 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;

Sau đó, bạn cần biết khoảng cách giữa điểm ( Điểm A / Điểm B ) và cạnh gần nhất (bù). Đối với mục đích này, tôi chạy truy vấn này:

SELECT ST_Line_Locate_Point(geom , point)as offset; 

Trong đó geomtrường_geom trong bảng osm2po được tạo.

Tại thời điểm này, chúng tôi sẽ có phần bù để thêm hoặc trừ.

Cuối cùng, bạn sẽ cần phải biết phần chân cạnh để áp dụng giá trị thu được trong truy vấn ở trên và điều chỉnh giá trị thực (nếu bạn làm việc với loại hình học, bạn sẽ phải chuẩn hóa thành mét giá trị thu được. Chỉ cần nhân 111000 với độ dài thu được trong truy vấn):

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

Nếu chúng ta kiểm tra phần bù cuối, thì chúng ta sẽ phải kiểm tra xem đường dẫn cuối cùng của tập hợp các đường dẫn thu được trong truy vấn trên có giống với đường dẫn gần nhất đến điểm kết thúc ( Điểm B ) không và chúng ta sẽ thêm / trừ cách tương tự như trước đây.

Xin lỗi tiếng anh của tôi


1

Trong pgrouting, pgr_trsp - Turn Restriction Đường dẫn ngắn nhất (TRSP) thực hiện chính xác những gì bạn đang tìm kiếm.

Thay vì chỉ định các nút nguồn và nút đích, bạn có thể chỉ định các cạnh nguồn và đích và phân số dọc theo cạnh nơi gốc và đích của bạn được đặt.

(Bạn có thể sử dụng ST_Line_Locate_Point để lấy phân số đó từ hình dạng điểm của bạn, giả sử bạn biết cạnh gần nhất.)

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.