GIS

PostGIS에서 공간관계(Spatial Relationship) 분석하기

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

본 글은 콜로라도대학교 덴버캠퍼스 지리학부 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
[6] PostGIS에서 공간쿼리(Spatial Query) 사용하기 | http://blog.daum.net/geoscience/1255

 

안녕하세요? 이전 글에서는 하나의 특정 데이터셋에서 공간 데이터를 추출하는 방법을 정리해 봤습니다.

이번 글은 두 개의 다른 데이터셋에서 공간관계(Spatial Relationship)를 추출하는 방법을 학습해 보겠습니다.

다음 3가지 관계 유형을 배워 보겠습니다: Intersect, Contains, Within.

 

Intersects 함수는 데이터의 지오메트리를 체크하고 서로 중첩되는 것만을 반환합니다.

 

예를 들면, 읍면동과 중첩되는 도로는 아래 쿼리를 통해 확인할 수 있습니다.

일단 도로와 읍면동 테이블이 표시되어야 할 텐데요, 아래 r과 e는 각 테이블에 대한

별칭(Alias)입니다. 이러한 별칭은 키입력을 줄여주며 보다 정리된 쿼리를 작성할 수 있습니다.

 

여기서는 읍면동 명칭이 '연남동'이면서 도로와 읍면동이 중첩되는 레코드를 지시하였습니다.

따라서, 결과는 아래와 같이 연남동과 중첩되는 도로 명칭이 계산됩니다. 생각보다 간단하죠?!

 

이번에는 Within에 대해 학습해 보겠습니다. Within은 주어진 지오메트리가 또다른 지오메트리 내부에

위치하는지를 확인합니다. 여기서는 기타 수질오염원이 어느 읍면동에 속하는지 질의해 보도록 하겠습니다.

 

쿼리문은 틀린 부분이 없는데 쿼리 결과가 표시되지 않습니다. 왜 그럴까요?!

 

그 이유는, 아래와 같이 기타 수질오염원과 읍면동 데이터셋이 서로 다른 SRID로 정의되어 있기 때문입니다.

 

기타 수질오염원 테이블을 5186 좌표계로 정의한 후, 다시 실행해 보겠습니다.

 

이제 아래와 같이 각 읍면동에 포함되는 기타 수질오염원 명칭을 확인할 수 있습니다.

 

위 쿼리문은 아래와 같이 읍면동 면적을 추가하고, 해당 면적을 기준으로 한 내림차순 결과를 반환할 수도 있습니다.

 

위 shape_area 컬럼은 지리좌표계로 계산된 결과인데요, 아래 쿼리문을 통해 해당 테이블의 정보를 갱신할 수도 있습니다.

 

결과는 아래와 같습니다.

 

ST_DWithin 함수는 사용자가 입력한 거리값에 따라 지오메트리 A와 지오메트리 B를 비교합니다.

함수의 일반적인 형식은 ST_DWithin(geometry A, geometry B, radius)입니다.

여기서 반경은 사용하는 데이터와 측정 단위가 같아야 합니다.

 

모든 기타 수질오염원으로터 100m 반경 내에 있는 읍면동을 확인해 보겠습니다.

 

적용 결과는 아래와 같습니다.

 

이번에는 기타 수질오염원 100m 반경 내 읍면동의 면적 합계를 분석해 보겠습니다. 하나의 기타 수질오염원(100m 버퍼)은 다수의 읍면동을

포함하고 있습니다. 아래 쿼리에서는 이것을 기타 수질오염원으로 그룹화하고 sum(e.shape_area)를 통해 면적 합계를 산출하고 있습니다.

 

아래와 같이 수질오염원 별로 100m 버퍼 내 포함되는 읍면동 면적 합계를 산출한 결과입니다.

 

보다 다양한 공간관계 기능은 PostGIS 문서를 참조하시면 되겠습니다.

8.9. Spatial Relationships and Measurements | http://postgis.net/docs/reference.html#Spatial_Relationships_Measurements