Oracle Spatial 不僅是空間資料的「倉庫」,更是一個完整的「空間運算引擎」。它將 OGC/ISO 標準的空間功能下推至資料庫核心,讓開發者以標準 SQL 完成從儲存、索引、查詢到進階分析的全流程。本文針對實務應用中最常用的七大能力進行深度解析與代碼示範。
-- 查詢支援的坐標系
SELECT srid, cs_name FROM mdsys.cs_srs WHERE cs_name LIKE '%Taiwan%';
-- 幾何體投影轉換 (TWD97 TM2 → WGS84)
SELECT sdo_cs.transform(geom, 4326) FROM parcels WHERE srid = 3826;
內建 4000+ 坐標系(EPSG/OGP 標準),支援使用者自定義投影參數。
CREATE INDEX parcels_spidx ON parcels(geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX_V2
PARAMETERS ('LAYER_GTYPE=POLYGON SDO_INDX_DIMS=2');
PARALLEL 8 大幅縮短百萬級要素建索引時間。| 運算子 | 語義 | 典型場景 |
|---|---|---|
| SDO_FILTER | MBR 粗略過濾(索引驅動) | 大範圍首輪篩選 |
| SDO_RELATE | 九交集模型精確關係 | ANYINTERACT、CONTAINS、COVERS、TOUCH、OVERLAPBDYINTERSECT |
| SDO_NN | 最近鄰搜尋 | 最近便利店、最近車站 |
| SDO_WITHIN_DISTANCE | 距離緩衝篩選 | 災害影響半徑、商圈分析 |
SELECT s.name, s.geom
FROM schools s, railways r
WHERE sdo_relate(s.geom, r.geom, 'mask=ANYINTERACT') = 'TRUE';
若既有表僅存經緯度欄位(LON NUMBER, LAT NUMBER),可直接建立空間索引:
CREATE INDEX stores_geo_idx ON stores(
SDO_GEOMETRY(2001, 4326,
SDO_POINT_TYPE(lon, lat, NULL), NULL, NULL)
)
INDEXTYPE IS MDSYS.SPATIAL_INDEX_V2;
後續即可直接對經緯度欄位使用 SDO_WITHIN_DISTANCE 等運算子,省去新增 SDO_GEOMETRY 欄位與 ETL 同步的開發成本。
-- 兩點間大地距離 (公尺)
SELECT sdo_geom.sdo_distance(
SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(121.5, 25.0, NULL), NULL, NULL),
SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(121.6, 25.1, NULL), NULL, NULL),
0.005, 'unit=M') FROM dual;
-- 多邊形大地面積 (平方公尺)
SELECT sdo_geom.sdo_area(geom, 0.005, 'unit=SQ_M') FROM counties;
所有空間函數、運算子、工具均自動處理投影坐標與地理坐標的單位轉換,消除手動換算錯誤。
CREATE INDEX parcels_spidx ON parcels(geom)
INDEXTYPE IS MDSYS.SPATIAL_INDEX_V2
LOCAL -- 本地分區索引
PARAMETERS ('LAYER_GTYPE=POLYGON');
ALTER INDEX parcels_spidx REBUILD PARALLEL 16;
將建索引工作分解為多個並行任務,充分利用多核 CPU,百萬級要素可從小時級降至分鐘級。
Oracle Spatial 將傳統 GIS 的所有分析功能與 Oracle 強大的資料倉儲技術(分區、並行、物化視圖、結果快取、Resource Manager、In-Memory)緊密融合。開發者無需學習專有 GIS API,僅以標準 SQL 即可構建跨領域的空間數據服務,再透過 ORDS/APEX/REST 發布給前端應用。這正是「資料庫即平台」在空間領域的最佳實踐。