[Oracle] SDO_GEOMETRY 사용 방법

SDO_GEOMETRY

Oracle Spatial을 사용하여 공간 데이터를 생성하고 관리합니다. Oracle 에는 SDO_GEOMETRY 타입을 통하여 공간 데이터를 구성할 수 있습니다.

SDO_GEOMETRY 은 다음과 같이 정의됩니다.

1
2
3
4
5
6
7
CREATE TYPE sdo_geometry AS OBJECT (
SDO_GTYPE NUMBER,
SDO_SRID NUMBER,
SDO_POINT SDO_POINT_TYPE,
SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY,
SDO_ORDINATES SDO_ORDINATE_ARRAY
);
SDO_GTYPE
  • 00 - UNKNOWN_GEOMETRY
  • 01 - POINT
  • 02 - LINE or CURVE
  • 03 - POLYGON or SURFACE
  • 04 - COLLECTION
  • 05 - MULTIPOINT
  • 06 - MULTILINE or MULTICURVE
  • 07 - MULTIPOLYGON or MULTISURFACE
  • 08 - SOLID
  • 09 - MULTISOLID

예) 2003 일 경우 2차원의 POLYGON 형식

SDO_SRID

Geometry와 연관된 Coordinate System(Spatial Reference System)입니다. 값이 NULL 이면 관련된 Coordinate System 이 없는 것입니다.

SDO_POINT

POINT 형식일 때 사용합니다. SDO_POINT_TYPE(x, y, z) 을 통해 포인트를 입력합니다.

SDO_ELEM_INFO

SDO_ORDINATES 에 저장될 값의 형식을 정의합니다.

예) SDO_ELEM_INFO_ARRAY(1,1003,3)

  • 첫 번째 1 은 SDO_ORDINATES 에 입력된 도형 ARRAY 의 시작 위치
  • 1003과 3은 도형 형식을 정의
    • 1003 은 외부도형, 2003 일 경우 내부도형
    • (1,1003,1) or (1,2003,1) : 폴리곤 형식으로 4면 다각형의 경우 5개의 점을 지정하고 점 5와 점 1은 동일
    • (1,1003,3) or (1,2003,3) : 직사각형 유형. 왼쪽 하단과 오른쪽 상단의 두 점을 지정
    • (1,1003,4) or (1,2003,4) : 원형 유형. 최소 3개의 점을 지정해야 함
    • 자세한 내용은 참고 사이트에서 확인
SDO_ORDINATES

SDO_ELEM_INFO 에서 정의된 형식으로 값을 입력합니다.

Spatial Table 생성

1. 테이블 생성

shape 필드에 SDO_GEOMETRY 타입을 지정하여 Spatial 테이블을 생성하였습니다.

1
2
3
4
5
6
CREATE TABLE sample_table
(
id NUMBER PRIMARY KEY,
name VARCHAR2(20),
shape SDO_GEOMETRY
);

2. 메타데이터 생성

SDO_GEOMETRY 를 사용하기 전에 꼭 메타데이터를 생성해줘야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
insert into user_sdo_geom_metadata
(
table_name,
column_name,
diminfo,
srid
)
values
(
'sample_table',
'shape',
SDO_DIM_ARRAY(
SDO_DIM_ELEMENT('Longitude', -180, 180, 0.5), => 10 미터 허용오차
SDO_DIM_ELEMENT('Latitude', -90, 90, 0.5)
),
4326 ====> Longitude/Latitude(WGS 84) : 4326
);

3. 인덱스 생성

메타데이터 생성 후 Spatial 테이블의 인덱스를 생성합니다.

1
2
3
4
5
# 인덱스 생성 형식
CREATE INDEX index_name ON table_name(column_name) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

# 사용 예제
CREATE INDEX sample_index ON sample_table(shape) indextype IS MDSYS.SPATIAL_INDEX;

4. 데이터 입력

테이블을 생성하고 메타데이터와 인덱스까지 생성하였으면 데이터를 넣어봅니다.

1
2
3
4
5
6
# Rectangle 데이터
INSERT INTO sample_table (id, name, shape)
VALUES ( 1, 'Rectangle',
SDO_GEOMETRY(2003, 4326, NULL,
SDO_ELEM_INFO_ARRAY(1,1003,3),
SDO_ORDINATE_ARRAY(5,5, 10,10)) );

5. 확인

입력된 데이터가 SDO_GEOMETRY 형식인지 확인합니다. 결과가 TRUE 가 아니면 잘못된 입력입니다.

1
2
3
4
SELECT id, name, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(shape, 0.5) FROM sample_table;

# 결과
1, Rectangle, TRUE

SDO_GEOMETRY 타입을 사용하여 공간 데이터 생성을 진행하였습니다. 다음에는 생성된 공간 데이터에 대한 쿼리를 알아보겠습니다.

참고

Share