轉:http://blog.csdn.net/jing_xin/article/details/4355642
由于最近弄一些空間數據,所以找了些oracle空間數據庫的一些知識.下面是匯總:
Oracle Spatial由一坨的對象數據類型,類型方法,操作子,函數與過程組合而成。一個地理對象作為一個SDO_GEOMETRY對象保存在表的一個字段里。空間索引則由普通的DDL和DML語句來建立與維護。
創(chuàng)建表: CREATE TABLE cola_markets
( mkt_id NUMBER PRIMARY KEY,
name VARCHAR2(32),
shape SDO_GEOMETRY
);
插入數據:
INSERT INTO cola_markets
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 );
創(chuàng)建空間索引:
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規(guī)范定義的一個對象,其原始的創(chuàng)建方式如下所示:
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表示三維線性參考系統(tǒng)中的線性參考值,當d為3維或者4維時需要設置該值,一般情況下為空;tt為幾何對象的類型,Oracle Spatial定義了7種類型的幾何類型,目前,tt使用了00到07,其中08到99是Oracle Spatial保留的數字,以備將來幾何對象擴展所用。下表描述了Oracle Spatia1支持的幾何對象類型。
數值 ??? 幾何類型 ??????? 描述
DL00??????????????????? 用于存放自定義類型的幾何對象
DL01??? 點????????????? 幾何對象包含一個點
DL02??? 直線或曲線????? 幾何對象由直線或曲線段組成
DL03??? 多邊形????????? 幾何對象包含一個多邊形,該多邊形可以含有洞
DL04??? 復合形狀集????? 點、線、多邊形超集,可包含所有類型
DL05??? 復合點????????? 幾何對象由一個點或多個點組成
DL06??? 復合線或曲線??? 幾何對象由一條線或多條線組成
DL07??? 復合多邊形????? 幾何對象可以包含多個外環(huán)、多個不相交的多邊形
DL08 - 99?????????????? Oracle Spatial 暫且保留
表1.1.2
? Oracle Spatia1支持的幾何對象類型
② SDO_SRID
SDO_SRID也是一個NUMBER型的數值,它用于標識與幾何對象相關的空間坐標系。如果SDO_SRID為空(null),則表示沒有坐標系與該幾何對象相關;如果該值不為空,則該值必須為MDSYS.CS_SRS表中SRID字段的一個值,在創(chuàng)建含有幾何對象的表時,這個值必須加入到描述空間數據表元數據的USER_SDO_GEOM_METADATA視圖的SRID字段中。對于我們通常使用國際標準的Longitude/Latitude(8307),Oracle Spatial規(guī)定,一個幾何字段中的所有幾何對象都必須為相同的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存儲空間實體為點類型空間數據,這樣可以極大的優(yōu)化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,表明該多邊形為外環(huán)(第一個數為1表示外環(huán)),坐標值以逆時針存儲;如果SDO_ETYPE為2003,表明該多邊形為內環(huán)(第一個數為2表示內環(huán)),坐標值以順時針存儲。當SDO_ETYPE為4, 1005和2005時,表明這個幾何元素為復雜元素。它至少包含一個3元組用以說明該復雜元素具有多少個幾何簡單元素。同樣,1005表示多邊形為外環(huán),坐標值以逆時針存儲;2005表示多邊形為內環(huán),坐標值以順時針存儲。
◇ SDO_INTERPRETATION SDO_INTERPRETATION 具有兩層含義,具體的作用由SDO_ETYPE是否為復雜元素決定。如果SDO_ETYPE是復雜元素(4, 1005和2005),則 SDO_INTERPRETATION 表示它后面有幾個子3元組屬于這個復雜元素。如果SDO_ETYPE是簡單元素(1, 2, 1003和2003),則 SDO_INTERPRETATION 表示該元素的坐標值在SDO_ORDINATES中是如何排列的。 需要注意的是,對于復雜元素來說,組成它的子元素是連續(xù)的,一個子元素的最后一個點是下一個子元素的起點。最后一個子元素的最后一個坐標要么與下一個元素的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”表示該元素為多邊形外環(huán),“1”表示該多邊形由直線組成;在(19,2003,1)中,“19”表示該子元素的起點為SDO_ORDINATES數組中的第15個值,“2003”表示該元素為多邊形內環(huán),“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)。外環(huán)坐標以逆時針排列,內環(huán)坐標以順時針排列。
② 一個直線段與弧線段組成的復合線串
??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語句進行幾何數據的各種操作,例如: 創(chuàng)建一個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) );
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
