oracle的空間資料庫:

zhulch發表於2007-12-21

簡單研究一下,

收藏,

詳細內容看下面

[@more@]
1. 什麼是oracle的空間資料庫:

oracle的空間資料庫提供了一組關於如何儲存, 得到,修改和查詢空間資料集的SQL schema與函式.
空間資料由以下幾個方面組成:
1.MDSYS schema: 規定了所支援的地理資料型別的儲存,語法和語義
2.空間資料索引機制
3.提供了關於空間相交查詢, 空間聯合查詢和其它空間分析操作的運算子,函式和過程
4.提供函式和過程用於一般的工具性操作與效能操作
5.用於處理點,邊和麵的拓撲資料模型
6.用於表現網路的點線的網路資料模型
7.地理光柵: 一套機制可以讓使用者儲存,索引,查詢,分析和釋出地圖光柵資料,包換光柵圖,柵格資料和它們的後設資料

1.2 物件關係模型
Spatial支援物件關係模型來表現地理資料.這個模型用Oracle原生空間資料型別SDO_GEOMETRY來對應一個地理資料物件.一個Oracle表可以有一個或多個SDO_GEOMETRY欄位.物件關係模型用"SQL with Geometry Tpes"來實現the Open GIS ODBC/SQL規範所定義的地理空間資料方面的功能.
物件關係模型所能提供的好處在於:
1. 支援很多地理型別, 比如: 弧, 圓, 組合多邊型, 組合線段和最佳化矩形(這個偶現在還不知道是什麼意思)
2. 更容易的建立和維護索引, 以及更容易最佳化空間查詢的效能
3. 索引由Oracle資料庫維護
4. 地理資訊可以放在一個欄位內
5. 專門最佳化過的效能
1.3 Spatial資料介紹
Oracle Spatial被設計用於讓空間資料的管理更加容易, and more natural to users of location-enabled applications and geographic information system(GIS) applications(這段實在不知道要如何翻譯). 一旦空間資料被儲存在Oracle資料庫中, 它能很容易的被維護, 取得並建立與儲存在資料庫中的其它的資料建立關聯.
一個典型的空間資料的例子就是道路地圖. 一個道路地圖是一個二維的物件, 它包括了點,線和多邊形用以
表現城鎮,道路,公共邊界(比如國家或省市). 一個道路地圖是一種視覺化的方法表現的地理資訊, 城鎮,道路和公共邊
界這些存在地球表面的物件都被對映到一個二維的顯示器或紙上, 儲存下它們的相對位置與相對距離.
這些物件在地球的位置資料(比如說經緯度)就是空間資料. 當地圖呈現時, 這些空間資料被用於在二維的紙
上定位出物件的位置. GIS常常就是用於儲存,取回和呈現這些於地理相關(汗,這個....)的空間資料.

另一種可以被儲存在Spatial中的空間資料(相對於GISR的空間資料而言)是CAD與CAM的空間資料。它們工作在相對較小的資料範圍內,經常用於汽車設計或電路板的設計中。

這兩個系統的不同之處在於資料大小與資料的精度,而不是資料的複雜性。系統可以有相同數量的資料點。在一個地理維度上,本地的一個橋樑可能只有十幾個英寸而不會對道路建築的表示造成任何可見的問題,但對於一個引擎活塞的直徑來說,十幾個英寸的誤差就會造成引擎不能工作。

另一方面來說,資料的複雜度是與表現它的區域的大小無關的。例如,一個印刷電路板,它上面可能有上千個蝕刻物件,包容在這個面積上的資訊的複雜度可能要比一個道路藍圖還要高。

(一段廢話,不翻譯了,下面同)

1.4 幾何型別
一個幾何型別是由一個有順序的透過直線或曲線相連的向量序列組成。它的語義是透過它的型別來定義的。Spatial支援幾種原生的型別,幾何型別可以透過這些原生型別的組合而成。 原生型別包括:
二維型別:
1.點與點的集合
2.線段
3.N點組合的多邊型
4.曲線段(所有的曲線都是由圓弧組成)
5.弧型多邊型
6.組合多邊形
7.組合線段
8.圓
9.最佳化的矩形
二維點是由兩個座標來表示的(X,Y),經常是表示經緯度。線段是一個或多個點對定義的片段的組合。組合多邊形是由多個相連的線段形成的閉合環所區域。例如,一個點可以表示一個建築的地點,一個線段可以表示一條道路或飛行跑道,一個多邊形可以表示一個國家,城市,禁區或街區。
自交多邊形現在不支援,但自交的線段是支援的。如果一個線段自交,那它不能形成多邊形。一個自交的線段不包含任何區域。
Spatial也支援儲存和索引三維和四維地理型別,在這方面,三個或四個座標定義了一個向量。然而,空間函式(除了LRS函式和MBR相關函式)只在工作在二維空間中,並且所有的空間運算子(除了SDO_FILTER)也是不能在超過二維的空間索引上工作的。

1.5資料模型
Spatial資料模型是一個由元素,地理物件和層組合而成的層次結構。層由多個地理物件組成,而地理物件由多個元素組成。
1.5.1元素

一個元素是組成地理物件的基本模組。現在支援的空間元素型別是點,線段與多邊形。例如,元素可以模擬星座(點的集合),道路(線段集合)和國家邊界(多邊形集合)。每一個元素的座標被以X,Y對來儲存。一個多邊形的外部圓和內部圓被認為是兩個獨立的元素,但組合成一個複雜多邊形。
點資料由一個座標形成,線資料由兩個座標表示線段,多邊形座標是由一組有順序的的座標組成。
1.5.2 地理物件
一個地理物件是一個空間物件的描述,由多個有順序的元素組合而成。地理物件可以是單個元素,也可以是多個同構和異構元素組合而成。在一個組合多邊形中,例如小島的集合,是同構集合。一個異構集合是由不同型別的元素組合的,比如點與多邊形。
例如一個代表可建築用地的地理物件,它就可能表現為一個多邊形,中間有一個洞,代表水面或建築分割槽。
1.5.3 層
層是一個由相同屬性的地理物件的集合。例如一個GIS層可以包括地形資料,人口密度,道路與橋樑網路。對於單獨一個層來說,它所包括的地理物件和對應的空間索引在資料庫中表現為一個單獨的表。
1.5.4 座標系統
座標系統(也叫空間參考系統)定義為代表位置的座標和確立兩個座標集合之間的關係。它可以被解釋為一個座標的集合來表示現實空間的位置集合。
任何空間資料都與座標系統有關。一個座標系統可以是地理相關的(與地球上的座標系統相關)或非地理相關(比如笛卡爾座標系統,與地球上實際的座標無關)。如果一個座標系統是地理相關的,它會有一個預設的測量單位(比如米),但你能用Spatial自動進行與其它測量單位之的換算(比如公里)。
在Oracle Spatial release 8.1.6之前,地理物件(SDO_GEOMETRY)被儲存為一個座標的字串,而沒有與任何特定的座標系統相關。Spatial函式與操作子總是假定座標系統是來自於笛卡爾正交座標系,於是常常不能提供正確的以地球為基礎的經緯度座標。隨著8.1.6的釋出,Spatial提供了很多座標系統的支援,方便了在各個座標系統間自由的轉換。
Spatial資料支援的座標系統包括:
笛卡爾座標系: 如果地理物件沒的指定座標系統,預設的為笛卡爾座標系。
測地學座標系:也叫地理座標系,是一個角度座標系統,與球形極點座標緊密相關。
專案座標系:是一個平面笛卡爾座標系統,用於透過數學對映把地球表面的點對應到一個平面上。有各種數學對映方法,每種都有自己的目的。
本地座標系:是一個笛卡爾座標系,對應與非地理相關的座標系統,比如CAD製圖。
當對地理物件進行操作時,Spatial要麼使用笛卡爾要麼使用曲線計算模型(比如全程的空間座標系統)。
1.5.5 公差
公差是與空間資料的精度相關的。公差反映了可以表示同一物件的兩個測量點之間的距離。公差值是一個大於零的正值。這個值的單位與否決定於它是否與一個地理座標系統相關。
對一個地理資料而言,公差值為一個以米為單位的值。公差值不可能小於0.05(五毫米),當然在大多數場合它都大於這個值。如果你指定了小於這個的值,Spatial使用0.05作為實際的值儲存。
對一個非地理資料而言,公差值一個單位的數值而與實際的座標相關。例如,如果測量單位是公里,一個0.005的公差就表示0.005公里,2的公差就表示2公里。
在所有的實際用例中,更小的公差值代表了更精確的資料。
公差特別用在兩個方面:
1.定義層的地理後設資料
2.作為一個函式的輸入引數。
1.5.5.1 公差在層的地理後設資料中的使用
層的維度資訊中包含了公差資訊。xx_SDO_GEOM_METADATA檢視的DIMINFO欄位的每個維度中都包含一個SDO_TOLERANCE值,而且這個值在同一圖層中是一樣的。
如果一個函式接受一個可選的tolerance引數,並且這個引數為null或沒有指定,那麼圖層物件的SDO_TOLERANCE就會被使用。實際使用的例子如:cola_b與cola_d之間的距離為0.846049894。如果一個SDO_GEOM.SDO_DISTANCE函式在計算這兩個點之間的距離時,沒有指定公差的話,那麼它就依賴於點所在的層的SDO_TOLERANCE這個值了。例如
1.如果SDO_TOLERANCE值為0.005,那麼這個函式返回0.846049894.
2.如果SDO_TOLERANCE值為0.5,那麼這個函式返回0。返回0是因為函式會先在cola_b與cola_d這個兩個點的周圍各自建立一個0.5的圓,因為這兩個圓相交,所以這兩個點為0。


你有兩種方法為一個層選擇一個SDO_TOLERANCE:
1.在查詢兩個物件的距離時,合適的反映距離的精度的值。比如,兩個非地理物件在距離為0.8個單位時應當被認為兩個物件的話,那麼SDO_TOLERANCE應當小於0.05。
2.值應當能反映圖層中地理物件的測量精度。比如如果一個圖層中所有的地理物件都用整數作為單位並且0.8個單位距離的兩個地理物件視為同一個物件的話,那麼SDO_TOLERANCE為0.5是合適的。

對於非地理資料來說,一般使用第二個方法,使用最高精度的SDO_TOLERANCE。例如,如果一個地理物件使用整數單位,那麼合適的值應當0.5;因而,如果地理物件定義為使用4位小數(比如31.2587),那麼合適值為0.00005。

1.5.5.2 作為輸入引數
在很多Spatial函式都接受公差引數,以替代預設的圖層公差值。

1.6 查詢模型
Spatial使用兩層查詢模型來解決查詢與空間過濾的問題。模型使用兩個不同目的的操作來加快查詢過程。而輸出的結果是這兩個操作組合結果。
這兩個操作為primary與secondary操作
1.primary過濾操作:使用地理上近似的查詢操作來減小計算的複雜度。因為這個查詢是近似,所以它產生一個比較大的結果集,這個結果集是給secondary過濾操作使用 。
2.secondary過濾操作:在primary過濾出來的結果集上使用精確的計算來得到最後精度的空間過濾結果集。因為這個計算過程是很昂貴的,所以它只在primary過濾出來的結果集上計算。
Spatial使用空間索引來實現primary過濾。Spatial並不強求使用一定要使用primary與secondary過濾組合。在很多情況下,光一個primary過濾就足夠了。例如一個放大操作中,應用程式只要得到與一個矩形框相交的地理區域中的內容。這時,primary過濾就可以非常快的返回一個大集合,而應用程式可以使用減切路徑來只顯示出目標區域來。

1.7 Spatial資料索引
Spatial索引主要提供兩個功能:
1.找到在一個區域中的空間物件。
2.找到兩個空間物件的交集。

Oracle Spatial使用R-tree索引(對於Quadtree因為已經不鼓勵使用,所以對於它的部分也就不翻了)。
1.7.1 R-tree索引
空間R-tree索引最高能定位四維空間。一個R-tree索引近似的使用單個MBR來代表一個地理物件。它儲存在空間索引表(USER_SDO_INDEX_METADATA檢視中的SDO_INDEX_TABLE欄位所指的空間索引表,如果你去查詢那個欄位內容,只會看到一堆二進位制)。同時R-tree索引還維護一個sequence物件(USER_SDO_INDEX_METADATA表中的SDO_RTREE_SEQ_NAME欄位)。

1.7.2 R-tree的品質
實際上對R-tree索引的插入與刪除操作會影響R-tree的質量,從而影響查詢的效能。
R-tree是層次樹結構,在不同的分枝有不同的高度。它的效能大體依賴於查詢面積的分佈與樹結點的高度。LEVEL0(0層實際上是指葉結點了)包括了特定物件的MBR。而LEVEL1是包含所有葉結點的MBR。The original ratio of the area at the root(topmost level) to the area at level 0 can change over time basedon updateds to the table(不是很清楚是什麼意思,大約是根結點指向的面積與所有葉結點的面積和的比率是會根據對空間表的更新操所而變動的。所以如果這個索引退化,重建將是一個提高效能的好方法。
如果已經進行了大量插入,更新與刪除操作,而SDO_FILTER效能退化,那麼這方法的效能退化可以歸結為R-tree索引的質量退化。可以透過SDO_TUNE.QUALITY_DEGRADATION來對退化程度進行檢查,如果函式返回值大於2,那麼請考慮重建索引。如果R-tree索引退化不嚴重,那麼查詢效能的退化可以考慮是否是Oracle的快取啊,I/O啊之類的設定問題。
重建R-tree可以使用ALTER INDEX REBUILD語句。

1.8 Spatial關係與過濾器。
Spataial使用secondary過濾器來決定空間關係。空間關係決定於地理位置。最通用的空間關係是基於拓撲與距離的。
為了決定空間關係,Spatail有很多secondary過濾器:
1.SDO_RELATE操作指出拓撲關係。它實現了九個交疊模型在點,線與多邊形中間分類兩個空間物件的拓撲關係,每個物件都有包含,交疊與不包含三種。由點與線組成的邊界將內與外分開。一個線段的邊界是由它的兩個端點組成,如果它的端點交疊(汗,那麼不就是一個點),那麼它是一個沒有邊界的線段。一個多折線線段的邊界是由它的每個組成線段的端點組成。一個多邊形的邊界由描述它的線段組成。內部是指所有組成物件的點都在另一個物件內部,並不與邊界重合,而外部正好相反。
2.SDO_WITHIN_DISTANCE操作決定兩個空間物件是否在某個指定的距離中。
3.SDO_NN操作指出離某個空間物件最近的物件。
Spatial使用下列的名稱來表示空間物件的拓撲關係:
1.DISJOINT 邊界與內部都不相交
2.TOUCH 邊界相交,但內部不相交
3.OVERLAPBDYDISJOINT 一個物件的內部與另一個物件的邊界與內部相交,但邊界不相交。比如一條線的起點在多邊形的外面,但終點在多邊形的裡面。

4.OVERLAPBDYINTERSECT 兩個物件的邊界與內部都交疊
5.EQUAL 兩個物件有相同的邊界與內部
6.CONTAINS 一個物件的邊界與內部完全的包含在另一個物件的內部
7.COVERS 如果一個物件的內部被包含在另一個物件的內部或邊界,並且他們的邊界交疊
8.INSIDE 與CONTAINS相反,A INSIDE B表明B CONTAINS A
9.CONVEREDBY 與 CONVERS相反,A CONVEREDBY B表明B CONVERS A
10. ON 當一個物件的內部與邊界都在另一個物件的邊界上,例如,一個線段在多邊形的邊界上。
11.ANYINTERACT 兩個物件有任何以上的相交

SDO_WITHIN_DISTANCE運算子判斷兩個物件是否在一個指定的距離內。這個操作在B物件的周圍建立一個為指定距離的區域,然後看A是否與這個區域相交。
SDO_NN操作返回在一個物件周圍指定數目的最近物件。
1.9 空間操作,過程與函式
Spatial PL/SQL應用程式介面包含了多個操作和很多的過程與函式。
Spatial操作,比如SDO_FILTER與SDO_RELATE,因為其使用了空間索引,所以能提供比較好的效能。Spatial操作只能用在查詢語句的WHERE子句中。第一個引數都是空間物件的geometry欄位,第二個引數指定一個查詢視窗(?汗,看來先看過這個操作的說明再來翻比較好)。
Spatial過程與函式使用PL/SQL包來提供如SDO_GEOM, SDO_CS, SDO_LRS之類的功能。這些子程式不需要空間索引,也不能使用空間索引(汗)。這些子程式可以使用在WHERE子句中或任何子查詢中。作為引數的兩個地理物件都應當有相同的座標系統。
收下是使用這些操作,過程,函式時與效能有關的提示:
1.如果進行比較操作,並且如果有運算子能適合你的需要的話,請優先使用運算子。例如用SDO_RELATE替代SDO_GEOM.RELATE,使用SDO_WITHIN_DISTANCE代替SDO_GEOM.WITHIN_DISTANCE.
2.對於操作子,總是使用大寫的TRUE,例如='TRUE' , 而不要使用<>'FALSE'或='true'.
3.對於操作子,如果查詢視窗來自己表,那麼使用/*+ ORDERED */來最佳化效能。
1.10 空間聚合函式
ORACLE空間聚合函式作用於SQL查詢出來的地理物件。空間聚合函式返回一個SDO_GEOMETRY地理物件。例如,SELECT SDO_AGGR_MBR(SHAPE) FROM COLA_MARKETS返回能這個表裡所有地理物件的MBR。
而SELECT SDO_AGGR_UNION(SDOAGGRTYPE(C.SHAPE, 0.005)) FROM COLA_MARKETS C WHERE C.NAME所有能使用空間聚合地理型別都應當定義4位的SDO_GTYPE值。
1.10.1 SDOAGGRTYPE物件型別
很多空間聚合函式接受SDOAGGRTYPE型別作為引數。
create type sdoaggrtype as object (
geometry sdo_geometry,
tolerance number);
sdoaggrtype型別中的tolerance值一般是與geometry對應的sdo_tolerance值一樣的,除非有理由需要不同的值。
1.11 Geocoding
Geocoding是一種將表中的地址資料轉化為標準地址資料的過程。geocoding過程的結果是一個經緯對來定位輸入地址。
1.12 空間JAVA應用程式介面
Oracle Spatial提供一個JAVAapi,其中包括:
1.oracle.spatial.geometry:提供Spatial的sdo_geometry型別支援。
2.oracle.spatial.network: 提供Oracle Spatial網路資料模型支援。
3.oracle.spatial.topo:提供Oracle Spatial拓撲資料模型支援
4.oracle.spaital.util: 提供各種空間操作
1.13 MDDATA Schema
這章不知道在說什麼,不翻
1.14 效能與調優
很多因素可以影響Oracle Spatial應用程式的效能。比如使用最佳化提示來影響查詢計劃。
1.15 OGC
1.16 Spatial Release(Version)Number
本章及度無聊,教你如何看Spatial的版本號。SELECT SDO_version from dual;
1.17 Spatial應用的硬體要求
1.18 Spatial的錯誤資訊
Spatial錯誤資訊數在13000至13499之間。
1.19 Spatial的例子
Oracle Spatial是有例子的,在$ORACLE_HOME/MD/DEMOS/EXAMPLES下

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7318139/viewspace-995403/,如需轉載,請註明出處,否則將追究法律責任。

相關文章