2011년 6월 7일 화요일

[Tips]PostGIS - Shapefile and DBF Loader

PostgreSQL(+ PostGIS)를 사용할 때 Shapefile 및 좌표체계와 관련된 팁입니다.


우선 pgAdmin III 도구를 실행한 후 다음과 같이 shapefile을 업로드합니다.


▣ PostGIS Shapefile and DBF Loader
SRID는 이미 알고 있는 경우는 그 코드를 입력하면 되고, EPSG 코드를 모르는 경우 http://spatialreference.org/ 사이트를 참고하여 정확한 코드를 확인 후 입력하면 됩니다. 
가장 정확하게는 PostGIS의 spatial_ref_sys 테이블을 열고 확인합니다.


▣ DBF file character encoding : EUC-KR 또는 CP949 입력
Shapefile and DBF Loader 도구를 사용하는 경우 한글속성이 포함된 shapefile의 경우 character encoding 설정에 유의해야합니다.


Import 버튼을 누르면 PostGIS로 변환됩니다.


▣ 좌표체계의 정의
다음은. 만약 원본 shapefile의 좌표체계가 정의되지 않았을 경우 좌표체계를 정의하는 방법입니다. geometry_columns 테이블을 열어보면 좌표체계가가 정의되지 않은 레이어는 다음과 같이 srid 값이 -1로 나타납니다.


일반적으로 아래의 두 SQL문을 Query Tool을 이용하여 입력 후 실행하면 좌표체계를 정의의할 수 있습니다.
 - UPDATE geometry_columns SET srid = 2097 WHERE f_table_name = 'polyline';
 - UPDATE polyline SET the_geom = ST_SetSRID(the_geom, 2097);
위 그림과 같이 enforce_srid_the_geom constraint 오류가 발생하는 경우 다음 절차를 통해서 해결 할 수 있습니다.


▣ Constraint 확인 : CONSTRAINT enforce_srid_the_geom CHECK (st_srid(the_geom) = (-1))
▣ Constraint 제거
다음과 같은 SQL문을 실행하거나
 - ALTER TABLE 테이블명 DROP CONSTRAINT Constaint명;
pgAdmin 도구에서 해당 레이어의 Constraint를 찾아서 삭제해 주면 됩니다.


▣ 좌표체계 정의 SQL
다음 기존의 Constraint를 삭제하고 레이어를 2097 좌표체계로 정의하는 전체 SQL입니다.


- ALTER TABLE polyline DROP CONSTRAINT enforce_srid_the_geom;
- UPDATE geometry_columns SET srid = 2097 WHERE f_table_name = 'polyline';
- UPDATE polyline SET the_geom = ST_SetSRID(the_geom, 2097);


만약 PostGIS 함수를 이용하면 좌표체계 정의 과정을 한번에 끝낼 수있습니다.
 - SELECT UpdateGeometrySRID('polyline', 'the_geom', 2097);


* PostgreSQL : http://www.postgresql.org/