16.1. Lesson: PostGIS 설정

PostGIS 기능을 설정하면 PostgreSQL이 내장한 공간 기능에 접근할 수 있습니다.

이 강의의 목표: 공간 기능을 설치하고 그 효과를 간단히 실행해보기.

참고

이번 예제에서는 PostGIS 2.1 이후 버전을 사용한다고 가정합니다. 설치 및 데이터베이스 설정은 이전 버전과 다르지만, 이 모듈에서 소개하는 다른 기능을 실행하는 데 문제는 없을 겁니다. 설치 및 데이터베이스 설정에 대한 도움말은 사용자 플랫폼에 대한 PostGIS 문서를 참조하십시오.

16.1.1. 우분투 설치

apt를 통해 PostGIS를 간단히 설치할 수 있습니다.

$ sudo apt install postgresql
$ sudo apt install postgis

네, 정말로 쉽죠…

참고

사용자의 우분투 버전 및 환경 설정한 저장소에 따라 설치될 정확한 버전이 달라질 것입니다. 설치 후, psql이나 다른 도구에서 select PostGIS_full_version(); 쿼리를 실행하면 설치된 버전을 알 수 있습니다.

특정 버전을 (예를 들면 PostgreSQL version 13 및 PostGIS 3을) 설치하려면, 다음 명령어를 사용하면 됩니다.

$ sudo apt install wget ca-certificates
$ sudo lsb_release -a
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
$ sudo apt-get update
$ sudo apt install postgis postgresql-13-postgis-3

16.1.2. 윈도우 설치

일반적인 윈도우 설치 대화창을 사용하는 바이너리 패키지로 윈도우에 설치할 수 있습니다.

먼저 다운로드 페이지 로 간 다음, 이 지침 을 따르십시오.

PostGIS 웹사이트 에서 윈도우 설치에 대한 자세한 정보를 얻을 수 있습니다.

16.1.3. 다른 플랫폼 설치

PostGIS 웹사이트 다운로드 페이지 에 맥OS 및 다른 리눅스 배포판을 포함한 다른 플랫폼 설치에 대한 정보가 있습니다.

16.1.4. PostGIS를 사용하기 위한 데이터베이스 설정

PostGIS 설치가 끝나면 이 확장 프로그램을 사용하기 위해 사용자 데이터베이스를 설정해줘야 합니다. PostGIS 2.0 버전 이상을 설치했다면, 이전 모듈에서 사용했던 주소 데이터베이스를 사용하는 다음 psql 명령어를 실행해서 손쉽게 설정할 수 있습니다.

$ psql -d address -c "CREATE EXTENSION postgis;"

참고

사용 버전에 따라, https://postgis.net/docs/postgis_administration.html#create_spatial_db 에서 데이터베이스를 공간적으로 활성화시키는 방법에 대한 자세한 지침을 찾아볼 수 있습니다.

16.1.5. 설치된 PostGIS의 기능 살펴보기

PostGIS를 PostgreSQL의 핵심 기능을 공간 데이터를 다룰 수 있도록 확장하는 데이터베이스 내장 기능들의 집합으로 생각할 수 있습니다. ‘다룬다’라는 말은 저장, 추출, 쿼리, 조작을 뜻합니다. 이를 위해, 데이터베이스에 많은 기능들이 설치되어 있습니다.

PostGIS 덕분에 이제 사용자의 PostgreSQL address 데이터베이스가 공간 데이터를 다룰 수 있게 되었습니다. 다음 강의에서 이를 심도 있게 살펴보겠지만, 먼저 간단한 예를 들어보겠습니다. 텍스트에서 포인트를 생성하려 한다고 해봅시다. 먼저 포인트에 관련된 기능을 찾기 위해 psql 명령어를 사용합니다. 아직 address 데이터베이스에 접속하지 않았다면 지금 하십시오. 그리고 다음 명령어를 실행합니다.

\df *point*

우리가 찾는 것은 st_pointfromtext 라는 명령어입니다. 아래 방향 화살표 키를 이용해 목록을 살펴본 다음, Q 키를 눌러 psql 셸로 나오십시오.

다음 명령어를 실행해보십시오.

select st_pointfromtext('POINT(1 1)');

결과 :

st_pointfromtext
--------------------------------------------
0101000000000000000000F03F000000000000F03F
(1 row)

세 가지 사실을 알 수 있습니다.

  • POINT(1 1) 을 통해 1,1 위치에 (EPSG:4326 투영체를 적용) 포인트를 정의했습니다.

  • SQL 선언문을 테이블이 아니라 SQL 프롬프트에서 입력된 데이터에 대해 실행했습니다.

  • 결과물 행을 이해하기 힘듭니다.

결과물 행은 ‘WKB(Well Known Binary)’라는 OGC 포맷으로 되어 있습니다. 다음 강의에서 이 포맷을 자세히 살펴볼 것입니다.

결과물을 텍스트로 받아보려면, 텍스트를 반환하는 기능을 찾아 기능 목록을 검색해볼 수 있습니다:

\df *text

지금 찾고 있는 쿼리는 st_astext 입니다. 이 명령어를 이전 쿼리와 합쳐봅시다:

select st_astext(st_pointfromtext('POINT(1 1)'));

결과 :

 st_astext
------------
  POINT(1 1)
  (1 row)

POINT(1,1) 을 입력해서 st_pointfromtext() 를 통해 포인트로 변환한 다음 st_astext() 로 사람이 읽을 수 있는 형태로 다시 바꿨습니다. 그 결과 원래 문자열을 반환했습니다.

다음은 PostGIS 사용법을 자세히 알아보기 전, 마지막 예시입니다:

select st_astext(st_buffer(st_pointfromtext('POINT(1 1)'),1.0));

어떤 의미일까요? 이 명령은 포인트 주변에 1˚의 버퍼를 생성하고 그 결과를 텍스트로 반환시킵니다.

16.1.6. 공간 참조 시스템

PostGIS는 이런 기능 외에도 EPSG(European Petroleum Survey Group)가 정의한 SRS(spatial reference system) 모음을 포함하고 있습니다. CRS(coordinate reference system) 변환과 같은 작업 시 SRS를 사용합니다.

SRS가 일반 데이터베이스 테이블에 저장되어 있기 때문에, 사용자 데이터베이스에서 이 SRS의 정의를 조사할 수 있습니다.

먼저 psql 프롬프트에 다음 명령어를 입력해서 테이블의 스키마를 살펴봅시다:

\d spatial_ref_sys

다음과 같은 결과가 나와야 합니다:

Table "public.spatial_ref_sys"
   Column   |          Type           | Modifiers
 -----------+-------------------------+-----------
  srid      | integer                 | not null
  auth_name | character varying(256)  |
  auth_srid | integer                 |
  srtext    | character varying(2048) |
  proj4text | character varying(2048) |
  Indexes:
"spatial_ref_sys_pkey" PRIMARY KEY, btree (srid)

표준 SQL 쿼리를 (서론 부분에서 배웠던 것처럼) 사용해서 이 테이블을 보고 조작할 수 있습니다. 그러나 SRS에 대해 잘 모른다면 어떤 레코드도 업데이트 혹은 삭제하지 않는 편이 좋습니다.

사용자가 관심을 가져야 할 SRID가 있다면 바로 EPSG:4326입니다. WGS84 타원체를 사용하는 지리/경위도 참조 시스템입니다. 한번 살펴봅시다:

select * from spatial_ref_sys where srid=4326;

결과 :

srid      | 4326
auth_name | EPSG
auth_srid | 4326
srtext    | GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS
84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],TOWGS84[0,
0,0,0,0,0,0],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,
AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
proj4text | +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs

srtext 가 WKT(well known text) 포맷으로 된 투영체 정의입니다. (사용자의 shapefile 가운데 .prj 파일에서 봤을 수도 있습니다.)

16.1.7. In Conclusion

이제 PostgreSQL에 PostGIS 기능을 설치했습니다. 이것으로 PostGIS의 광범위한 공간 기능들을 이용할 수 있게 되었습니다.

16.1.8. What’s Next?

다음으로 공간 피처가 데이터베이스 안에서 어떻게 표현되는지 알아보겠습니다.