[Oracle] Spatial Data QueryDatabase/Oracle2022. 9. 22. 21:12
Table of Contents
반응형
Table
CREATE TABLE sample_table
(
id NUMBER PRIMARY KEY,
name VARCHAR2(20),
shape SDO_GEOMETRY
);
INSERT
SDO_GEOMETRY 컬럼에 넣을 데이터는 타입마다 형식이 다릅니다.
- Point(점) 타입
SDO_GEOMETRY(
2001,
4326,
SDO_POINT_TYPE(126.64,36.86, NULL),
NULL,
NULL
)
- Rectangle(직사각형) 타입
SDO_GEOMETRY(
2003, -- 2차원의 폴리곤
4326,
NULL,
SDO_ELEM_INFO_ARRAY(1,1003,3), -- 1개의 사각형
SDO_ORDINATE_ARRAY(126.63,36.84, 126.65,36.88)
-- 사각형을 정의하기 위해 오직 2개의 포인트 필요(lower left and upper right)
)
- Polygon 타입
SDO_GEOMETRY(
2003,
4326,
NULL,
SDO_ELEM_INFO_ARRAY(1,1003,1), -- 1개의 폴리곤
SDO_ORDINATE_ARRAY(126.63,36.88, 126.64,36.88, 126.64,36.84, 126.63,36.84, 126.63,36.88)
)
- Circle(원) 타입
SDO_GEOMETRY(
2003,
4326,
NULL,
SDO_ELEM_INFO_ARRAY(1,1003,4), -- 1개의 원
SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11) -- 1개의 원은 최소 3개의 점으로 정의됨
)
- 두 개의 폴리곤
SDO_GEOMETRY (
2003, -- 2차원의 폴리곤
4326,
NULL,
SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),
SDO_ORDINATE_ARRAY(0,0, 10,0, 10,10, 0,10, 0,0, 4,4, 6,4, 6,6, 4,6, 4,4)
)
- Insert 예제
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(126.63,36.84, 126.65,36.88)) );
SELECT
- 입력된 직사각형 영역 안의 데이터 조회
# SDO_INTERSECTION(geometry1, geometry2, tolerance);
SELECT id, name
FROM sample_table
WHERE SDO_GEOM.SDO_INTERSECTION(
shape,
SDO_GEOMETRY(2003, 4326, NULL,
SDO_ELEM_INFO_ARRAY(1,1003,3),
SDO_ORDINATE_ARRAY(126.61,36.82, 126.66,36.90)),
0.005
) is not null
# SDO_RELATE(geometry1, geometry2, param);
SELECT id, name
FROM sample_table
WHERE SDO_RELATE(
shape,
SDO_GEOMETRY(2003, 4326, NULL,
SDO_ELEM_INFO_ARRAY(1,1003,3),
SDO_ORDINATE_ARRAY(126.61,36.82, 126.66,36.90)),
'mask=INSIDE+OVERLAPBDYINTERSECT+EQUAL+COVERS'
) = 'TRUE'
위의 쿼리에서 SDO_RELATE 의 param에 대한 내용은 참고 사이트에 자세하게 설명되어 있습니다.
- X, Y 좌표 조회
SELECT name, t.x, t.y, t.id
FROM sample_table s, TABLE(SDO_UTIL.GETVERTICES(s.shape)) t
- Polygon Center 좌표 조회
SELECT
SDO_GEOM.SDO_CENTROID(s.shape, m.diminfo).SDO_POINT.X x,
SDO_GEOM.SDO_CENTROID(s.shape, m.diminfo).SDO_POINT.Y y
FROM sample_table s, user_sdo_geom_metadata m
WHERE name = 'Polygon'
- Geometry 형식이 맞는가?
SELECT s.name, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(s.shape, 0.005)
FROM sample_table s
참고
반응형
'Database > Oracle' 카테고리의 다른 글
[Oracle] 사용자 및 테이블 조회 (0) | 2022.11.17 |
---|---|
[Oracle] 계정 관리 (0) | 2022.11.17 |
[Oracle] 테이블 스페이스 사용 방법 (0) | 2022.11.17 |
[Oracle] SDO_GEOMETRY 사용 방법 (0) | 2022.09.22 |
@고지니어스 :: 규니의 개발 블로그
IT 기술과 개발 내용을 포스팅하는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!