SpatiaLite
SpatiaLite는 SQLite에 GIS 지리 정보 데이터베이스에 필요한 기능을 추가해 주는 확장입니다.
데비안에는 spatialite-bin 패키지로 있습니다.
테스트할 자료가 필요해서 구글에서 "행정구역도"로 검색하니 서울시정개발연구원 도면자료 페이지가 나왔습니다. "남한 행정구역도"에서 "시군구경계 SHP" zip 파일을 받았습니다.
SHP란 Shapefile이라는 벡터 자료 포맷입니다. ESRI(한국ESRI)라는 회사에서 만들어서 널리 쓰입니다. 특이하게도 지리 정보가 아닌 정보를 저장하기 위해서는 DBase .dbf를 사용합니다.
$ unzip shp_southKorea_admin.zip $ spatialite spatialite> .loadshp final_sigungu sigungu cp949 load shapefile error: cannot open shapefile 'final_sigungu' cause: 'final_sigungu.dbf' contains unsupported data types
SpatiaLite에는 SQLite의 메타 명령들에 Shapefile을 다루기 위한 .loadshp와 .dumpshp라는 명령이 추가되어 있습니다. 첫 번째 인자로는 Shapefile 이름을 확장자 없이 입력하고, 두 번째 인자로는 SQLite 테이블명 (새로 만들어집니다), 세 번째 인자로는 문자 인코딩을 넘겨줍니다.
그런데 현재 데비안에 패키징되어 있는 2.3.0 버전에는 .dbf의 F 타입(부동소수점 값)에 대한 지원이 없어서 위와 같이 에러가 납니다. 2.3.1 버전을 소스 빌드해 보니 이 문제는 해결이 되어 있었습니다.
소스 빌드를 하지 않으려면 DBase 파일 포맷을 읽고 쓸 수 있는 다른 도구로 .dbf에서 F 타입 필드를 제거하면 됩니다. 저는 파이썬의 dbfpy 모듈을 사용해서 도구를 만들었습니다. (첨부합니다.)
$ python filter.py final_sigungu.dbf new.dbf $ mv new.dbf final_sigungu.dbf
이제 .loadshp 명령을 다시 실행하면,
======== Loading shapefile at 'final_sigungu' into SQLite table 'sigungu' BEGIN; CREATE TABLE sigungu ( PK_UID INTEGER PRIMARY KEY AUTOINCREMENT, OBJECTID INTEGER, GUNAME TEXT, Geometry BLOB); COMMIT; Inserted 232 rows into 'sigungu' from SHAPEFILE ========
쿼리를 해보겠습니다. 면적이 가장 큰 행정구역 5개를 찾아봅시다. (2003년 자료라 현재와는 맞지 않습니다.)
spatialite> select guname, area(geometry) as a from sigungu order by a desc limit 5; 원주시|1806377726.48088 고성군|1653906495.90943 봉화군|1524785151.67461 정선군|1455213815.82865 의성군|1333574637.60126
다른 여러 함수는 SpatiaLite tutorial에 잘 설명되어 있습니다.
첨부 | 파일 크기 |
---|---|
filter.py_.txt | 650바이트 |
댓글 달기