2. Copyright⒞ 2020. H.J. Sim. All rights reserved.
목차
1. 일반 RDBMS에서의 공간 데이터 표현
2. OGC
3. 공간 데이터 타입
4. 공간 관계 함수
5. 공간 연산 함수
6. 공간 데이터베이스 활용
7. 공간 인덱스 R-Tree
2
3. Copyright⒞ 2020. H.J. Sim. All rights reserved.
1. 일반 RDBMS에서의 공간 데이터 표현
• 건물영역(다각형)좌표 저장을 위한 RDBMS 데이터 모델
3
- Case 1: 건물영역좌표 엔터티 생성 - Case 2: 건물영역좌표를 하나의 문자열로 입력
건물ID 건물좌표일련번호 X좌표 Y좌표
10 1 x1 y1
10 2 x2 y2
…
10 N xn yn
건물ID … 건물영역좌표
10 … x1 y1, x2 y2, … xn yn
공간 연산을 위해서 건물영역좌표 값을
분해하는 작업이 선행되어야 함.
저장 공간이 증가.
하나의 건물영역좌표가 다수의 블록에
분산되어 저장될 가능성이 높음.
4. Copyright⒞ 2020. H.J. Sim. All rights reserved.
1. 일반 DBMS에서의 공간 데이터 표현
4
• Case 1: 건물영역좌표 엔터티 생성
건물ID 건물좌표일련번호 X좌표 Y좌표
10 1 x1 y1
10 2 x2 y2
…
10 N xn yn
별도의 엔터티 생성이 필요하며,
좌표 값을 구별하기 위한 식별자 데
이터가 필요함.
건물영역은 다각형 형태이므로 건물영역좌표는
다수의 점 좌표로 구성.
하나의 건물영역좌표가 다수의 로우로 저장되므로
다수의 블록에 분산되어 저장될 가능성이 높음.
Data block Data block Data block
Data block Data block Data block
.
.
.
좌표 데이터 액세스 시 블록 액세스 횟수가 증가되어 성능 저하의 원인이 됨
. . .
. . .
5. Copyright⒞ 2020. H.J. Sim. All rights reserved.
1. 일반 DBMS에서의 공간 데이터 표현
• Case 2: 건물영역좌표를 하나의 문자열로 입력
– 예: 사용자 위치에서 가까운 순서대로 'GAS STATION'목록을 조회하는 SQL (Oracle)
5
WITH BLDS AS (
SELECT S.STORE_ID
, S.STORE_NM
, B.BLD_ID
, B.BLD_ADDR
, B.BLD_AREA_CRD
FROM STORE S
, BLD B
WHERE S.STORE_TYPE = 'GAS STATION'
AND S.BLD_ID = B.BLD_ID
)
SELECT STORE_ID
, STORE_NM
, BLD_ID
, BLD_ADDR
, DIST
FROM (
SELECT STORE_ID
, STORE_NM
, BLD_ID
, BLD_ADDR
, DIST
, ROW_NUMBER()
OVER(PARTITION BY BLD_ID
ORDER BY DIST) CRD_RN
FROM (
SELECT STORE_ID
, STORE_NM
, BLD_ID
, BLD_ADDR
, SQRT(ABS(POWER(REGEXP_SUBSTR(BLD_CRD, '[^ ]+', 1, 1) - :USER_X_CRD, 2))
+ ABS(POWER(REGEXP_SUBSTR(BLD_CRD, '[^ ]+', 1, 2) - :USER_Y_CRD, 2))) AS DIST
FROM (
SELECT STORE_ID
, STORE_NM
, BLD_ID
, BLD_ADDR
, BLD_CRD_SEQ
, REGEXP_SUBSTR(BLD_AREA_CRD, '[^,]+', 1, BLD_CRD_SEQ) AS BLD_CRD
FROM BLDS
, (SELECT LEVEL AS BLD_CRD_SEQ
FROM DUAL
CONNECT BY LEVEL
<= ( SELECT MAX( LENGTH(BLD_AREA_CRD)
- LENGTH(REPLACE(BLD_AREA_CRD, ',', ''))) + 1 FROM BLDS ) ) L
) A
WHERE BLD_CRD IS NOT NULL
) B
) C
WHERE C.CRD_RN = 1
ORDER BY DIST;
공간 연산 처리가 복잡하며, 쿼리가 길어져 가독성이 떨어짐.
공간 연산을 위해
문자열 형태(x1 y1, x2 y2, … xn yn)인 좌표 값을
점 좌표(x, y)로 변환하는 작업 필요.
6. Copyright⒞ 2020. H.J. Sim. All rights reserved.
2. OGC
• Open Geospatial Consortium
– 공간 정보에 관한 표준화 작업을 주도하고 있는 기관
– URL : http://www.ogc.org/
– Oracle, MS SQL Server, MySQL, MariaDB, PostgreSQL 등 다양한 DBMS에서 적용되어 공간 데이터를 저장,
관리, 액세스 할 수 있는 공간 데이터 타입과 함수를 지원
[ 표준 Spec. ]
6
7. Copyright⒞ 2020. H.J. Sim. All rights reserved.
3. 공간 데이터 타입 (1/3)
• 다차원의 공간 데이터를 저장할 수 있는 다양한 공간 데이터 타입이 존재
• MySQL에서는 아래와 같은 공간 데이터 타입을 지원
공간
데이터 타입
정의 SQL 예제
Point
좌표 공간에서 한 지점의 위치를
표시
POINT (10 10)
LineString 다수의 Point를 연결해주는 선분 LINESTRING (10 10, 20 25, 15 40)
Polygon
다수의 선분들이 연결되어 닫혀
있는 상태인 다각형
POLYGON ((10 10, 10 20, 20 20, 20 10, 10 10))
(1) Point (2) LineString (3) Polygon
7
8. Copyright⒞ 2020. H.J. Sim. All rights reserved.
3. 공간 데이터 타입 (2/3)
• 다차원의 공간 데이터를 저장할 수 있는 다양한 공간 데이터 타입이 존재
• MySQL에서는 아래와 같은 공간 데이터 타입을 지원
(4) Multi-Point (5) Multi-LineString (6) Multi-Polygon (7) GeomCollection
공간
데이터 타입
정의 SQL 예제
Multi-Point 다수 개의 Point 집합 MULTIPOINT (10 10, 30 20)
Multi-LineString 다수 개의 LineString 집합 MULTILINESTRING ((10 10, 20 20), (20 15, 30 40))
Multi-Polygon 다수 개의 Polygon 집합
MULTIPOLYGON ((( 10 10, 15 10, 20 15, 20 25, 15
20, 10 10 )) , (( 40 25, 50 40, 35 35, 25 10, 40 25 )) )
GeomCollection 모든 공간 데이터들의 집합
GEOMETRYCOLLECTION ( POINT (10 10),
LINESTRING (20 20, 30 40), POINT (30 15) )
8
9. Copyright⒞ 2020. H.J. Sim. All rights reserved.
3. 공간 데이터 타입 (3/3)
• 공간 데이터 타입 사용
– 테이블 생성 및 공간 데이터 입력 예제
9
10. Copyright⒞ 2020. H.J. Sim. All rights reserved.
4. 공간 관계 함수 (1/4)
• 두 개의 공간 객체간의 관계를 일반 데이터 타입(Boolean 또는 숫자)으로 반환해 주는 함수
• MySQL에서는 아래와 같은 공간 관계 함수를 지원
공간 관계 함수 설명
ST_Equals (g1 Geometry,g2 Geometry)
: Boolean
g1과 g2가 동일하면 True를 반환하고 상이하다면 False를 반
환
ST_Disjoint (g1 Geometry, g2 Geometry)
: Boolean
g1과 g2가 겹치는 곳 없다면 True를 반환하고, 겹치는 곳이
있으면 False를 반환
ST_Within (g1 Geometry, g2 Geometry)
: Boolean
g1가 g2 영역 안에 포함된 경우 True를 반환하고 그렇지 않
은 경우 False를 반환
ST_Overlaps (g1 Geometry, g2 Geometry)
: Boolean
g1과 g2 영역 중 교집합 영역이 존재하는 경우 True를 반환
하고 존재하지 않는 경우 False를 반환
(1) ST_Equals
g1 g2
(2) ST_Disjoint
g1 g2
g1
g2
(3) ST_Within
g1
g2
(4) ST_Overlaps
g1
g2
g1
g2
10
11. Copyright⒞ 2020. H.J. Sim. All rights reserved.
4. 공간 관계 함수 (2/4)
• 두 개의 공간 객체간의 관계를 일반 데이터 타입(Boolean 또는 숫자)으로 반환해 주는 함수
• MySQL에서는 아래와 같은 공간 관계 함수를 지원
공간 관계 함수 설명
ST_Intersects (g1 Geometry, g2 Geometry)
: Boolean
g1과 g2 영역 간에 교집합이 존재하는 경우 True를 반환하고
그렇지 않은 경우 False를 반환
ST_Contains (g1 Geometry, g2 Geometry)
: Boolean
g2가 g1 영역 안에 포함된 경우 True를 반환하고 그렇지 않
은 경우 False를 반환
ST_Touches (g1 Geometry, g2 Geometry)
: Boolean
g1과 g2가 경계 영역에서만 겹치는 경우 결과 값으로 True를
반환하며 경계 영역 외에서 겹치거나 겹치는 곳이 없다면 Fa
lse를 반환
ST_Distance (g1 Geometry, g2 Geometry)
: Double
g1과 g2간의 거리를 반환
(7) ST_Touches(5) ST_Intersects (6) ST_Contains
g2
g1
g1
g2
g1
g2
g2
g2
g1
11
12. Copyright⒞ 2020. H.J. Sim. All rights reserved.
4. 공간 관계 함수 (3/4)
• 공간 관계 함수 사용 예
(1,1) (10,1)
(10,10)(1,10)
(2,2)
(3,3)
(4,4)
(0,0)
p0 : POINT(0,0)
p1 : POINT(1,1)
p2 : POINT(2,2)
l1 : LINESTRING(1 1, 3 3)
l2 : LINESTRING(2 2, 4 4)
b1 : Polygon(1 1,1 10,10
10,10 1,1 1)
12
13. Copyright⒞ 2020. H.J. Sim. All rights reserved.
4. 공간 관계 함수 (4/4)
• 공간 관계 함수 사용 예
(1,1) (10,1)
(10,10)(1,10)
(2,2)
(3,3)
(4,4)
(0,0)
p0 : POINT(0,0)
p1 : POINT(1,1)
p2 : POINT(2,2)
l1 : LINESTRING(1 1, 3 3)
l2 : LINESTRING(2 2, 4 4)
b1 : Polygon(1 1,1 10,10
10,10 1,1 1)
13
14. Copyright⒞ 2020. H.J. Sim. All rights reserved.
5. 공간 연산 함수 (1/5)
• 두 개의 공간 객체의 연산 결과를 공간 객체로 반환해 주는 함수
• MySQL에서는 아래와 같은 공간 관계 함수를 지원
공간 연산 함수 설명
ST_Intersection (g1 Geometry, g2 Geometry)
: Geometry
g1과 g2의 교집합인 공간 객체를 반환
ST_Union (g1 Geometry, g2 Geometry)
: Geometry
g1과 g2의 합집합인 공간 객체를 반환
ST_Difference (g1 Geometry, g2 Geometry)
: Geometry
g1과 g2의 차집합인 공간 객체를 반환
ST_Buffer (g1 Geometry, d Double )
: Geometry
g1에서 d 거리만큼 확장된 공간 객체를 반환
(1) ST_Intersection (2) ST_Union (3) ST_Difference (4) ST_Buffer
g1
g2
g1
g2
g1
g2 n
g1
14
15. Copyright⒞ 2020. H.J. Sim. All rights reserved.
5. 공간 연산 함수 (2/5)
• 두 개의 공간 객체의 연산 결과를 공간 객체로 반환해 주는 함수
• MySQL에서는 아래와 같은 공간 관계 함수를 지원
(7) ST_EndPoint(5) ST_Envelope (6) ST_StartPoint
g1
(8) ST_PointN
g1 g1
n = 3
g1
공간 연산 함수 설명
ST_Envelope (g1 Geometry)
: Polygon
g1을 포함하는 최소 MBR인 Polygon을 반환
ST_StartPoint (l1 LineString)
: Point
l1의 첫 번째 Point를 반환
ST_EndPoint (l1 LineString)
: Point
l1의 마지막 Point를 반환
ST_PointN (l1 LineString)
: Point
l1의 n 번째 Point를 반환
15
16. Copyright⒞ 2020. H.J. Sim. All rights reserved.
5. 공간 연산 함수 (3/5)
• 공간 연산 함수 사용 예
p0 : POINT(0,0)
p1 : POINT(1,1)
p2 : POINT(2,2)
l1 : LINESTRING(1 1, 3 3,
5 5, 10 10, 14 14)
l2 : LINESTRING(2 2, 8 8)
b1 : Polygon(1 1,1 10,10
10,10 1,1 1)
(10,1)
(10,10)(1,10)
(0,0)
(1,1)
(2,2)
(3,3)
(4,4)
(14,14)
(8,8)
16
17. Copyright⒞ 2020. H.J. Sim. All rights reserved.
5. 공간 연산 함수 (4/5)
• 공간 연산 함수 사용 예
p0 : POINT(0,0)
p1 : POINT(1,1)
p2 : POINT(2,2)
l1 : LINESTRING(1 1, 3 3,
5 5, 10 10, 14 14)
l2 : LINESTRING(2 2, 8 8)
b1 : Polygon(1 1,1 10,10
10,10 1,1 1)
(10,1)
(10,10)(1,10)
(0,0)
(1,1)
(2,2)
(3,3)
(4,4)
(14,14)
(8,8)
17
18. Copyright⒞ 2020. H.J. Sim. All rights reserved.
5. 공간 연산 함수 (5/5)
• 공간 연산 함수 사용 예
p0 : POINT(0,0)
p1 : POINT(1,1)
p2 : POINT(2,2)
l1 : LINESTRING(1 1, 3 3,
5 5, 10 10, 14 14)
l2 : LINESTRING(2 2, 8 8)
b1 : Polygon(1 1,1 10,10
10,10 1,1 1)
(10,1)
(10,10)(1,10)
(0,0)
(1,1)
(2,2)
(3,3)
(4,4)
(14,14)
(8,8)
18
19. Copyright⒞ 2020. H.J. Sim. All rights reserved.
6. 공간 데이터베이스 활용
• 공간 데이터베이스를 사용한 위치 기반 상점 검색 예
– 건물영역(다각형)좌표 저장을 위한 공간 데이터 모델
– 사용자 위치에서 가까운 'GAS STATION'목록을 상위 30건까지 조회하는 SQL (MySQL)
SELECT S.STORE_ID
, S.STORE_NM
, B.BLD_ID
, B.BLD_ADDR
, B.BLD_POLYGON
, ST_DISTANCE(B.BLD_ POLYGON, POINT(@USER_X_CRD, @USER_Y_CRD) ) DIST
FROM STORE S
, BLD B
WHERE S.STORE_TYPE = 'GAS STATION'
AND S.BLD_ID = B.BLD_ID
ORDER BY DIST;
19
공간 데이터 타입 사용으로
좌표를 저장하는 별도 엔터티 불필요
공간데이터 타입(Polygon) 사용
다양한 공간 연산이 가능
공간 연산자 사용으로 간결한 쿼리 작성 가능
건물ID … 건물Polygon
10 … Polygon(x1 y1, x2 y2, … xn yn)
20. Copyright⒞ 2020. H.J. Sim. All rights reserved.
7. 공간 인덱스 R-Tree
• R-Tree
– 공간 객체를 검색하기 위한 동적 인덱스 구조
– 리프 노드에 다차원 공간 객체의 위치 정보를 저장하고 있는 높이 균형 Tree
– 조회하고자 하는 공간 객체에 포함/교차되는 공간 데이터를 빠르게 검색 가능함
– 각 공간 객체는 객체가 포함되는 최소 경계 사각형인 MBR(Minimum Bounding Rectangle)로 표현됨
– 상위 노드는 하위 노드의 MBR을 모두 포함하는 MBR로 표현됨
– 중간 노드는 레벨이 같은 다른 중간 노드와 겹치는 영역이 존재함
– 신규 인덱스 엔트리가 추가 시 삽입될 노드의 선택 기준은 가장 가까우며 확장을 최소화 할 수 있는 노드임
R4R3
21 4 53 76
R2R1
9 108 1211
R6 R7R5
6
R
1
R1
R2
R3
R4
R5
R6
R7
2
5
4
3
7
8
10
9
11
12
공간
데이터
객체
( I , child-point )
( I , tuple-identifier )
* I : 하위 노드 내 MBR 집합
20