Post

공간 데이터 베이스 - 공간 데이터 쿼리

공간 데이터 베이스 - 공간 데이터 쿼리

※ 이번 포스팅을 이해하기 위해서는 SQL에 대한 기본적인 이해가 필요하다. 기본적인 SQL에 대한 내용은 같은 카테고리내에 잘 정리되어있으니 참고하면 좋다.

1. 개요

SQL도 버전이 있다. 1986년에 나온 SQL1, 1992년에 나온 SQL2, 1999년에 나온 SQL3가 바로 이런 버전이다.
각 버전마다 지원하는 범위가 다른데, 이번에 다룰 공간 데이터 베이스에 대한 쿼리를 쓰기 위해서는 SQL3를 사용해야한다.
왜냐하면 SQL1,2는 재귀적인 쿼리에 적합하지 않기 때문이다.

공간 데이터베이스에서 사용하는 쿼리는 기본적인 RDBMS에서 사용하는 SQL + $\alpha$ 의 형태로 되어있다.
기본 데이터형식과 기본 연산자에서 공간 데이터 타입 및 연산자를 더한 형태라는 뜻이다.

2. OGIS(Open Geodata Interchange Standard) Spatial Data Model

지리공간(geospatial) 데이터의 상호운용성과 교환을 위해 공개·표준화된 규격들의 집합을 말한다. 즉 서로 다른 GIS 소프트웨어·서비스 간에 좌표·속성·Geometry를 일관성 있게 주고받도록 규정한 인터페이스·포맷·프로토콜인데 많은 DB 제공사에서 제공한다.(Oracle, IBM 등)

1) 지원 타입

기본적으로 4가지 타입을 지원한다.

  • Point : 0차원, 특정 위치를 말한다.
  • Curve : 1차원, 연속된 점으로 이루어진 선으로 LineString과 LineRing 등의 구체적인 타입이 있으며, 시작 끝점이나 close여부, 자기 교차 여부등으로 판단할 수 있다.
  • Surface : 2차원, 다각형이다. 내부, 경계, 구멍등의 개념을 포함한다.
  • GeometryCollection/Multi : 서로 다른 타입을 묶는 컨테이너로 교차 결과에 따라 여러타입이 동시에 나올 수 있다.

2) 지원 연산자

아래의 3가지 카테고리의 연산자를 지원한다.

a. 모든 Geometry 타입에 적용되는 기본 연산(Apply to all geometry types)

  • SpatialReference : 기하(Geometry)는 어떤 좌표계(SRS/SRID)에 정의되는지
  • Envelope : 기하의 최소 바운딩 박스(사각형)를 반환
  • Export : 기하를 다른 형식(Well-Known Text, Well-Known Binary, GML 등)으로 직렬화/내보내기
  • IsSimple : 기하가 ‘단순한가’(자기-교차 등 위반이 없는가)를 검사
  • Boundary : 기하의 위상학적 경계(예: 폴리곤의 외곽선과 구멍들의 링)를 반환

b. 위상적 술어(Predicates for Topological relationships)

  • Equal : 두 기하가 동일한 점 집합을 갖는가
  • Disjoint : 공통 점이 전혀 없는가
  • Intersect : 적어도 하나의 점을 공유하는가, disjoint의 정반대
  • Touch : 경계는 만나지만 내부는 겹치지 않는가
  • Cross : 서로 다른 차원의 부분이 교차하는 경우
  • Within : A가 B안에 있는가?
  • Contains : B가 A안에 있는가?

c. 공간 데이터 분석(Spatial Data Analysis)

  • Distance : 두 기하 사이의 최소 거리(숫자)
  • Buffer : 기하로부터 일정 반경(거리)만큼 확장한 영역(주로 폴리곤 결과)
  • Union : 두 기하를 합해 하나의 기하(또는 멀티기하)를 생성
  • Intersection : 두 기하의 겹치는 부분만 반환
  • ConvexHull : 기하를 완전히 감싸는 최소 볼록 폴리곤을 반환
  • SymDiff : 두 기하의 공통부분을 제외한 합집합 부분

3. 실사용 예시

아래와 같은 스키마가 있다고 해보자.

1
2
3
4
5
6
7
CREATE TABLE Country(
    Name varchar(30),
    Cont varchar(30),
    Pop Integer,
    GDP Number,
    Shape Polygon);
)
1
2
3
4
5
6
CREATE TABLE River(
    Name varchar(30),
    Origin varchar(30),
    Length Number,
    Shape LineString);
)
1
2
3
4
5
6
7
CREATE TABLE City(
    Name varchar(30),
    Country varchar(30),
    Capital varchar(1),
    Pop Integer,
    Shape Polygon);
)

1) Area

면적을 구하는 함수로, C.Shape를 인자로 주는 형태이다. 이는 Polygon type이라 사용가능하다.

1
2
SELECT  C.Name, C.Pop,  Area(C.Shape)  AS  "Area"
FROM  Country  C

2) Distance

모든 국가의 이름과 GDP 그리고 국가의 수도와 적도까지의 거리를 출력하는 쿼리이다.

1
2
SELECT  Co.GDP,  Distance(Point(Ci.Shape.x, 0), Ci.Shape)  AS  "Distance"
FROM  Country  Co, City  Ci WHERE  Co.Name = Ci.Country AND  Ci.Capital ='Y'

3) Touch

미국(USA)의 이웃 국가 이름을 출력하는 쿼리로, 접해있는지 확인 가능한 Touch라는 함수를 써서 구현되었다.

1
2
3
4
SELECT  C1.Name  AS  "Neighbors of  USA"
FROM  Country  C1, Country  C2
WHERE  Touch(C1.Shape,C2.Shape) = 1 
AND  C2.Name ='USA'

4) Cross

나라를 가로지르는 강이 있다면 해당 강의 이름과 나라 이름을 같이 출력하는 쿼리로, 서로 교차하는 것을 검출 할 수 있는 Cross 함수를 사용했다.

1
2
3
SELECT  R.Name, C.Name
FROM  River R, Country C
WHERE  Cross(R.Shape,C.Shape) = 1

5) Buffer와 Overlap

세인트 로렌스 강은 300km 이내에 있는 도시에 물을 공급할 수 있다고 할때, 세인트 로렌스 강에서 공급되는 물을 사용할 수 있는 도시를 구하려면 아래와 같은 쿼리를 사용하면 된다.

1
2
3
4
SELECT  Ci.Name
FROM  City Ci, River R
WHERE  Overlap(Ci.Shape, Buffer(R.Shape,300)) = 1 
AND  R.Name ='St.Lawrence'

여기서 Buffer는 해당 Shape의 입력 받은 반경을 포함한 Polygon을 반환하고 Overlap은 해당 Polygon과 City들이 겹치는지 확인하는 함수이다.

참고자료

  • Shashi Shekhar and Sanjay Chawla, Spatial Databases: A Tour, Prentice Hall, 2003
  • P. RIigaux, M. Scholl, and A. Voisard, SPATIAL DATABASES With Application to GIS, Morgan Kaufmann Publishers, 2002
  • INTERNATIONALSTANDARD-ISO19107 Geographic information — Spatialschema
  • OpenGIS® Implementation Standard for Geographic information - Simple feature access - Part 1: Common architecture - Open Geospatial Consortium
This post is licensed under CC BY 4.0 by the author.