설치
도커를 이용한 설치
postgis 플러그인까지 설치된 postgis 도커 이미지가 존재하므로 바로 사용해서 도커에서 실행할 수 있다. 물론 postgres 도커 이미지를 실행한 뒤 postgis 플러그인을 따로 설치할 수도 있다. 아래 예와 같은 도커 명령어로 도커 이미지 설치 및 실행할 수 있다. POSTGRES_PASSWORD=password로 비밀번호는 password가 된다.
docker run --name postgis-container -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgis/postgis
DBeaver로 접속해보면 아래처럼 잘 접속이 된다.
아래 예처럼 postgis에 접속하면 테이블이 이미 존재한다. spatial_ref_sys 테이블에는 8500개 행으로 이루어진 데이터가 존재한다.
실습
데이터베이스 생성
데이터베이스를 직접 만들자.
create database gis_test;
만든 직후에는 아무 테이블이 없다.
아래 명령어로 PostGIS 확장 모듈을 로드한다.
CREATE EXTENSION postgis;
spatial_ref_sys 테이블이 생성된다.
테이블 생성
이번에는 gis_test 밑에 테이블을 만들자.
9. Geometries — Introduction to PostGIS 에 나온 예제 코드 중 일부다.
CREATE TABLE geometries (id SERIAL PRIMARY KEY, name varchar, geom geometry);
geometry 데이터 유형
위에서 테이블을 만들 때 geom의 데이터 타입을 geometry로 했다. geometry 데이터 타입에 넣을 수 있는 데이터 유형은 아래와 같다.
분류 | GEO 데이터 유형 | 설명 | 예 |
기본 | POINT | 점 | POINT(0 0) |
LINESTRING | 선 | LINESTRING(0 0,1 1,2 1,2 2) | |
POLYGON | 다각형(면) | POLYGON((0 0,1 0,1 1,0 1,0 0)) | |
복합 | MULTIPOINT | 점 여러 개 | MULTIPOINT(0 0, 1 1) |
MULTILINESTRING | 선 여러 개 | MULTILINESTRING((0 0, 1 1, 2 1, 2 2), (0 1, 1 2, 2 2, 2 3)) | |
MULTIPOLYGON | 다각형(면) 여러 개 | MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0))) | |
GEOMETRYCOLLECTION | 점, 선, 다각형 다양하게 복합 | GEOMETRYCOLLECTION(POINT (2 0),POLYGON((0 0,1 0,1 1,0 1,0 0))) |
데이터 입력
실제 값을 넣고 select까지 실행해보자.
9. Geometries — Introduction to PostGIS 에 나온 예제 코드를 조금 변형했다.
INSERT INTO geometries (name, geom) VALUES
('Point', 'POINT(0 0)'),
('Linestring', 'LINESTRING(0 0, 1 1, 2 1, 2 2)'),
('Polygon', 'POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))'),
('PolygonWithHole', 'POLYGON((0 0, 10 0, 10 10, 0 10, 0 0),(1 1, 1 2, 2 2, 2 1, 1 1))'),
('MultiPoint', 'MULTIPOINT(0 0, 1 1)'),
('MultiLinestring', 'MULTILINESTRING((0 0, 1 1, 2 1, 2 2), (0 1, 1 2, 2 2, 2 3))'),
('MultiPolygon', 'MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))'),
('Collection', 'GEOMETRYCOLLECTION(POINT(2 0),POLYGON((0 0, 1 0, 1 1, 0 1, 0 0)))');
SELECT name, ST_AsText(geom) FROM geometries;
아래와 같은 결과를 얻을 수 있다.
데이터 타입은 geometry이고 그 안에 데이터는 POINT(), LINESTRING(), ... 형태로 넣는다는 것을 확인할 수 있다.
DBeaver에서 데이터를 더블 클릭하면 지도 데이터이므로 지도가 뜬다.
PostGIS가 제공해주는 SELECT 기능 실습
ST_AsGeoJSON
ST_AsGeoJSON를 활용하면 geometry 데이터를 바로 GeoJSON으로 바꿔준다.
{"type":"LineString","coordinates":[[0,0],[1,1],[2,1],[2,2]]}