轉(zhuǎn):http://blog.csdn.net/jing_xin/article/details/4355642
由于最近弄一些空間數(shù)據(jù),所以找了些oracle空間數(shù)據(jù)庫的一些知識.下面是匯總:
Oracle Spatial由一坨的對象數(shù)據(jù)類型,類型方法,操作子,函數(shù)與過程組合而成。一個(gè)地理對象作為一個(gè)SDO_GEOMETRY對象保存在表的一個(gè)字段里。空間索引則由普通的DDL和DML語句來建立與維護(hù)。
創(chuàng)建表: CREATE TABLE cola_markets
( mkt_id NUMBER PRIMARY KEY,
name VARCHAR2(32),
shape SDO_GEOMETRY
);
插入數(shù)據(jù):
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空間數(shù)據(jù)信息.
下面來說一下其中最關(guān)鍵的一些object:
?
(?SDO_GEOMETRY對象類型 在Spatial中,地理對象的描述是放在一個(gè)單獨(dú)的類型為SDO_GEOMETRY的字段中的。任何有這個(gè)字段的表,都至少要定義一個(gè)其它主鍵字段。
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);
當(dāng)然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;
因?yàn)镾DO_ORDINATE_ARRAY最大為1048576,所以SDO_GEOMETRY對象的頂點(diǎn)數(shù)量就依賴于它的維度,二維為524288,三維為349525,四維只有262144個(gè)頂點(diǎn)了。
注意:
對于一個(gè)給定的層(同一字段),所有的地理對象必須都是相同的維度,不能將二維與三維的數(shù)據(jù)放在一個(gè)層里。
如果你使用四位的SDO_ETYPE那么,你也要使用四位的SDO_GTYPE。
)
SDO_GEOMETRY Object Type
2.1 SDO_GTYPE? dltt ???
d:維數(shù) ???
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 ???
確認(rèn)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 ???
結(jié)論:存儲坐標(biāo)
2.4 SDO_ELEM_INFO ???
用來解釋存儲在SDO_ORDINATES屬性中的坐標(biāo)信息。 ???
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 ???
長數(shù)組,存放空間對象的坐標(biāo)
2.6 Usage Considerations ???
SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT 用來檢查幾何對象的一致性。
1.1 SDO_GEOMETRY字段詳解
Oracle Spatial的空間數(shù)據(jù)都存儲在空間字段sdo_Geometry中,理解sdo_Geometry是編寫Oracle Spatial程序的關(guān)鍵。sdo_Geometry是按照Open GIS規(guī)范定義的一個(gè)對象,其原始的創(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);
該對象由五個(gè)部分組成,各部分的意義如下表所示:
字段名 ? ? ? |
類型 ? ? ? |
描述 ? ? ? |
SDO_GTYPE ? ? ? |
NUMBER ? ? ? |
幾何對象的類型 ? ? ? |
SDO_SRID ? ? ? |
NUMBER ? ? ? |
幾何對象的坐標(biāo)系 ? ? ? |
SDO_POINT ? ? ? |
SDO_POINT_TYPE ? ? ? |
表示幾何類型為點(diǎn)的幾何對象 ? ? ? |
? ? SDO_ELEM_INFO ? ? ? ? ? |
? ? SDO_ELEM_INFO_ARRAY ? ? ? ? ? |
是一個(gè)可變長度的數(shù)組,每3個(gè)數(shù)作為一個(gè)元素單位,用于解釋坐標(biāo)是如何存儲在SDO_ORDINATES中的 ? ? ? |
? ? SDO_ORDINATES ? ? ? ? ? |
? ? SDO_ORDINATE_ARRAY ? ? ? ? ? |
是一個(gè)可變長度的數(shù)組,用于存儲幾何對象的真實(shí)坐標(biāo),該數(shù)組的類型為NUMBER型 ? ? ? |
?
表1.1.1? sdo_geometry 各組成部分的意義
① SDO_GTYPE
是一個(gè)NUMBER型的數(shù)值,用來定義存儲幾何對象的類型。SDO_GTYPE是一個(gè)4個(gè)數(shù)字的整數(shù),其格式為dltt,其中d表示幾何對象的維數(shù);l表示三維線性參考系統(tǒng)中的線性參考值,當(dāng)d為3維或者4維時(shí)需要設(shè)置該值,一般情況下為空;tt為幾何對象的類型,Oracle Spatial定義了7種類型的幾何類型,目前,tt使用了00到07,其中08到99是Oracle Spatial保留的數(shù)字,以備將來幾何對象擴(kuò)展所用。下表描述了Oracle Spatia1支持的幾何對象類型。
數(shù)值 ??? 幾何類型 ??????? 描述
DL00??????????????????? 用于存放自定義類型的幾何對象
DL01??? 點(diǎn)????????????? 幾何對象包含一個(gè)點(diǎn)
DL02??? 直線或曲線????? 幾何對象由直線或曲線段組成
DL03??? 多邊形????????? 幾何對象包含一個(gè)多邊形,該多邊形可以含有洞
DL04??? 復(fù)合形狀集????? 點(diǎn)、線、多邊形超集,可包含所有類型
DL05??? 復(fù)合點(diǎn)????????? 幾何對象由一個(gè)點(diǎn)或多個(gè)點(diǎn)組成
DL06??? 復(fù)合線或曲線??? 幾何對象由一條線或多條線組成
DL07??? 復(fù)合多邊形????? 幾何對象可以包含多個(gè)外環(huán)、多個(gè)不相交的多邊形
DL08 - 99?????????????? Oracle Spatial 暫且保留
表1.1.2
? Oracle Spatia1支持的幾何對象類型
② SDO_SRID
SDO_SRID也是一個(gè)NUMBER型的數(shù)值,它用于標(biāo)識與幾何對象相關(guān)的空間坐標(biāo)系。如果SDO_SRID為空(null),則表示沒有坐標(biāo)系與該幾何對象相關(guān);如果該值不為空,則該值必須為MDSYS.CS_SRS表中SRID字段的一個(gè)值,在創(chuàng)建含有幾何對象的表時(shí),這個(gè)值必須加入到描述空間數(shù)據(jù)表元數(shù)據(jù)的USER_SDO_GEOM_METADATA視圖的SRID字段中。對于我們通常使用國際標(biāo)準(zhǔn)的Longitude/Latitude(8307),Oracle Spatial規(guī)定,一個(gè)幾何字段中的所有幾何對象都必須為相同的SDO_SRID值。
③ SDO_POINT
SDO_POINT是一個(gè)包含三維坐標(biāo)X,Y,Z數(shù)值信息的對象,用于表示幾何類型為點(diǎn)的幾何對象。如果SDO_ELEM_INFO和SDO_ORDINATES數(shù)組都為空,則SDO_POINT中的X,Y,Z為點(diǎn)對象的坐標(biāo)值,否則,sdo_Point的值將被忽略(用NULL表示)。Oracle Spatial強(qiáng)烈要求用SDO_POINT存儲空間實(shí)體為點(diǎn)類型空間數(shù)據(jù),這樣可以極大的優(yōu)化Oracle Spatial的存儲性能和查詢效率。
④ SDO_ELEM_INFO
SDO_ELEM_INFO是一個(gè)可變長度的數(shù)組,每3個(gè)數(shù)作為一個(gè)元素單位,用于表示坐標(biāo)是如何存儲在SDO_ORDINATES數(shù)組中的。本文把組成一個(gè)元素的3個(gè)數(shù)稱為3元組。一個(gè)3元組包含以下3部分的內(nèi)容:
◇ SDO_STARTING_OFFSET SDO_STARTING_OFFSET 表明每個(gè)幾何元素的第一個(gè)坐標(biāo)在SDO_ORDINATES數(shù)組中的存儲位置。它的值從1開始,逐漸增加。
◇ SDO_ETYPE SDO_ETYPE 用于表示幾何對象中每個(gè)組成元素的幾何類型。當(dāng)它的值為1, 2, 1003和2003時(shí),表明這個(gè)幾何元素為簡單元素。如果SDO_ETYPE為1003,表明該多邊形為外環(huán)(第一個(gè)數(shù)為1表示外環(huán)),坐標(biāo)值以逆時(shí)針存儲;如果SDO_ETYPE為2003,表明該多邊形為內(nèi)環(huán)(第一個(gè)數(shù)為2表示內(nèi)環(huán)),坐標(biāo)值以順時(shí)針存儲。當(dāng)SDO_ETYPE為4, 1005和2005時(shí),表明這個(gè)幾何元素為復(fù)雜元素。它至少包含一個(gè)3元組用以說明該復(fù)雜元素具有多少個(gè)幾何簡單元素。同樣,1005表示多邊形為外環(huán),坐標(biāo)值以逆時(shí)針存儲;2005表示多邊形為內(nèi)環(huán),坐標(biāo)值以順時(shí)針存儲。
◇ SDO_INTERPRETATION SDO_INTERPRETATION 具有兩層含義,具體的作用由SDO_ETYPE是否為復(fù)雜元素決定。如果SDO_ETYPE是復(fù)雜元素(4, 1005和2005),則 SDO_INTERPRETATION 表示它后面有幾個(gè)子3元組屬于這個(gè)復(fù)雜元素。如果SDO_ETYPE是簡單元素(1, 2, 1003和2003),則 SDO_INTERPRETATION 表示該元素的坐標(biāo)值在SDO_ORDINATES中是如何排列的。 需要注意的是,對于復(fù)雜元素來說,組成它的子元素是連續(xù)的,一個(gè)子元素的最后一個(gè)點(diǎn)是下一個(gè)子元素的起點(diǎn)。最后一個(gè)子元素的最后一個(gè)坐標(biāo)要么與下一個(gè)元素的SDO_STARTING_OFFSET值減1所對應(yīng)的坐標(biāo)相同,要么是整個(gè)SDO_ORDINATES數(shù)組的最后一個(gè)坐標(biāo)。SDO_ETYPE和 SDO_INTERPRETATION 之間的關(guān)系如下表:
SDO_ETYPE ??????? SDO_INTERPRETATION ?????????? 描述說明
0??????????????? 任意值?????????????????????? 用于自定義類型,Oracle Spatial不支持
1??????????????? 1??????????????????????????? 點(diǎn)類型
1??????????????? n > 1??????????????????????? 具有n個(gè)點(diǎn)的點(diǎn)集合
2??????????????? 1??????????????????????????? 由直線段組成的線串
2??????????????? 2??????????????????????????? 由弧線段組成的線串,一個(gè)弧線段由起點(diǎn)、弧線上任意一點(diǎn)和終點(diǎn)組成,相鄰兩個(gè)弧線段的接點(diǎn)只需要存儲一次
1003 2003???????????? 1??????????????????????????? 由直線段組成的多邊形,起點(diǎn)和終點(diǎn)必須相同
1003 2003???????????? 2??????????????????????????? 由弧線段組成的多邊形,起點(diǎn)和終點(diǎn)必須相同。一個(gè)弧線段由起點(diǎn)、弧線上任意一點(diǎn)和終點(diǎn)組成,相鄰兩個(gè)弧線段的接點(diǎn)只需要存儲一次
1003 2003???????????? 3??????????????????????????? 矩形:由左下角和右上角兩點(diǎn)確定
1003 2003???????????? 4??????????????????????????? 圓:由圓周上的三個(gè)點(diǎn)組成
4??????????????? n >1???????????????????????? 由直線段和弧線段組成的復(fù)合線,n表示復(fù)合線的相鄰子元素的個(gè)數(shù),子元素的SDO_ETYPE必須為2,一個(gè)子元素的最后一點(diǎn)是下一子元素的第一個(gè)點(diǎn),并且該點(diǎn)不能重復(fù)
1005 2005???????????? n >1???????????????????????? 由直線段和弧線段組成的復(fù)合多邊形,n表示復(fù)合線的相鄰子元素的個(gè)數(shù),子元素的SDO_ETYPE必須為2,一個(gè)子元素的最后一點(diǎn)是下一子元素的第一個(gè)點(diǎn),并且該點(diǎn)不能重復(fù)。多邊形的起點(diǎn)和終點(diǎn)必須相同
表1.1.3 ?
SDO_ETYPE和 SDO_INTERPRETATION 的組合關(guān)系
⑤ SDO_ORDINATES
SDO_ORDINATES是一個(gè)可變長度的數(shù)組,用于存儲幾何對象的實(shí)際坐標(biāo),是一個(gè)最大長度為1048576,類型為Number的數(shù)組。
SDO_ORDINATES必須與sdo_Elem_Info數(shù)組配合使用,才具有實(shí)際意義。SDO_ORDINATES的坐標(biāo)存儲方式由幾何對象的維數(shù)決定,如果幾何對象為二維,則SDO_ORDINATES的坐標(biāo)以{ x1, y1, x2, y2, …}順序排列,如果幾何對象為三維,則SDO_ORDINATES的坐標(biāo)以{x1, y1, z1, x2, y2, z2, …}的順序排列。
實(shí)例說明
下面用實(shí)例來進(jìn)一步說明SDO_GEOMETRY對象的使用方法。
① 一個(gè)帶洞的多邊形
??SDO_GTYPE = 2003,表示幾何對象是一個(gè)二維的多邊形。
??SDO_SRID = NULL,在二維情況下不需設(shè)置線性參考值。
??SDO_POINT = NULL,表示幾何對象不是點(diǎn)類型。
??SDO_ELEM_INFO = (1,1003,1, 19,2003,1),有兩個(gè)三元組元素(1,1003,1) 和(19,2003,1),按照先后順序,在(1,1003,1)中,“1”表示該子元素的起點(diǎn)為SDO_ORDINATES數(shù)組中的第1個(gè)值,“1003”表示該元素為多邊形外環(huán),“1”表示該多邊形由直線組成;在(19,2003,1)中,“19”表示該子元素的起點(diǎn)為SDO_ORDINATES數(shù)組中的第15個(gè)值,“2003”表示該元素為多邊形內(nèi)環(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)坐標(biāo)以逆時(shí)針排列,內(nèi)環(huán)坐標(biāo)以順時(shí)針排列。
② 一個(gè)直線段與弧線段組成的復(fù)合線串
??SDO_GTYPE = 2002,表示幾何對象是一個(gè)二維的線串。
??SDO_SRID = NULL,在二維情況下不需設(shè)置線性參考值。
??SDO_POINT = NULL,表示幾何對象不是點(diǎn)類型。
??SDO_ELEM_INFO = (1,4,2, 1,2,1, 3,2,2),有三個(gè)三元組元素(1,4,2)(1,2,1) 和(3,2,2),按照先后順序,(1,4,2)表示該線串為復(fù)合線串,它由下面兩個(gè)三元組描述的子元素組成;在(1,2,1)中,“1”表示該子元素的起點(diǎn)為SDO_ORDINATES數(shù)組中的第1個(gè)值,“2”表示該元素為線,“1”表示這段線由直線組成;在(3,2,2)中,“3”表示該子元素的起點(diǎn)為SDO_ORDINATES數(shù)組中的第3個(gè)值,“2”表示該元素為線,“2”表示這段線由弧線段組成。
??SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10),坐標(biāo)(10,14)是直線段和弧線段的連接點(diǎn),沒有重復(fù)存儲。
③ 一個(gè)直線段與弧線段組成的復(fù)合多邊形
??SDO_GTYPE = 2003,表示幾何對象是一個(gè)二維的多邊形。
??SDO_SRID = NULL,在二維情況下不需設(shè)置線性參考值。
??SDO_POINT = NULL,表示幾何對象不是點(diǎn)類型。
??SDO_ELEM_INFO = (1,1005,2, 1,2,1, 5,2,2),有三個(gè)三元組元素(1,2005,2)(1,2,1) 和(5,2,2),按照先后順序,(1,2005,2)表示該多邊形為復(fù)合多邊形,它由下面兩個(gè)三元組描述的子元素組成;在(1,2,1)中,“1”表示該子元素的起點(diǎn)為SDO_ORDINATES數(shù)組中的第1個(gè)值,“2”表示該元素為線,“1”表示這段線由直線組成;在(5,2,2)中,“5”表示該子元素的起點(diǎn)為SDO_ORDINATES數(shù)組中的第5個(gè)值,“2”表示該元素為線,“2”表示這段線由弧線段組成。
??SDO_ORDINATES = (6,10, 10,1, 14,10, 10,14, 6,10),坐標(biāo)(14,10)是直線段和弧線段的連接點(diǎn),沒有重復(fù)存儲。 ??? 在Oracle Spatial中,可以運(yùn)用SQL語句進(jìn)行幾何數(shù)據(jù)的各種操作,例如: 創(chuàng)建一個(gè)oralce數(shù)據(jù)庫名為Data1:
Create Table Data1( mktID integer,//第幾號目標(biāo)
Name char(20),??????????????????????? //目標(biāo)名稱
Shape SDO_GEOMETRY???????????????????? //目標(biāo)的空間數(shù)據(jù) );
把上例中的復(fù)合多邊形插入數(shù)據(jù)庫Data1:
Insert into Datal values( 1,????????????????????? //編號
‘復(fù)合多邊形’,?????????????????????????????????? //名稱
MDSYS.SDO_GEOME1RY(2003,NULL,NULL,????????????? //空間數(shù)據(jù)
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) );
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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