[오픈소스GIS] postgreSQL에 shp파일 올려보기(with. postGIS)
OSGEO 교육자료를 우연히 습득해서 이것저것 해보는 중. 오픈소스 GIS서비스를 만들 때에는 DB로 보통 postgreSQL기반의 postGIS를 쓰고, 백단에 geoserver를 올려서 서비스하는 게 일반적인 것 같다. 오늘은 먼저 postgreSQL, postGIS를 설치하고, 일반적으로 공간 데이터로 사용되는 포맷인 shp를 올려 보는 것 까지 해보자.
https://postgis.net/workshops/postgis-intro/
오늘 할 일은 여기서 잘 설명해 주고 있다. 링크 안에서 4, 5번이 오늘 할 일에 해당한다. (그리고 이 페이지는 그것을 번역만 한 것과 다를 게 없다) 단, 이 곳의 pgAdmin은 3버전이다.
먼저 postgreSQL을 설치해준다. postgreSQL 역시 오픈소스이다.
https://www.postgresql.org/ 살펴 보니 그냥 편하게 binary로 설치해주면 될 것 같다. 아래 링크다.
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
나는 64비트 윈도우 환경에 11.2 최신 버전을 다운로드했다.
pgAdmin은 DB를 관리하고 쿼리를 할 수 있는 GUI환경이다. 같이 설치해 준다.
Stack Builder는 관련된 확장 툴들을 편리하게 설치해 줄 수 있게 해준다.
체크하면 postgreSQL 설치가 끝난 뒤 바로 postGIS를 편하게 설치할 수 있으니 꼭 체크해 주자.
포트넘버, su 비밀번호를 설정하고, Locale은 기본값(Default, System)으로 주고 설치 시작.
Stack Builder를 체크하고 설치했으면, 설치가 끝난 뒤 Stack Builder를 실행하는 옵션이 있다. 체크하고 마치면 Stack Builder가 바로 실행되고, 설치한 서버를 선택하고 다음을 누르면 추가 설치할 수 있는 목록이 나온다. 이 중, 아예 Spatial Extensions가 카테고리로 분류되어 있는 데, 여기 있는 PostGIS 번들을 체크 후 설치하면 된다. (POST GIS + 공간정보 조작에 필수적인 패키지들)
(….) 뭐가 문제인지 모르겠지만 경로를 셋팅하는 과정에서 자꾸 멈춘다.
진행되면 쭉 설치해 주시고, 안되면 그냥 PostGIS를 따로 찾아서 설치해주자.
https://postgis.net/windows_downloads/
나는 64비트 윈도우에 postgreSQL11을 설치했으므로, 맞는 버전을 찾아 설치해준다.
보아하니, postgreSQL11은 postGIS2.5 이후 버전에서만 지원하는 것 같다.
2.5.1 번들을 설치했다.
(링크 안에 릴리즈 버전 - OSGEO 다운로드 링크 - pg11폴더 - exe파일을 받아 설치하면 된다.)
여기까지 했으면 필요한 설치는 끝났다. 이제 DB를 만들어 보자.
먼저, postgreSQL을 컨트롤하는 pgAdmin을 실행시킨다.
postgreSQL 11을 클릭해 접속한다. 아까 설치할 때 설정했던 슈퍼유저 비밀번호를 입력하면 된다.
이런저런 속성 정보와 기본 템플릿, 스키마들을 살펴볼 수 있다.
Database 우클릭 -> Create -> Database… 를 클릭해 새로운 DB를 생성한다.
이름은 마음대로 주고, Definition 탭에서 위와 같이 설정을 해 주고 Save를 누르면 새 DB 생성 완료.
이제 postGIS를 새 DB에 장착(?)시킬 시간이다.
현재 상태는 그냥 일반적인 관계형DB 상태.
postGIS를 장착하면 다음과 같은 쿼리가 가능하다.
SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';
/* https://postgis.net 의 샘플 소스 */
위의 쿼리는 city.name이 Gotham인 city에 포함되는 superhero의 superhero.name을 뽑는 SELECT문이다.
즉, 공간적으로 city는 폴리곤일 것이고, superhero는 포인트일 것인 데, 폴리곤 안에 포함되는 포인트를 뽑아내는 것. postGIS는 이렇게 ST_Contains(A, B)와 같은 공간 연산을 가능하게 한다.
새로 만든 DB에 postGIS를 얹으려면, 다음과 같은 쿼리를 입력해 주어야 한다.
CREATE EXTENSION postgis;
쿼리 입력은 대상이 되는 DB에 마우스 오른쪽 - Query tool을 클릭하면 쿼리 창이 나온다. 여기에 쿼리 입력 후 실행(pgAdmin4 기준번개 모양, F5)하면 된다.
쿼리 입력 후 성공적으로 수행되면, Extensions항목에 postgis가 들어간 것을 볼 수 있다.
Schemas>public에서 다양한 부분에 지리(공간)자료를 다룰 수 있는 것들이 추가되었다.
예를 들어 Types를 살펴 보면(기본적으로는 아무것도 없다.) 지오메트리 관련, 래스터 관련 타입들이…. Functions에서는 아까 보았던 st_contains를 비롯한 다양한 공간 연산 및 정의 함수들이 있는 것을 볼 수 있다. (1200여개 함수가 정의되어 있다.) 특히 주목해야 할 것은 Tables에서 spatial_ref_sys 테이블이다. 이는 좌표계가 정의되어 있는 테이블이다. 해당 테이블에 마우스 우클릭>View Data를 하거나, 쿼리에
SELECT * FROM public.spatial_ref_sys
를 입력하면 그 내용을 모두 볼 수 있는 데, 여기서 srid 컬럼이 우리가 일반적으로 알고 있는 EPSG코드이다.
이제 공간 정보를 갖는 데이터를 올려서 조작할 준비가 다 되었다.
이제 부터는 일반적으로 사용하는 shp파일셋을 우리가 만든 DB에 올려보는 시간이다.
이를 위해서 ‘PostGIS 2.0 Shapefile and DBF Loader Exporter’라는 툴이 필요하다. 이는 postGIS를 설치할 때 번들로 설치되어 왔을 것이다. 못 찾겠으면 postGIS를 설치했던 경로(일반적으로 C:\Program Files\PostgreSQL\11\bin)의 postgisgui 내에 shp2pgsql-gui.exe를 실행하면 된다.
실행하면 먼저 DB서버와 연결 셋팅을 해야 한다. View connection details…를 눌러서 위와 같이 셋팅
(postgres는 기본 계정이고, 5432포트도 기본 포트, Database란에 아까 만든 DB 이름을 넣어준다.)
Add File을 눌러 추가할 shp파일을 올려 준다. 이 때, 좌표계의 EPSG코드를 SRID에 넣어 준다. (더블 클릭으로 편집 가능) 나는 EPSG:5179 좌표계를 가진 일산 주엽역 부근 도로 shp파일을 올려주었다.
혹시 한글 속성 정보가 포함된 파일에서 한글이 깨질 경우 options에서 인코딩을 CP949나 EUC-KR 등으로 바꿔주면 깨짐 없이 읽어올 수 있다.
이후 import를 한다. 혹시 import failed가 뜨면 shp파일셋(dbf포함)이 모두 같은 폴더에 있는 지 확인하고, 그래도 안 되면 디렉토리를 다른 곳으로 옮겨서 시도해 본다.
pgAdmin에서 잘 import되었나 확인해 보자. 바로 database>(DB이름)>Tables를 보면 추가가 안 되어 있는 데,
상단 메뉴에서 Object>Refesh를 한 번 해 주면(새로고침) 같은 경로에 불러온 공간데이터가 잘 포함되어 있다.
참고로 postGIS 테이블은 QGIS에서도 바로 불러다 쓸 수 있다. (아래 테이블은 무시하자)
메뉴에서 postGIS 테이블 추가를 하여 호스트에 local»host로 하여 나머지 항목들을 DB셋팅할 때 사용한 값으로 입력해 주고 연결을 하면 위와 같이 현재 DB에 있는 테이블을 바로 가져올 수 있다.
이 때, SRID를 제대로 설정했으면 불러와서 TMSforkorea를 이용해 웹 지도와 겹쳤을 때 오차 없이 지오메트리가 잘 들어맞을 것이다.
다음 시간에는 postGIS의 기능을 이용한 간단한 쿼리 몇 가지를 해 보고, 이후에는 GeoServer를 통해 만들어진 공간 데이터를 웹에 서비스 하는 기초적인 작업을 해 보자.
osgeo한국어 지부에서 오픈소스GIS에 대한 많은 정보를 얻고 교류할 수 있다.