2014년 3월 28일 금요일

[uDig:experimental] With Driving Distance Enabled (pgRouting 2.0 )

pgRouting으로 Network Service Area와 비슷한 일을 하게 될거 같아 먼저 uDig을 활용하여 기능을 검토해 보았습니다. 아직 GXT Toolbox에 등록되지 않은 실험적인 도구 입니다.

▣ pgRouting 2.0
- http://pgrouting.org/

▣ pgRouting 2.0 Manual
http://docs.pgrouting.org/2.0/en/pgRoutingDocumentation.pdf

▣ Routing Topology
pgr_createTopology fuction을 이용하여 Topology생성
- 위 함수를 사용하기전에 도로 라인 데이터에 source, target 필드를 추가해 놓으면 pgr_createTopology 가 실행될 때 vertex 테이블(도로데이터명칭_vertices_pgr)이 생성되고 vertex ID가 추가됨
- 기타 도로의 length, time 등에 대한 값은 쿼리를 사용하여 계산


▣ pgr_drivingDistance


<툴박스 UI>
- pgRouting을 사용하기 위해 우선 PostGIS 데이터베이스에 연결
- edge table(도로)의 명칭과 기본적인 필드 정보 입력(ID, Source vertex ID, Target vertex ID, Cost)
- vertex table(노드)의 명칭 입력
- 출발지점으로 사용할 레이어 선택
- Cost값 입력 (comma로 여러개의 값을 구분하여 사용)
- 분석결과 Shapefile 저장 경로 설정


▣ Result



- 시작위치로 지정한 레이어의 모든 포인트 위치로 부터 cost값으로 설정한 300m, 600m, 900m, 1200m, 1500m 거리에 도달 가능한 Network Area를 Polygon으로 생성하여 Shapefile로 저장
- Cost로 시간을 선택하고 도로 데이터에 통행시간 필드가 계산되어 있을 경우 도달시간에 따른 분석도 가능


▣ 분석 과정
- 시작위치의 포인트로 부터 가장 가까운 버텍스를 찾음 (추후 UI상에 Tolerance 옵션 추가예정, 현재는 1km 설정)
- PostGIS의 st_expand() 함수를 사용하여 출발지점에서 1000m 확장한 영역과 Vertex레이어의 Geometry 간의 AND(&&) 연산을 수행하고 st_distance() 함수를 사용하여 거리 오름차순으로 정렬하여 최상 Vertex를 Closet Vertex로 설정

-  pgr_drivingDistance() 함수를 사용하여 위에서 찾은 Closet vertex에서 지정한 cost 만큼에 도달 가능한 vertex ID 목록을 생성하고 "도로데이터명칭_vertices_pgr" 테이블의 Vertex ID로 조인하여 Geometry를 가지는 Temp Table을 생성

Temp Table에 pgr_alphAShape() 함수를 사용하여 alpha shape 생성 : 여기서는 도달 가능한 Vertex의 전체 목록에서 Area를 생성하기 위해 가장 외곽의 vertex만 추려내는 과정

st_makeline() 함수로 포인트를 Line으로 생성 (id순서)

- st_makepolygon() 함수를 활용하여 최종 Polygon을 생성하고 st_astext()로 WKT로 리턴

- Geometry(from WKT)와 기타 속성정보를 Shapefile로 저장


▣ 비교

- 아래는 E*** 사의 A**G**로 분석한 결과입니다..