본문 바로가기

DB

PostgreSql postgis 쿼리

최단거리 경로 검색 쿼리를 만들면서 사용해본 함수들을 대출 설명 해보겠습니다.

상세한 내용은 구글에서 검색 해보면 나옵니다.

 

1. ST_StartPoint, ST_EndPoint

geo 컬럼에는 LINESTRING(x1 y1, x2 y2, x3 y3) 이런식으로 데이터가 들어가 있습니다.

여기서 LINE의 시작점과 종료지점을 찾아서 좌표 뒷자리 5개만 가지고 오게 합니다.

st_astext(ST_StartPoint(geo),5)

st_astext(ST_EndPoint(geo),5)

 

결과는 아래와 같이 나옵니다.

POINT(126.97035 37.57616) 

 

 

2. st_length

geo 컬럼에는 LINESTRING(x1 y1, x2 y2, x3 y3) 길이를 구해 줍니다.

st_length(geo)

 

3. geometry 컬럼 인덱싱

경로 검색을 할때 geometry 컬럼에 대해서 인덱싱을 해줘야 빠르게 찾을 수 있습니다.

create index gis_routing_point_geom_gix on gis_routing_point using GIST(geom);

 

4. ST_DWithin

2지점간의 거리가 파라미터 내에 있는 지점을 구할떄 조건으로 사용하는 함수 입니다.

ST_DWithin(t1.geom ,t2.geom, 3000)

 

5. pgr_dijkstra 

pgr_dijkstra 함수를 이용해서 최단거리 경로 탐색을 합니다.

아래 쿼리를 참조 하시면 됩니다. 반경 3.5Km내에서 최단거리를 찾아 줍니다.

t1테이블에 최단거리를 찾기 위한 좌표들이 들어 있습니다. 

좌표 데이터를 먼저 만들어주고 경로 탐색을 해야 합니다. 

시작 지점은 하나이고 도착지점은 여러개로 되어 있는데, 하나로 해도 상관 없습니다.

SELECT *

FROM pgr_dijkstra(

'select

t1.id, t1.source, t1.target, t1.length as cost, t1.length as reverse_cost

from

public.gis_routing t1, public.gis_routing_point t2

where ST_DWithin(t2.geom, t1.target_geom, 3500)',

(select distinct source from tmp_geo), (select array_agg(target) from tmp_geo),

false

))