Oracle Spatial提供空間數據存儲、索引與查詢能力。本文記錄空間表初始化的標準流程:表結構擴展、元數據註冊、空間索引創建、MapInfo目錄同步。
ALTER TABLE Dev_Acrossbox ADD (
LOCATION MDSYS.SDO_GEOMETRY DEFAULT NULL,
MI_STYLE VARCHAR2(254) DEFAULT NULL,
MI_PRINX NUMBER(10) DEFAULT NULL
);
說明:SDO_GEOMETRY是Oracle Spatial核心類型,MI_STYLE/MI_PRINX為MapInfo兼容欄位。
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
'DEV_TOWER_ACTL', -- 表名
'LOCATION', -- 空間欄位名
MDSYS.SDO_DIM_ARRAY( -- 維度定義
MDSYS.SDO_DIM_ELEMENT('X', -180, 180, 0.0011119487),
MDSYS.SDO_DIM_ELEMENT('Y', -90, 90, 0.0011119487)
),
8307 -- SRID: WGS84地理坐標系統
);
關鍵參數:
CREATE INDEX IDX_SPATIAL_Dev_Acrossbox
ON Dev_Acrossbox(LOCATION)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
空間索引基於R-Tree結構,顯著加速空間篩選查詢(SDO_FILTER, SDO_NN等)。
將空間表註冊到MapInfo目錄表,支持MapInfo客戶端訪問:
DECLARE
v_type MAPINFO_MAPCATALOG%ROWTYPE;
BEGIN
SELECT * INTO v_type
FROM mapinfo_mapcatalog m
WHERE m.tablename = 'LINE_INFO'
AND m.ownername = 'POSTGIS';
v_type.tablename := &new_tableName; -- 目標表名
INSERT INTO MAPINFO_MAPCATALOG VALUES v_type;
COMMIT;
DBMS_OUTPUT.PUT_LINE(v_type.tablename);
END;
DECLARE
v_type MAPINFO_MAPCATALOG%ROWTYPE;
BEGIN
SELECT * INTO v_type
FROM mapinfo_mapcatalog m
WHERE m.tablename = 'DEV_TRANSTATION'
AND m.ownername = 'POSTGIS';
v_type.tablename := &new_tableName;
INSERT INTO MAPINFO_MAPCATALOG VALUES v_type;
COMMIT;
DBMS_OUTPUT.PUT_LINE(v_type.tablename);
END;
-- 1. 添加空間欄位
ALTER TABLE target_table ADD (
LOCATION MDSYS.SDO_GEOMETRY,
MI_STYLE VARCHAR2(254),
MI_PRINX NUMBER(10)
);
-- 2. 註冊元數據(根據實際表名、欄位、坐標範圍調整)
INSERT INTO USER_SDO_GEOM_METADATA VALUES (
'TARGET_TABLE', 'LOCATION',
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X', min_x, max_x, tolerance),
MDSYS.SDO_DIM_ELEMENT('Y', min_y, max_y, tolerance)
),
srid
);
-- 3. 創建空間索引
CREATE INDEX idx_spatial_target_table
ON target_table(location)
INDEXTYPE IS MDSYS.SPATIAL_INDEX;
-- 4. 同步MapInfo目錄(如需要)
-- 參考上述PL/SQL塊
SELECT index_name, status FROM user_indexes WHERE index_name = 'IDX_SPATIAL_...';Oracle Spatial空間表初始化遵循「結構→元數據→索引→目錄」四步走流程。規範操作確保空間查詢功能正常、性能達標,並兼容MapInfo等GIS客戶端工具。