경로에 오프셋을 추가하는 방법은 무엇입니까?


13

편집 :

견본

내 질문을 설명하고 싶습니다. "Point A"에 있고 "Point B"로 가고 싶다고 가정하십시오. 이 포인트는 "at_2po_4pgr"테이블에 있지 않으므로 소스 / 대상 노드가 아닙니다. 그런 다음 점 A와 B (녹색 점)에 가장 가까운 노드를 검색합니다. 그런 다음 녹색 포인트 ID를 사용하여 shortest_path 호출을 수행하고 "오렌지"경로를 얻을 수 있습니다. 그러나 첫 번째 경우 실제 경로 비용 (거리)을 얻으려면 "offsetA"를 빼고 두 번째 경우 "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에 오신 것을 환영합니다. 이것은 각 스레드가 정확히 하나의 질문과 답변을 포함해야하는 Q & A 사이트입니다. 질문 # 3을 위해 별도의 스레드를여십시오. # 2에 대한 답변 gis.stackexchange.com/questions/33471/...
언더 다크

1
나는 같은 문제를 가지고있다. 해결책을 찾았습니까? 감사합니다
Robert

1
답변 섹션에 솔루션을 게시하십시오. 그런 다음 upvoted 할 수 있습니다.
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 BonifazCalle 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 ( osm2po 생성 테이블의 id )는 에지 식별자를 나타냅니다. 글쎄, 우리는 시작과 끝에서 오프셋을 확인해야합니다 (포인트 A / B).

시작 오프셋을 확인하면 위 쿼리에서 얻은 가장자리 세트의 첫 번째 가장자리가 Point 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 은 osm2po 생성 테이블 의 the_geom 필드입니다.

이 시점에서 더하거나 빼기위한 오프셋이 있습니다.

마지막으로, 위의 쿼리에서 얻은 값을 적용하고 실수를 조정하려면 가장자리 길이를 알아야합니다 (지오메트리 유형으로 작업하는 경우 얻은 값을 미터로 정규화해야합니다. 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-회전 제한 최단 경로 (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.