Oracle Spatial建表學(xué)習(xí)步驟詳解
Oracle Spatial建表學(xué)習(xí)的步驟是本文我們主要要介紹的內(nèi)容,步驟如下:
Step1. 創(chuàng)建一張表,其中shape用來(lái)存放空間數(shù)據(jù)
- CREATE TABLE mylake (
- feature_id NUMBER PRIMARY KEY,
- name VARCHAR2(32),
- shape MDSYS.SDO_GEOMETRY);
Step2. 在user_sdo_geom_metadata 表中插入新記錄,用于描述空間字段
- INSERT INTO user_sdo_geom_metadata VALUES (
- 'mylake', //---表名
- 'shape', //---字段名
- MDSYS.SDO_DIM_ARRAY(
- MDSYS.SDO_DIM_ELEMENT('X', 0, 100, 0.05), //---X維最小,***值和容忍度。
- MDSYS.SDO_DIM_ELEMENT('Y', 0, 100, 0.05) //---Y維最小,***值和容忍度 NULL //---坐標(biāo)系,缺省為笛卡爾坐標(biāo)系
- );
Step3. 創(chuàng)建空間索引
- CREATE INDEX mylake_idx ON mylake(shape)
- INDEXTYPE IS MDSYS.SPATIAL_INDEX
Step4. 插入空間數(shù)據(jù)
Oracle Spatial用MDSYS.SDO_GEOMETRY來(lái)存儲(chǔ)空間數(shù)據(jù),定義為:
- CREATE TYPE sdo_geometry AS OBJECT (
- SDO_GTYPE NUMBER,
- SDO_SRID NUMBER,
- SDO_POINT SDO_POINT_TYPE,
- SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY,
- SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY);
SDO_SRID:坐標(biāo)系,NULL為笛卡爾坐標(biāo)系。 SDO_POINT:Oracle Spatial也可定義單個(gè)的點(diǎn),SDO_POINT的定義: CREATE TYPE sdo_point_type AS OBJECT (X NUMBER,Y NUMBER,Z NUMBER); 如果是二維,Z為NULL。 SDO_ELEM_INFO:每三個(gè)值描述一個(gè)元素。 ***個(gè)值:***個(gè)頂點(diǎn)在SDO_ORDINATES_ARR開(kāi)始位置 。第二個(gè)值:元素類型 。第三個(gè)值:頂點(diǎn)連接方式:1-通過(guò)直線連接,2-通過(guò)圓弧連接:定義為CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER; SDO_ORDINATES:幾何圖形所有頂點(diǎn)列表。定義為 為CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;
// 插入包含一個(gè)島嶼的湖泊
- INSERT INTO mylake VALUES(
- 10,
- 'Lake Calhoun',
- MDSYS.SDO_GEOMETRY(
- 2003,
- NULL,
- NULL,
- MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),
- MDSYS.SDO_ORDINATE_ARRAY(0,0, 10,0, 10,10, 0,10, 0,0, 4,4, 6,4, 6,6, 4,6, 4,4)
- ));
// 插入兩艘小船
- INSERT INTO mylake VALUES(
- 11,
- 'The Windswept',
- MDSYS.SDO_GEOMETRY(
- 2003,
- NULL,
- NULL,
- MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
- MDSYS.SDO_ORDINATE_ARRAY(2,2, 3,2, 3,2, 2,3, 2,2) ); INSERT INTO mylake VALUES(
- 12,
- 'Blue Crest',
- MDSYS.SDO_GEOMETRY(
- 2003,
- NULL,
- NULL,
- MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
- MDSYS.SDO_ORDINATE_ARRAY(7,7, 8,7, 8,7, 7,8, 7,7) );
Step4. 查詢 Oracle Spatial查詢數(shù)據(jù)包括二個(gè)處理過(guò)程:1.只通過(guò)索引查詢候選項(xiàng)。通過(guò)函數(shù)SDO_FILTER實(shí)現(xiàn):SDO_FILTER(geometry1 MDSYS.SDO_GEOMETRY, geometry2 MDSYS.SDO_GEOMETRY, params VARCHAR2) geometry1: 必須是被索引的幾何數(shù)據(jù) geometry2:不一定是表中的空間字段,也不要求被索引 params:Filter類型 querytype=WINDOW:geometry2不要求來(lái)自表 querytype=JOIN:geometry2必須來(lái)自表。
- SELECT name boat_name
- FROM mylake t
- WHERE feature_id = 12
- AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
- mdsys.sdo_elem_info_array(1,1003,1),
- mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),'querytype=WINDOW') = 'TRUE';
// 選擇在定義矩形內(nèi)的所有小船
- SELECT name boat_name
- FROM mylake t
- WHERE feature_id = 12
- AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
- mdsys.sdo_elem_info_array(1,1003,1),
- mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
- 'querytype=WINDOW') = 'TRUE'
- AND SDO_RELATE(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
- mdsys.sdo_elem_info_array(1,1003,1),
- mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
- 'masktype=INSIDE querytype=WINDOW') = 'TRUE'
// masktype可聯(lián)合使用
- SELECT feature_id id
- FROM mylake t
- WHERE feature_id = 12
- AND SDO_FILTER(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
- mdsys.sdo_elem_info_array(1,1003,1),
- mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
- 'querytype=WINDOW') = 'TRUE'
- AND SDO_RELATE(t.shape, mdsys.sdo_geometry(2003,NULL,NULL,
- mdsys.sdo_elem_info_array(1,1003,1),
- mdsys.sdo_ordinate_array(2,2, 5,2, 5,5, 2,5, 2,2)),
- 'masktype=INSIDE+TOUCH querytype=WINDOW') = 'TRUE'
關(guān)于Oracle Spatial建表學(xué)習(xí)的相關(guān)知識(shí)就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】


2009-11-24 17:20:48




