oracle 空間數據庫說明

轉:http://blog.csdn.net/jing_xin/article/details/4355642git

因爲最近弄一些空間數據,因此找了些oracle空間數據庫的一些知識.下面是彙總:數據庫

Oracle Spatial由一坨的對象數據類型,類型方法,操做子,函數與過程組合而成。一個地理對象做爲一個SDO_GEOMETRY對象保存在表的一個字段裏。空間索引則由普通的DDL和DML語句來創建與維護。數組

建立表: CREATE TABLE cola_marketsoracle

( mkt_id NUMBER PRIMARY KEY,ide

name VARCHAR2(32),函數

shape SDO_GEOMETRY性能

);優化

插入數據:ui

INSERT INTO cola_marketsspa

VALUES(

1,

'cola_a',

SDO_GEOMETRY(

2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)

SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to

-- define rectangle (lower left and upper right) with

-- Cartesian-coordinate data ) );

INSERT INTO cola_markets VALUES(

2,

'cola_b',

SDO_GEOMETRY( 2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)

SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1) ) );

INSERT INTO cola_markets VALUES(

3,

'cola_c',

SDO_GEOMETRY( 2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)

SDO_ORDINATE_ARRAY(3,3, 6,3, 6,5, 4,5, 3,3) ) );

INSERT INTO cola_markets VALUES(

4,

'cola_d',

SDO_GEOMETRY( 2003, -- two-dimensional polygon

NULL,

NULL,

SDO_ELEM_INFO_ARRAY(1,1003,4), -- one circle

SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11) ) );

更新視圖:

USER_SDO_GEOM_METADATA INSERT INTO user_sdo_geom_metadata (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)

VALUES ( 'cola_markets', 'shape', SDO_DIM_ARRAY( -- 20X20 grid SDO_DIM_ELEMENT('X', 0, 20, 0.005), SDO_DIM_ELEMENT('Y', 0, 20, 0.005) ), NULL -- SRID );

建立空間索引:

CREATE INDEX cola_spatial_idx ON cola_markets(shape) INDEXTYPE IS MDSYS.SPATIAL_INDEX; -- Preceding statement created an R-tree index.

 

這樣在mapguide下就能夠preview空間數據信息.

下面來講一下其中最關鍵的一些object:

 

( SDO_GEOMETRY對象類型 在Spatial中,地理對象的描述是放在一個單獨的類型爲SDO_GEOMETRY的字段中的。任何有這個字段的表,都至少要定義一個其它主鍵字段。

Oracle Spatial定義的SDO_GEOMETRY類型爲:

CREATE TYPE sdo_geometry AS OBJECT (  

SDO_GTYPE NUMBER,  

SDO_SRID NUMBER,  

SDO_POINT SDO_POINT_TYPE,  

SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY,  

SDO_ORDINATES SDO_ORDINATE_ARRAY);

固然Spatial也定義了SDO_POINT_TYPE, SDO_ELEM_INFO_ARRAY, 和 SDO_ORDINATE_ARRAY類型:

CREATE TYPE sdo_point_type AS OBJECT (   

X NUMBER,   

Y NUMBER,   

Z NUMBER);

CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER;

CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;

由於SDO_ORDINATE_ARRAY最大爲1048576,因此SDO_GEOMETRY對象的頂點數量就依賴於它的維度,二維爲524288,三維爲349525,四維只有262144個頂點了。

注意:

對於一個給定的層(同一字段),全部的地理對象必須都是相同的維度,不能將二維與三維的數據放在一個層裏。

若是你使用四位的SDO_ETYPE那麼,你也要使用四位的SDO_GTYPE。

)

SDO_GEOMETRY Object Type

2.1 SDO_GTYPE  dltt    

d:維數    

l:linear referencing system (LRS)    

tt:Geometry type    

00 UNKNOWN_GEOMETRY    

01 POINT    

02 LINE or CURVE    

03 POLYGON    

04 COLLECTION    

05 MULTIPOINT    

06 MULTILINE or MULTICURVE    

07 MULTIPOLYGON

2.2 SDO_SRID    

確認coordinate system,此值爲SDO_COORD_REF_SYS表中的SRID值。此值也被插入到USER_SDO_GEOM_METADATA視圖中。

2.3 SDO_POINT    

(1)SDO_ELEM_INFO and SDO_ORDINATES are both null    

(2)SDO_POINT attribute is non-null    

結論:存儲座標

2.4 SDO_ELEM_INFO    

用來解釋存儲在SDO_ORDINATES屬性中的座標信息。    

SDO_STARTING_OFFSET:SDO_ORDINATES中的offset min爲1    

SDO_ETYPE: 1, 2, 1003, and 2003 simple elements; 3 polygon ring; 4, 1005, and 2005 compound elements    

SDO_INTERPRETATION

2.5 SDO_ORDINATES    

長數組,存放空間對象的座標

2.6 Usage Considerations    

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT 用來檢查幾何對象的一致性。

1.1 SDO_GEOMETRY字段詳解

Oracle Spatial的空間數據都存儲在空間字段sdo_Geometry中,理解sdo_Geometry是編寫Oracle Spatial程序的關鍵。sdo_Geometry是按照Open GIS規範定義的一個對象,其原始的建立方式以下所示:

CREATE TYPE sdo_geometry AS OBJECT (

SDO_GTYPE NUMBER,

SDO_SRID NUMBER,

SDO_POINT SDO_POINT_TYPE,

SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY,

SDO_ORDINATES SDO_ORDINATE_ARRAY);

該對象由五個部分組成,各部分的意義以下表所示:

字段名

 

 

 

類型

 

 

 

描述

 

 

 

SDO_GTYPE

 

 

 

NUMBER

 

 

 

幾何對象的類型

 

 

 

SDO_SRID

 

 

 

NUMBER

 

 

 

幾何對象的座標系

 

 

 

SDO_POINT

 

 

 

SDO_POINT_TYPE

 

 

 

表示幾何類型爲點的幾何對象

 

 

 

 

 

SDO_ELEM_INFO

 

 

 

 

 

 

 

SDO_ELEM_INFO_ARRAY

 

 

 

 

 

是一個可變長度的數組,每3個數做爲一個元素單位,用於解釋座標是如何存儲在SDO_ORDINATES中的

 

 

 

 

 

SDO_ORDINATES

 

 

 

 

 

 

 

SDO_ORDINATE_ARRAY

 

 

 

 

 

是一個可變長度的數組,用於存儲幾何對象的真實座標,該數組的類型爲NUMBER型

 

 

 

 

表1.1.1  sdo_geometry 各組成部分的意義

① SDO_GTYPE

是一個NUMBER型的數值,用來定義存儲幾何對象的類型。SDO_GTYPE是一個4個數字的整數,其格式爲dltt,其中d表示幾何對象的維數;l表示三維線性參考系統中的線性參考值,當d爲3維或者4維時須要設置該值,通常狀況下爲空;tt爲幾何對象的類型,Oracle Spatial定義了7種類型的幾何類型,目前,tt使用了00到07,其中08到99是Oracle Spatial保留的數字,以備未來幾何對象擴展所用。下表描述了Oracle Spatia1支持的幾何對象類型。

數值    幾何類型        描述

DL00                    用於存放自定義類型的幾何對象

DL01    點              幾何對象包含一個點

DL02    直線或曲線      幾何對象由直線或曲線段組成

DL03    多邊形          幾何對象包含一個多邊形,該多邊形能夠含有洞

DL04    複合形狀集      點、線、多邊形超集,可包含全部類型

DL05    複合點          幾何對象由一個點或多個點組成

DL06    複合線或曲線    幾何對象由一條線或多條線組成

DL07    複合多邊形      幾何對象能夠包含多個外環、多個不相交的多邊形

DL08 - 99               Oracle Spatial 暫且保留

表1.1.2  Oracle Spatia1支持的幾何對象類型
② SDO_SRID

SDO_SRID也是一個NUMBER型的數值,它用於標識與幾何對象相關的空間座標系。若是SDO_SRID爲空(null),則表示沒有座標系與該幾何對象相關;若是該值不爲空,則該值必須爲MDSYS.CS_SRS表中SRID字段的一個值,在建立含有幾何對象的表時,這個值必須加入到描述空間數據表元數據的USER_SDO_GEOM_METADATA視圖的SRID字段中。對於咱們一般使用國際標準的Longitude/Latitude(8307),Oracle Spatial規定,一個幾何字段中的全部幾何對象都必須爲相同的SDO_SRID值。
③ SDO_POINT

SDO_POINT是一個包含三維座標X,Y,Z數值信息的對象,用於表示幾何類型爲點的幾何對象。若是SDO_ELEM_INFO和SDO_ORDINATES數組都爲空,則SDO_POINT中的X,Y,Z爲點對象的座標值,不然,sdo_Point的值將被忽略(用NULL表示)。Oracle Spatial強烈要求用SDO_POINT存儲空間實體爲點類型空間數據,這樣能夠極大的優化Oracle Spatial的存儲性能和查詢效率。

④ SDO_ELEM_INFO

SDO_ELEM_INFO是一個可變長度的數組,每3個數做爲一個元素單位,用於表示座標是如何存儲在SDO_ORDINATES數組中的。本文把組成一個元素的3個數稱爲3元組。一個3元組包含如下3部分的內容:

◇ SDO_STARTING_OFFSET SDO_STARTING_OFFSET 代表每一個幾何元素的第一個座標在SDO_ORDINATES數組中的存儲位置。它的值從1開始,逐漸增長。

◇ SDO_ETYPE SDO_ETYPE 用於表示幾何對象中每一個組成元素的幾何類型。當它的值爲1, 2, 1003和2003時,代表這個幾何元素爲簡單元素。若是SDO_ETYPE爲1003,代表該多邊形爲外環(第一個數爲1表示外環),座標值以逆時針存儲;若是SDO_ETYPE爲2003,代表該多邊形爲內環(第一個數爲2表示內環),座標值以順時針存儲。當SDO_ETYPE爲4, 1005和2005時,代表這個幾何元素爲複雜元素。它至少包含一個3元組用以說明該複雜元素具備多少個幾何簡單元素。一樣,1005表示多邊形爲外環,座標值以逆時針存儲;2005表示多邊形爲內環,座標值以順時針存儲。

SDO_INTERPRETATION SDO_INTERPRETATION具備兩層含義,具體的做用由SDO_ETYPE是否爲複雜元素決定。若是SDO_ETYPE是複雜元素(4, 1005和2005),則SDO_INTERPRETATION表示它後面有幾個子3元組屬於這個複雜元素。若是SDO_ETYPE是簡單元素(1, 2, 1003和2003),則SDO_INTERPRETATION表示該元素的座標值在SDO_ORDINATES中是如何排列的。 須要注意的是,對於複雜元素來講,組成它的子元素是連續的,一個子元素的最後一個點是下一個子元素的起點。最後一個子元素的最後一個座標要麼與下一個元素的SDO_STARTING_OFFSET值減1所對應的座標相同,要麼是整個SDO_ORDINATES數組的最後一個座標。SDO_ETYPE和SDO_INTERPRETATION之間的關係以下表:

SDO_ETYPE        SDO_INTERPRETATION           描述說明

0                任意值                       用於自定義類型,Oracle Spatial不支持

1                1                            點類型

1                n > 1                        具備n個點的點集合

2                1                            由直線段組成的線串

2                2                            由弧線段組成的線串,一個弧線段由起點、弧線上任意一點和終點組成,相鄰兩個弧線段的接點只須要存儲一次

1003 2003             1                            由直線段組成的多邊形,起點和終點必須相同

1003 2003             2                            由弧線段組成的多邊形,起點和終點必須相同。一個弧線段由起點、弧線上任意一點和終點組成,相鄰兩個弧線段的接點只須要存儲一次

1003 2003             3                            矩形:由左下角和右上角兩點肯定

1003 2003             4                            圓:由圓周上的三個點組成

4                n >1                         由直線段和弧線段組成的複合線,n表示複合線的相鄰子元素的個數,子元素的SDO_ETYPE必須爲2,一個子元素的最後一點是下一子元素的第一個點,而且該點不能重複

1005 2005             n >1                         由直線段和弧線段組成的複合多邊形,n表示複合線的相鄰子元素的個數,子元素的SDO_ETYPE必須爲2,一個子元素的最後一點是下一子元素的第一個點,而且該點不能重複。多邊形的起點和終點必須相同

表1.1.3 

SDO_ETYPE和SDO_INTERPRETATION 的組合關係

⑤ SDO_ORDINATES

SDO_ORDINATES是一個可變長度的數組,用於存儲幾何對象的實際座標,是一個最大長度爲1048576,類型爲Number的數組。

SDO_ORDINATES必須與sdo_Elem_Info數組配合使用,才具備實際意義。SDO_ORDINATES的座標存儲方式由幾何對象的維數決定,若是幾何對象爲二維,則SDO_ORDINATES的座標以{ x1, y1, x2, y2, …}順序排列,若是幾何對象爲三維,則SDO_ORDINATES的座標以{x1, y1, z1, x2, y2, z2, …}的順序排列。

實例說明 下面用實例來進一步說明SDO_GEOMETRY對象的使用方法。
① 一個帶洞的多邊形
• SDO_GTYPE = 2003,表示幾何對象是一個二維的多邊形。

• SDO_SRID = NULL,在二維狀況下不需設置線性參考值。

• SDO_POINT = NULL,表示幾何對象不是點類型。

• SDO_ELEM_INFO = (1,1003,1, 19,2003,1),有兩個三元組元素(1,1003,1) 和(19,2003,1),按照前後順序,在(1,1003,1)中,「1」表示該子元素的起點爲SDO_ORDINATES數組中的第1個值,「1003」表示該元素爲多邊形外環,「1」表示該多邊形由直線組成;在(19,2003,1)中,「19」表示該子元素的起點爲SDO_ORDINATES數組中的第15個值,「2003」表示該元素爲多邊形內環,「1」表示該多邊形由直線組成。

• SDO_ORDINATES = (2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5)。外環座標以逆時針排列,內環座標以順時針排列。

② 一個直線段與弧線段組成的複合線串

• SDO_GTYPE = 2002,表示幾何對象是一個二維的線串。

• SDO_SRID = NULL,在二維狀況下不需設置線性參考值。

• SDO_POINT = NULL,表示幾何對象不是點類型。

• SDO_ELEM_INFO = (1,4,2, 1,2,1, 3,2,2),有三個三元組元素(1,4,2)(1,2,1) 和(3,2,2),按照前後順序,(1,4,2)表示該線串爲複合線串,它由下面兩個三元組描述的子元素組成;在(1,2,1)中,「1」表示該子元素的起點爲SDO_ORDINATES數組中的第1個值,「2」表示該元素爲線,「1」表示這段線由直線組成;在(3,2,2)中,「3」表示該子元素的起點爲SDO_ORDINATES數組中的第3個值,「2」表示該元素爲線,「2」表示這段線由弧線段組成。

• SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10),座標(10,14)是直線段和弧線段的鏈接點,沒有重複存儲。
③ 一個直線段與弧線段組成的複合多邊形

• SDO_GTYPE = 2003,表示幾何對象是一個二維的多邊形。

• SDO_SRID = NULL,在二維狀況下不需設置線性參考值。

• SDO_POINT = NULL,表示幾何對象不是點類型。

• SDO_ELEM_INFO = (1,1005,2, 1,2,1, 5,2,2),有三個三元組元素(1,2005,2)(1,2,1) 和(5,2,2),按照前後順序,(1,2005,2)表示該多邊形爲複合多邊形,它由下面兩個三元組描述的子元素組成;在(1,2,1)中,「1」表示該子元素的起點爲SDO_ORDINATES數組中的第1個值,「2」表示該元素爲線,「1」表示這段線由直線組成;在(5,2,2)中,「5」表示該子元素的起點爲SDO_ORDINATES數組中的第5個值,「2」表示該元素爲線,「2」表示這段線由弧線段組成。

• SDO_ORDINATES = (6,10, 10,1, 14,10, 10,14, 6,10),座標(14,10)是直線段和弧線段的鏈接點,沒有重複存儲。     在Oracle Spatial中,能夠運用SQL語句進行幾何數據的各類操做,例如: 建立一個oralce數據庫名爲Data1:

Create Table Data1( mktID integer,//第幾號目標

Name char(20),                        //目標名稱

Shape SDO_GEOMETRY                     //目標的空間數據 );

把上例中的複合多邊形插入數據庫Data1:

Insert into Datal values( 1,                      //編號

‘複合多邊形’,                                   //名稱

MDSYS.SDO_GEOME1RY(2003,NULL,NULL,              //空間數據

MDSYS.SDO_ELEM _INFO_ARRAY( 1, 1005, 2, 1, 2, 1, 5, 2, 2 ),

MDSYS.SDO_ORDINATES_ARRAY(6,10, 10,1, 14,10, 10,14, 6,10) );

相關文章
相關標籤/搜索