[Oracle] Spatial Data Query

Table

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

INSERT

SDO_GEOMETRY 컬럼에 넣을 데이터는 타입마다 형식이 다릅니다.

  • Point(점) 타입
1
2
3
4
5
6
7
SDO_GEOMETRY(
2001,
4326,
SDO_POINT_TYPE(126.64,36.86, NULL),
NULL,
NULL
)
  • Rectangle(직사각형) 타입
1
2
3
4
5
6
7
8
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 타입
1
2
3
4
5
6
7
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(원) 타입
1
2
3
4
5
6
7
SDO_GEOMETRY(
2003,
4326,
NULL,
SDO_ELEM_INFO_ARRAY(1,1003,4), -- 1개의 원
SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11) -- 1개의 원은 최소 3개의 점으로 정의됨
)
  • 두 개의 폴리곤
1
2
3
4
5
6
7
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 예제
1
2
3
4
5
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

  • 입력된 직사각형 영역 안의 데이터 조회
1
2
3
4
5
6
7
8
9
10
11
# 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
1
2
3
4
5
6
7
8
9
10
11
# 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 좌표 조회
1
2
SELECT name, t.x, t.y, t.id
FROM sample_table s, TABLE(SDO_UTIL.GETVERTICES(s.shape)) t
  • Polygon Center 좌표 조회
1
2
3
4
5
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 형식이 맞는가?
1
2
SELECT s.name, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(s.shape, 0.005)
FROM sample_table s

참고

Share