2013년 10월 9일 수요일

Tips for the PostGIS

▣ PostGIS Version: SELECT PostGIS_Full_Version();
 - "POSTGIS="2.0.1 r9979" GEOS="3.3.3-CAPI-1.7.4" PROJ="Rel. 4.7.1, 23 September 2009" LIBXML="2.7.8""

▣ View 레이어 생성하기
⊙ PostGIS 2.0에서 기존 레이어로 뷰를 생성했을 때, geometry_columns에 srid 및 type이 제대로 표시되지 않을 경우에 해결책입니다.

⊙ 우선 View가 이미 있는 경우 뷰를 삭제합니다.
DROP VIEW view_name;

⊙ 기존 building 레이어에서 도형의 면적이 300을 넘는 building을  building_view 뷰로 생성하는 예입니다.
 - 다음과 같이 geometry 컬럼에 정확한 Geometry 타입 및 SRID를 정의해 주면 됩니다.
CREATE VIEW building_view AS
 SELECT gid AS gid, the_geom::geometry(MultiPolygon, 5174) AS the_geom
 FROM building 
 WHERE ST_Area(the_geom) > 300;

⊙ 기존 building 레이어를 WGS84 경위도 좌표계로 변환한 포인트 building_point_4326 뷰로 생성
 - 다음은 building 폴리곤의 중심점을 추출하고 좌표계를 변환하는 예를 포함합니다.
CREATE VIEW building_point_4326 AS
 SELECT building.gid AS gid, ST_Transform(ST_Centroid(building.the_geom), 4326)::geometry(Point, 4326) AS the_geom
 FROM building;

▣ 기존 레이어의 SRID 정의
PostGIS 공간테이블(레이어)의 좌표체계를 정의하는 방법은 UpdateGeometrySRID 함수를 이용하면 됩니다. 2.0 버전부터는 DDL을 이용하여 기존 레이어의 좌표체계 정의 및 변환까지 가능하게 되었습니다.

⊙ UpdateGeometrySRID 함수를 이용하는 방법
 - 기존 Unknown 좌표계를 WGS84 경위도 좌표계로 정의
SELECT UpdateGeometrySRID('roads', 'geom', 4326);

⊙ DDL을 이용하는 방법 - 2.0 버전부터 적용
 - 기존 Unknown 좌표계를 WGS84 경위도 좌표계로 정의
ALTER TABLE roads
  ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326)
    USING ST_SetSRID(geom,4326);

▣ 테이블 생성 없이 기존 레이어의 Geometry 좌표 변환후 업데이트
⊙ DDL을 이용하는 방법 - 2.0 버전부터 적용
 - 기존 WGS84 경위도 좌표계의 레이어를 구글 좌표계(일반적으로 900913을 많이 사용하지만 EPSG 공식 코드는 3857임)로 변환
ALTER TABLE roads
 ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 3857)
    USING ST_Transform(ST_SetSRID(geom, 4326), 3857) ;

▣  참고
 - http://postgis.net/docs/using_postgis_dbmanagement.html
 - http://postgis.org/docs/UpdateGeometrySRID.html