CREATE TYPE SDO_GEOMETRY AS OBJECT (
SDO_GTYPE NUMBER, -- 幾何類型與維度
SDO_SRID NUMBER, -- 空間參考系統 ID (EPSG 代碼)
SDO_POINT SDO_POINT_TYPE,-- 點幾何體專用 (X, Y, Z)
SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY, -- 元素資訊陣列 (多邊形環、線串起點等)
SDO_ORDINATES SDO_ORDINATE_ARRAY, -- 座標陣列 (X1,Y1, X2,Y2, ...)
MEMBER FUNCTION GET_GTYPE RETURN NUMBER DETERMINISTIC
-- 更多成員函數:GET_DIMS, GET_LRS_DIM, ST_IsValid 等
);
範例:2003 = 二維多邊形;3302 = 三維含 LRS 線串。
對應 MDSYS.CS_SRS 表中的 SRID。常用:8307 (WGS 84 經緯度)、3857 (Web Mercator)、32651 (WGS 84 UTM Zone 51N)。NULL 表示無座標系統(笛卡兒平面)。
CREATE TYPE SDO_POINT_TYPE AS OBJECT (X NUMBER, Y NUMBER, Z NUMBER);
-- 單點幾何體可直接填 SDO_POINT,SDO_ELEM_INFO/SDO_ORDINATES 留 NULL
INSERT INTO poi VALUES (1, 'Taipei 101',
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(121.5645, 25.0338, NULL), NULL, NULL));
SDO_ELEM_INFO 為三元組陣列 (offset, etype, interpretation):
offset:在 SDO_ORDINATES 中的起始位置(1-based)etype:元素類型(1=點, 2=線串, 1003/2003=外環/內環多邊形)interpretation:直線/圓弧/複合曲線解讀方式SDO_ORDINATES 為扁平化座標陣列 VARRAY(1048576) OF NUMBER。
CREATE TABLE parks (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
geom SDO_GEOMETRY
);
-- 插入矩形多邊形 (外環 1003, 逆時針)
INSERT INTO parks VALUES (1, 'DaAn Park',
SDO_GEOMETRY(2003, 8307, NULL,
SDO_ELEM_INFO_ARRAY(1,1003,1),
SDO_ORDINATE_ARRAY(121.53,25.03, 121.55,25.03, 121.55,25.04, 121.53,25.04, 121.53,25.03)));
-- 建立空間索引(必須)
CREATE INDEX parks_spatial_idx ON parks(geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX_V2
PARAMETERS ('LAYER_GTYPE=POLYGON SDO_RTR_PCTFREE=0');
-- 空間查詢:範圍內的公園
SELECT name FROM parks
WHERE SDO_RELATE(geom,
SDO_GEOMETRY(2003,8307,NULL,
SDO_ELEM_INFO_ARRAY(1,1003,1),
SDO_ORDINATE_ARRAY(121.52,25.02, 121.56,25.02, 121.56,25.05, 121.52,25.05, 121.52,25.02)),
'MASK=ANYINTERACT') = 'TRUE';
SDO_FILTER(主過濾)、SDO_RELATE(拓撲關係)、SDO_NN(最近鄰)、SDO_WITHIN_DISTANCE(距離緩衝)SDO_GEOM.SDO_AREA、SDO_LENGTH、SDO_BUFFER、SDO_UNION、SDO_INTERSECTIONSDO_PC/SDO_TIN 型別