내가 찾은 해결책을 설명하려고합니다 (아마도 최고는 아닙니다).
포스트 이미지에 따르면, 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 지점 )와 같은지 확인해야합니다 . 이전과 같은 방식으로
실례합니다