엑시엄이 보는 DB 세상
SQL로 표현하는 공간 데이터 ① 0 0 99,999+

by axiom OpenGIS 공간데이터 OGC GIS [2015.10.08]


스마트 폰을 이용해 주위에서 가장 가까운 상점의 위치를 확인하고, 목적지까지 가장 빠르게 이동할 수 있는 경로를 안내 받는 것은 이제 현대 생활의 한 자락이 돼버렸다.

지리 정보와 위치 기반 서비스는 사용자가 계속 증가하고 있으며 시스템의 성능을 향상 시키기 위해서 DBMS도 사용자 요구에 맞게 공간 데이터 및 함수를 제공해주고 있다.

지금 내가 서 있는 이 곳 위치(Point), 의자에 앉아 업무를 보고 있는 사무실 건물(Polygon), 아침 출근 시 이용하였던 지하철의 노선(LineString). 우리 주위에는 (x,y) 좌표를 이용하여 표현 할 수 있는 수 많은 공간 데이터가 존재하고 있다.

이 수 많은 공간 데이터들을 DBMS에서 어떻게 표현하고 활용 할 수 있는지 살펴보자. 글이 길어 두 편으로 나눠 연재하겠다.

일반 DBMS에서의 공간 데이터 표현

일반 DBMS 환경에서 위치 기반 업체 정보 검색 프로그램을 개발하기 위해서는 [그림1]과 같이 데이터 모델을 설계해야 할 것이다.

다각형 형태의 건물이나 구역은 다수의 (x,y) 좌표를 이용해 공간 정보를 표현하게 된다. 만약, 건물목록 엔티티에 좌표 정보를 저장해야 한다면 좌표 수만큼 속성을 추가해주거나, 건물 레코드를 좌표 수만큼 중복 저장해야 한다.

이러한 경우 데이터가 Null인 속성이 많아지고, 건물 정보에 대한 데이터가 중복 저장되는 비효율이 발생한다.

  • [그림1] 일반 DBMS 환경에서의 데이터 모델 예
  • SQL로 표현하는 공간 데이터 -일반 DBMS 환경에서의 데이터 모델 예

따라서 [그림1]과 같이 정규화 작업을 통해서 건물 좌표 정보를 따로 저장하는 1:M 관계인 건물좌표 엔티티를 별도로 정의해야 하고, 행정구역도 좌표 정보를 별도로 저장하는 행정구역좌표 엔티티를 추가해줘야 한다.

이렇듯 일반 DBMS 환경에서 공간 데이터를 액세스 하기 위해서는 아래와 같은 단점들이 존재하게 된다.

  • - 데이터 모델의 복잡성 증가
  • - 메타 데이터 정보만으로는 공간 데이터 타입 구분이 어려움
  • - 다각형의 데이터를 표현하는데 한계가 있음
  • - 복잡성이 높은 공간 데이터 간 연산 로직을 별도로 구현해야 함

위와 같은 문제점을 해결하기 위해서는 공간 데이터를 쉽게 저장하고 액세스 할 수 있는 환경이 필요할 것이다.

Geospatial Consortium는 공간 정보에 관한 표준화 작업을 주도하고 있는 기관으로서, OGC에서 제시한 OpenGIS Geometry 표준 모델은 Oracle, MS SQL Server, MySQL, Altibase 등 다양한 DBMS에서 적용되어 사용자게 공간 데이터를 저장, 관리, 액세스 할 수 있는 공간 데이터 타입과 함수를 지원해주고 있다.

공간 데이터 타입

OGC에서 제시하고 있는 공간 데이터 타입은 Point, Line String, Polygon, Multi-Point, Multi-LineString, Multi-Polygon과 하나의 데이터 타입 안에서 위 6개의 데이터 타입들을 집합 형태로 표현할 수 있는 GeomCollection이 존재한다. [그림2]는 다양한 형태의 공간 데이터 타입을 보여주고 있다.

  • [그림2] 공간 데이터 타입
  • SQL로 표현하는 공간 데이터 -공간 데이터 타입

각 공간 데이터 타입에 대한 정의와 공간 데이터 상수 값을 SQL 텍스트 형식으로 표현하는 예제는 [표 1]과 같다

  • [표 1] 공간 데이터 타입의 정의와 SQL 표현 예제
  • SQL로 표현하는 공간 데이터 -공간 데이터 타입의 정의와 SQL 표현 예제

[리스트 1]은 MySQL에서 공간 데이터 타입의 컬럼이 포함된 테이블을 생성하고, 데이터를 삽입, 질의하는 SQL이다.

  • [리스트 1] MySQL에서 공간 데이터 관리
  • CREATE TABLE GEO_TAB
    ( GID  INT(10),
      PT   POINT,
      LS   LINESTRING
    );
    
    
    SET @g1 = 'POINT(10 10)';
    SET @g2 = GeomFromText( 'LINESTRING(5 5, 10 5, 15 10)' );
    INSERT INTO GEO_TAB VALUES ( 1, GeomFromText(@g1), @g2 );
    
    
    SELECT GID, AsText(PT), AsText(LS) FROM GEO_TAB; 
    
    +------+---------------+--------------------------------+
    | GID  | AsText(PT)    | AsText(LS)                     |
    +------+---------------+--------------------------------+
    |    1 | POINT(10 10)  | LINESTRING(5 5,10 5,15 10)     |
    +------+---------------+--------------------------------+
    

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

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

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

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