본문 바로가기
프로그래밍

[Oracle] SDO_GEOMETRY

by 이음코드 2024. 11. 22.
반응형

1. 오라클 SDO_GEOMETRY 정의

SDO_GEOMETRY는 Oracle Spatial 및 Graph에서 제공하는 데이터 타입입니다. 공간 데이터를 저장하고 관리하며 GIS 나 위치 기반 서비스를 개발할 때 공간 좌표를 관리하는데 주로 사용됩니다. 이 데이터 타입은 점(point), 선(Line), 폴리곤(Polygon) 등 다양한 공간 데이터를 표현할 수 있도록 설계되었습니다.

 

2. SDO_GEOMETRY 구조

  1. SDO_GTYPE
    •   공간 데이터 유형
    •   예) 점 (2001), 선 (2002), 폴리곤 (2003) 등
  2. SDO_SRID
    •   좌표 참조 시스템의 ID를 저장하여 공간 데이터가 어떤 기준 좌표계에 기반하고 있는지 알 수 있습니다.
  3. SDO_POINT
    •   점 데이터를 저장합니다.
    •   X,Y, Z 좌표로 구성됩니다.
  4. SDO_ELEM_INFO
    •   공간 데이터의 구조적 정보를 정의합니다.
  5. SDO_ORDINATES
    •   실제 공간 좌표 데이터를 배열 형태로 저장합니다.
MDSYS.SDO_GEOMETRY(
    SDO_GTYPE,      -- 지오메트리 타입 (점, 선, 폴리곤 등)
    SDO_SRID,       -- 공간 참조 ID (SRID)
    SDO_POINT,      -- 점 형상 정보 (점인 경우에만 사용)
    SDO_ELEM_INFO,  -- 요소 정보 (다각형 등 복합적인 형상 정보)
    SDO_ORDINATES   -- 좌표 리스트 (x, y, z 값들을 포함)
)

 

3. SDO_GEOMETRY 기본 활용 방법

  • 오라클 테이블에 SDO_GEOMETRY 타입 컬럼 생성
CREATE TABLE TABLE_NAME (
  ID      VARCHAR2(255 BYTE) NOT NULL,
  COORD MDSYS.SDO_GEOMETRY,
  CONSTRAINT TABLE_NAME _PK PRIMARY KEY (ID)
);
  • 이미 생성된 테이블에 SDO_GEOMETRY 타입 컬럼 생성
ALTER TABLE TABLE_NAME
ADD COORD MDSYS.SDO_GEOMETRY;
  • SDO_GEOMETRY 데이터 삽입
INSERT INTO TABLE_NAME (ID, COORD)
VALUES (
    1,
    SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(10.0, 20.0, NULL), NULL, NULL)
);
  • SDO_GEOMETRY 컬럼 삭제
ALTER TABLE TABLE_NAME
DROP COLUMN COORD;
  • 공간 인덱스 생성 (선택사항) : 공간 데이터를 효율적으로 검색하고 쿼리하기 위해 사용됩니다.
CREATE INDEX COORD_IDX ON TABLE_NAME (COORD)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;

 

4. SDO_GEOMETRY 고급 활용

  • 거리 계산
    • SDO_GEOM.SDO_DISTANCE : 이 함수는 두 공간 객체 (점, 선, 폴리곤 등) 간의 최단 거리를 계산합니다.
    • 결과값은 좌표계 단위로 반환됩니다.

[함수 구조]

SDO_GEOM.SDO_DISTANCE(
    geometry1 IN SDO_GEOMETRY,
    geometry2 IN SDO_GEOMETRY,
    tolerance IN NUMBER -- 계산 오차 허용 범위. 
) RETURN NUMBER;

 

[점과 점 사이의 거리 계산]

SELECT SDO_GEOM.SDO_DISTANCE(
    SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(10.0, 20.0, NULL), NULL, NULL),
    SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(30.0, 40.0, NULL), NULL, NULL),
    0.005
) AS 거리
FROM DUAL;
  • 영역 내 데이터 검색
    • SDO_RELATE : 특정 공간 객체가 주어진 영역(폴리곤, 원 등)에 포함되거나 겹치는지 확인하는데 사용됩니다.

[함수 구조]

SDO_RELATE(
    geometry1 IN SDO_GEOMETRY, -- 비교할 SDO_GEOMETRY 객체
    geometry2 IN SDO_GEOMETRY,
    params IN VARCHAR2 -- 관계를 정의하는 매개변수
) RETURN VARCHAR2;

* params : MASK= 옵션으로 관계를 지정
 - MASK=INSIDE : geometry1이 geometry2 안에 완전히 포함되어 있는 경우
 - MASK=OVERLAPBDYDISJOINT : geometry1과 geometry2가 경계를 제외하고 겹치는 경우
 - MASK=ANYINTERACT : 두 객체가 서로 겹치거나 닿는 경우

 

반응형