엑시엄이 보는 DB 세상
SQL로 표현하는 공간 데이터 ② 0 0 2,846

by axiom OpenGIS 공간데이터 OGC GIS 공간관계함수 공간분석함수 [2015.10.08]


다수의 DBMS에서 공간 데이터 타입과 공간 데이터 함수를 지원해줌으로써, 이제 사용자들은 SQL 작성만으로도 공간 데이터를 데이터베이스에 저장하고 관리할 수 있게 되었다. 지난 시간에 공간 데이터의 종류에 대해 확인해보았으며, 이번에는 공간 데이터의 연산을 지원해주는 공간 함수에 대해 알아보자.

두 공간 데이터 간의 거리를 계산이 필요한 상황이라고 가정하자. 두 개의 공간 데이터가 Point인 경우에는 삼각 함수를 이용하면 비교적 쉽게 거리를 계산할 수 있을 것이다. 만약, 두 개의 공간 데이터가 다각형인 Polygon인 경우에는 어떻게 계산을 할 수 있을까?

우선 두 Polygon간 가장 가까운 부분을 찾아야 하는데, 가까운 부분은 우리가 상수 값으로 입력한 Polygon 내의 수많은 Point 좌표 값 뿐만 아니라 Point를 연결하는 Line이 될 수도 있으며, 각 Polygon이 위치하는 방향에 따라서 가까운 지점이 달라지기 때문에 거리 계산을 구현하는 로직은 복잡해질 수 밖에 없다.

이러한 구현의 복잡성을 해결하고자 공간 데이터의 연산을 지원해주는 공간 함수가 존재한다.

공간 관계 함수

공간 함수는 크게 공간 관계 함수와 공간 분석 함수로 구분할 수 있다.

공간 관계 함수는 공간 객체들의 기하학적 공간 관계를 Boolean 형식으로 결과를 반환해주며, Equals, Disjoint, Touches, Within, Intersects, Contains 등의 함수가 존재한다. [그림1]은 공간 관계 함수의 예를 보여주고 있다.

  • [그림1] 공간 관계 함수의 예
  • SQL로 표현하는 공간 데이터 ②

공간 관계 함수의 사용 예제와 연산 결과는 아래 [표 1]과 같다

  • [표 1] 공간 관계 함수의 사용 예제와 연산 결과
  • SQL로 표현하는 공간 데이터 ②

공간 분석 함수

공간 분석 함수는 공간 객체의 길이, 크기 등의 속성을 구하거나, 공간 연산의 결과를 집합 연산 결과로 반환해주는데, Distance, Intersection, Union, Difference 등의 함수가 이에 해당한다. 각 공간 분석 함수의 사용 예제와 연산 결과는 아래 [표 2]과 같다.

  • [표 2] 공간 분석 함수의 사용 예제와 연산 결과
  • SQL로 표현하는 공간 데이터 ②

공간 데이터 조회

공간 데이터와 함수를 지원해주는 DBMS 환경에서 위치 기반의 업체 정보 검색 프로그램을 개발하기 위해서는 아래 [그림 2]과 같이 데이터 모델을 설계 할 수 있다.

  • [그림2] 데이터 모델 설계
  • SQL로 표현하는 공간 데이터 ②

건물목록 엔티티에는 Polygon 타입의 건물_Polygon 속성을 추가하여 각 건물의 좌표 정보를 저장하며, 행정구역 엔티티에도 Polygon 타입의 구역_Polygon 속성을 추가하여 각 행정구역의 좌표 정보를 저장하도록 설계하였다.

[리스트 1]은 MySQL에서 공간 함수를 사용하여 현재 위치에서 가까이 위치하고 있는 주유소를 검색하는 SQL문을 나타낸다.

  • [리스트 1] 지리적으로 가까운 주유소 목록을 검색하는 SQL
  • SELECT COM.업체ID
         , COM.업체명
         , ST_DISTANCE(REG.구역_Polygon, POINT(@CUR_X, @CUR_Y) ) DIST
      FROM 업체정보 COM
         , 건물목록 BLD
         , 행정구역 REG
     WHERE COM.건물ID = BLD.건물ID
       AND COM.업체구분 = '주유소'
       AND WITHIN(BLD.건물_Polygon, REG.구역_Polygon) = TRUE
       AND CONTAINS(REG.구역_Polygon, POINT(@CUR_X, @CUR_Y)) = TRUE
     ORDER BY DIST;
    

위 SQL은 사용자의 위치 좌표를 POINT 데이터 형식으로 입력 받아 현재 위치하고 있는 행정 구역을 CONTAINS 함수를 사용하여 확인하고, 행정 구역에 속하는 건물 들의 정보를 WITHIN 함수를 사용하여 추출한 뒤 건물 내 입점한 업체가 주유소인 레코드만 최종 추출하게 된다.

그리고 DISTANCE 함수를 사용해 추출된 주유소 건물의 좌표와 사용자의 위치간의 거리를 구한 뒤 가장 거리가 짧은 순서대로 정렬하여 사용자에게 결과를 반환하게 된다.

위와 같이 공간 데이터 타입과 공간 함수를 활용하여 지리 정보 시스템 및 위치 기반 시스템을 구축하게 된다면 데이터 모델은 단순해지고, 복잡한 계산 로직 없이 단순한 SQL만으로도 원하는 결과를 쉽게 추출할 수 있을 것이다.

- 강좌 URL : http://www.gurubee.net/lecture/2922

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입