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


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 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 ( 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.