Geometry의 공간연산

얼마전에 했던 작업이 공간연산이였는데, 쉽게 알고만 있었고 쉽게 사용해 왔던 공간연산이 직접 하나 하나 정확하게 구분하려고 보니, 상당이 헤깔린다는 것을 알게 되었다. 또한 공간연산하면 단지 교차하는지, 포함하는지와 같은 공간관계 연산만이 아니라 공간분석 연산도 포함되다는 사실을 알게 되어 정리하는 차원에서 글을 남긴다. 또한 작업했던 것에 대한 Test 실행파일을 올리니 여러분도 한번 실행해 시험해 보길 바란다. 참고로 공간분석 연산의 경우 결과가 Multi-Polygon인 경우 자랑스런 Memory 충돌에러가 발생한다는 점에 주의하기 바란다.

Geometry의 Spatial Relations

GIS에서 Geometry는 단순하게 Point, Polyline, Polygon으로 구분되며, 몇가지 제약사항을 갖게 되는데 이러한 Geometry를 Simple Feature라고 한다. 이러한 Simple Feature 둘 이상이 공간상에서 관계를 갖게 되는데, Spatial Relation이라고 한다. Spatial Relation의 종류는 모두 8가지 이다.

  • Equals – 두개의 Geometry가 동일한가?
  • Disjoint – 두개의 Geometry가 서로 격리되었는가?
  • Intersects – 두개의 Geometry가 교차하는가?
  • Touches – 두개의 Geometry가 접촉하는가?
  • Crosses – 두개의 Geometry가 횡단하는가?
  • Within – 하나의 Geometry가 다른 하나에 포함되는가?
  • Contains – 하나의 Geometry가 다른 하나를 포함하는가?
  • Overlaps –  – 두개의 Geometry가 부분적으로 겹치는가?

8가지의 관계들 중에는 서로 비슷한 연산이 있지만, 분명한 차이점을 가지고 있다. 예들 들어 두개의 폴리곤이 touch 관계을 갖는다면, intersect 관계도 항상 갖는다. 하지만 반대로 intersect 관계을 갖는다고 해서 touch 관계을 갖지는 않는다. 다른 예로 overlap과 intersect 연산의 경우, overlap이 참인 경우 항상 intersect도 참이지만, 반대로 intersect이 참이라고 해서 항상 overlap이 참이지는 않다. 하나의 폴리곤이 다른 하나의 폴리곤안에 완전이 포함되는 경우 intersect이 참이지만 overlap은 참이 아니기 때문이며, 이러한 경우는 contain이 참이거나 within이 참이기 때문이다. 여기서 contain과 within은 능동이냐, 수동이냐의 의미를 갖는다.



일단은 폴리곤에 대한 예를 들었지만 서로 다른 형태의 폴리곤과 폴리라인과의 관계를 생각하면 8가지의 관계의 필요성과 이해가 더욱 피부에 와닿을 것이다. 즉, crosses의 경우에는 폴리곤과 폴리라인의 경우에만 연산의 의미가 있다.

Geometry의 Spatial Analysis

GIS에서 Geometry의 Spatial Analysis는 모두 6가지이며 다음과 같다.

  • Buffer – 일정한 값만큼 Geometry를 키우거나 축소시킨 폴리곤을 얻는다.
  • Convex Hull – Geometry를 감싸는 최소넓이의 볼록한 폴리곤을 얻는다.
  • Intersection – 두개의 Geometry가 교차하는 부분에 대한 Geometry를 얻는다.
  • Union – 두개의 Geometry의 합쳐쳐 만들어진 하나의 Geometry를 얻는다.
  • Difference – 하나의 Geometry에서 다른 하나의 Geometry의 부분을 빼고 남은 Geometry를 얻는다.
  • Symmetric Difference – Union으로 구한 Geometry와 Intersection으로 구한 Geometry의 Difference이다.

위의 화면은 Test의 실행 화면인데, Union 연산, 20 Pixel 확장 Buffering 연산, Difference 연산에 대한 결과이다.

“Geometry의 공간연산”에 대한 2개의 댓글

  1. 안녕하세요.^^/
    기억하실런지~
    저번에 알려주신 공간검색 알고리즘 문서 잘 보았습니다. 도움 많이 되었어요. 요즘에는 OGC표준안에 맞춰서 Geometry를 구성해보고 있는데 알고리즘 게시판이 도움이 많이 되고 있습니다.^^
    올려주신 프로그램과 글을 보고 헷갈리던게 많이 해소됐어요~
    그런데 글을 보다가 궁금한게 생겨서요!
    Buffer라는 것인데, 이게 크기를 늘리는 것 같긴 한데 똑같이 늘어나는건 아니고 좀 둥글둥글하게 늘어나더라구요.
    이게 어떤 함수인지 궁금해서 표준안을 봤더니 해당 기하의 경계에서 일정거리만큼 떨어져 있는 점들의 집합을 기하로 리턴하는 거더라구요. 근데 한 점에서 일정거리로 떨어진 점의 집합은 원이잖아요? 경계는 많은 점들로 구성되어 있는데, 일일이 그 각각의 점들로부터 떨어진 원들을 구해서 그 원들의 합집합이 리턴되는건가요? 이 Buffer라는 함수가 어떤 알고리즘으로 구현되는지 궁금합니다~ 간략하게나마 설명해주실 수 없을까요?

  2. 글로 설명하기가 참 애매합니다만… 일단 기본 개념은 원(Circle)에 의한 확장이나 축소입니다. ^^; 그러니깐.. 구성 좌표에서 늘이거나 줄일 만큼의 거리값(원의 반지름)으로 원을 구성하고.. 이 구성된 원들을 연결해주는 방식입니다…. 기본은 이렇답니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다