GIS

PostGIS에서 공간쿼리(Spatial Query) 사용하기

유병혁 2018. 5. 28. 21:05

본 글은 콜로라도대학교 덴버캠퍼스 지리학부 FOSS4G Lab의 리카르도 올리베이라(Ricardo Oliveira) 님이

작성하신 'Getting Started with PostGIS' 온라인 튜토리얼 시리즈를 한국어 사용자에 맞게 수정한 글입니다.

이 글은 GIS United 김우미 님과 함께 작성하고 있습니다.

 

[1] 윈도우에서 PostgreSQL과 PostGIS 설치하기 | http://blog.daum.net/geoscience/1237
[2] PostgreSQL/PostGIS에서 DB 생성하고 공간데이터 추가하기 | http://blog.daum.net/geoscience/1249
[3] QGIS에서 PostGIS 레이어 추가하기 | http://blog.daum.net/geoscience/1250
[4] PostgreSQL/PostGIS에서 SQL 언어 학습하기 | http://blog.daum.net/geoscience/1253

[5] PostgreSQL/PostGIS에서 투영법 변환하기 | http://blog.daum.net/geoscience/1254

 

안녕하세요? 앞서 PostGIS에서 투영법 변환을 학습해 봤습니다.
이번 글에서는 PostGIS에서 공간쿼리(Spatial Query)를 사용해보겠습니다.

 

이전에 GIS 관련 경험이 있으신 분은 이번 시간의 개념을 쉽게 이해하실 수 있을텐데요, 이번 시간엔 GIS 분석을

새로운 방식으로 해볼 수 있다는 점에서 의미가 있습니다. 먼저, 공간쿼리를 이용하여 지오메트리의 값을 분석해보겠습니다.

*지오메트리(geometry)란?

모양, 크기, 위치 등과 같은 도형의 정보와 속성을 뜻합니다.

GIS에서 지오메트리는 점(point), 선(line), 면(polygon)으로 구성됩니다.

 

아래와 같이 앞서 실습을 통해 서울시의 점, 선, 면 데이터를 DB에 등록한 상태입니다.

 

일단, '서울시 법정구역 읍면동 공간정보' 데이터셋의 이름을 emd로 변경하겠습니다.

 

emd 테이블을 우클릭하고 'Query Tool'을 실행합니다.

emd xp

 

아래 쿼리는 읍면동(emd) 테이블에 있는 서울 읍면동 면적의 합을 구하는 함수입니다.

 

짠! 면적의 합이 계산되어 나왔습니다. 그런데 단위가 너무 작죠?! 왜 그럴까요?!

 

그 이유는 테이블의 SRID가 위경도로 된 지리 좌표계로 정의(4326)되어 있기 때문입니다.

 

PostGIS에서는 지리 좌표계 정의 상태에서도 제곱미터 단위의 면적을 구할 수 있습니다.

여기서는 이전 실습을 복습하는 차원에서 아래와 같은 방식으로 좌표계를 5186으로 변환하겠습니다.

 

자, 다시 면적을 계산해볼까요?!

 

'ST'는 'Spatial Temporal'의 약어인데요, 'ST'로 시작하는 쿼리는 공간적 쿼리의 기능을 합니다.
여기서 'ST_Area'는 지오메트리의 면적을 계산하며, sum은 면적의 합을 계산하는데 사용됩니다.

 

아래와 같이 서울시 면적이 605 제곱 킬로미터로 계산됩니다.

 

그렇다면 읍면동별 면적을 구하고 싶을 때는 어떻게 해야 할까요?! 일단 읍면동 명칭은 emd_nm 컬럼이 가지고 있습니다.

 

각 읍면동의 면적을 구하고, 읍면동의 이름을 면적에 따른 내림차순(Descending order)으로 정렬하는 공간쿼리문입니다.

 

아래와 같이 결과가 잘 나왔습니다!
서울가 읍면동 중 신림동의 면적이 가장 넓고, 상계동이 그 뒤를 따르고 있습니다.
궁금한 정보를 쿼리문으로 작성하여 추출해낼 수 있다는 것이 PostGIS 공간쿼리의 매력입니다.

 

면(polygon)으로 된 데이터를 다루어봤으니, 이번엔 선(line) 데이터로 공간쿼리 기능을 연습해보겠습니다.
지난 시간에 다뤘던 '서울시 도로구간 위치정보' 데이터셋을 이용하겠습니다. 마찬가지로 투영법을 변경합니다.

 

해당 road 테이블은 'rn' 컬럼에 도로 이름을 저장하고 있습니다.

 

'ST_Length' 공간쿼리 기능을 이용하면 선의 길이를 구할 수 있습니다. 입력해볼까요?!
road 테이블 안에서 ST_Length 쿼리기능으로 도로 길이를 구하고, rn을 길이에 따른 내림차순(order by length DESC)으로 결과를 요청했습니다.

 

결과는 아래와 같습니다. 경부고속도로가 가장 길고, 그 다음은 마포나루 길이 긴 것으로 나타납니다.

 

공간쿼리를 통해서 이런 식으로 원하는 지오메트리 값을 도출할 수 있습니다. 다만, 도로 데이터같은 경우엔

길이 여러 개 겹쳐져 있는 경우도 있기 때문에 정확한 분석을 위해서는 데이터 구조의 확인이 중요할 것으로 보입니다.


다음 시간에는 PostGIS에서 공간관계(Spatial Realationship)를 분석해 보겠습니다.