2014년 1월 20일 월요일

[PostGIS] Custom Function for Reprojecting Geometry Table

PostGIS를 사용하면서 약 300여개의 레이어(Geometry Table)의 좌표계를 한꺼번에 변환할 일이 생겨서 하나씩 작업하려다 좌표를 변환하는 함수(UpdateGeometrySRID 함수처럼 단순히 좌표를 정의하는 함수가 아니고 물리적으로 좌표변환를 수행)를 하나 만들어 봤습니다.

PostGIS 2.0 이상부터는 다음과 같은 DDL 함수를 이용하여 좌표를 변환할 수 있으나 아래 붉은색으로 표시된 부분을 각각의 레이어마다 지정해야 주어야 하는 번거로움이 있습니다.


   ALTER TABLE roads
      ALTER COLUMN geom TYPE geometry(MultiLineString, 3857)
         USING ST_Transform(geom, 3857);

아래 과정을 따라 하면 데이터베이스 내의 모든 레이어에 대한 좌표변환을 수행할 수 있습니다.

▣ Download
 - PostGIS_TransformGeometryTable.sql
 - PostGIS_TransformGeometryTable_All.sql

▣ Install Functions
 - pgAdmin을 실행한 후 적용할 Database에 연결
 - Query Tool(Ctrl-E) 실행 후 다운로드한 SQL(2개 파일)을 각각 실행하여 함수 등록
 - 등록된 함수 화면


▣ Usages
 ⊙  TransformGeometryTable
 - 하나의 레이어에 대해서 좌표변환 수행
 - 아래 예에서 public은 스키마, roads는 테이블, 3857(구글 좌표계)은 변환할 EPSG 코드이며, 스키마를 생략하면 현재 활성화된 스키마를 사용함
 - SELECT TransformGeometryTable('public', 'roads', 3857)

 ⊙ TransformGeometryTable_All
 - 연결된 데이터베이스의 좌표가 정의된 모든 레이어에 대해서 EPSG:3857 좌표계로 변환
 - SELECT TransformGeometryTable_All(3857)

▣ 주의사항
 - 원본 레이어는 반드시 좌표체계를 가져야 하며, UpdateGeometrySRID 함수를 이용해서 등록이 가능
 - 원본 레이어(Geometry Table)의 Geometry를 모두 변환하며, 투영의 특성상 다시 복원하더라도 원본 좌표값과 동일하지 않으므로 주의