天天看點

Oracle Spatial基本操作

Oracle Spatial基本操作

  Oracle Spatial主要通過中繼資料表、空間資料字段(即sdo_Geometry字段)和空間索引來管理空間資料,并在此基礎上提供一系列空間查詢和空間分析的程式包,讓使用者進行更深層次的GIS應用開發。Oracle Spatial使用空間字段sdo_Geometry存儲空間資料,用中繼資料表來管理具有sdo_Geometry字段的空間資料表,并采用R樹索引和四叉樹索引技術來提高空間查詢和空間分析的速度。 

  1、中繼資料表說明

  Oracle Spatial的中繼資料表存儲了有空間資料的資料表名稱、空間字段名稱、空間資料的坐标範圍、坐标系以及坐标維數說明等資訊。使用者必須通過中繼資料表才能知道Oracle資料庫中是否有Oracle Spatial的空間資料資訊。通過中繼資料視圖(USER_SDO_GEOM_METADATA)通路中繼資料表。中繼資料視圖的基本定義為:

       

Oracle Spatial基本操作

  2、空間字段解析

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

       

Oracle Spatial基本操作

   

  ① sdo_Gtype

  是一個NUMBER型的數值,用來定義存儲幾何對象的類型。sdo_Gtype是一個4個數字的整數,其格式為dltt,其中d表示幾何對象的維數;l表示三維線性參考系統中的線性參考值,當d為3維或者4維時需要設定該值,一般情況下為空;tt為幾何對象的類型,Oracle Spatial定義了7種類型的幾何類型,目前,tt使用了00到07,其中08到99是Oracle Spatial保留的數字,以備将來幾何對象擴充所用。

        

Oracle Spatial基本操作

   ② 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數組的最後一個坐标。

        

Oracle Spatial基本操作

  ⑤ 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, …}的順序排列。 

  3、空間索引技術:

  Oracle Spatial提供R樹索引和四叉樹索引兩種索引機制來提高空間查詢和空間分析的速度。使用者需要根據不同空間資料類型建立不同的索引,當空間資料類型比較複雜時,如果選擇索引類型不當,将使Oracle Spatial建立索引的過程變得非常慢。

三、将經緯度轉化成地名

  目前各類位置服務LBS最終傳回的都是誤差允許範圍内的經緯度,如GPS車載終端,手機定位等移動裝置,系統通過一定的技術算法可以将其轉化成具體的地名或附近的地标。或根據需要傳回目前位置使用者關心的周邊資訊:如醫院、飯店、加油站、公共汽車站等内容。

   1、空間資料到Oracle Spatial的導入

  目前專題空間資料庫建立的過程包括技術設計、資料準備、資料擷取和資料入庫等内容。資料的擷取常可利用現有的GIS 專業軟體如GeoStar、MAPGIS、SUPERMAP、ARCGIS 等來實作,獲得的資料通過某一空間資料引擎(如Easyloader)上載到Oracle 資料庫中,實作利用Oracle Spatial 存儲、管理空間資料。MAPORA 引擎是把MAPGIS 的明碼格式通過程式設計實作空間資料上載Oracle Spatial 的一種方法。

  2、定位服務的整個流程

        

Oracle Spatial基本操作

  3、Oracle Spatial關聯用到的程式包:

  ◆ sdo_Geom.Relate(sdo_Geometry1, ‘MASK’, sod_Geometry2, tolerance ):用于判斷一個幾何體與另一個幾何體的關系,我們用于判斷目前點是否在某一個面(省份面、縣市面、鄉鎮面)上。

  ◇ sdo_Geometry1,sdo_Geometry2為空間資料對應的幾何對象。

  ◇ Tolerance: 容許的精度範圍;

  ◇ MASK=Anyinteract/Contains/Coveredby/Covers/Disjoint/

    ○ Anyinteract: sdo_Geometry2落在sdo_Geometry1面上包括在邊上。

    ○ Contains: sdo_Geometry2完全包含在sdo_Geometry1幾何對象中,并且兩個幾何對象的邊沒有交叉。

    ○ Coveredby: sdo_Geometry1完全包含在sdo_Geometry2中,并且這兩個幾何對象的邊有一個或多個點互相重疊。

    ○ Covers: sdo_Geometry2完全包含在sdo_Geometry1中,并且這兩個幾何對象的邊有一個或多個點互相重疊。

    ○ Disjoint: 兩個幾何沒有重疊交叉點,也沒有共同的邊。

    ○ Equal: 兩個幾何是相等的。

    ○ Inside: sdo_Geometry1完全包含在sdo_Geometry2幾何對象中,并且兩個幾何對象的邊沒有交叉。

    ○ On: sdo_Geometry1的邊和内部的線完全在sdo_Geometry2上。

    ○ Overlapbdydisjoint: 兩個幾何對象交疊,但是邊沒有交叉。

    ○ Overlapbdyintersect: 兩個幾何對象交疊,并且邊有部分交叉。

    ○ Touch: 兩個幾何對象有共同的邊,但沒有交叉。

  ◆ sdo_nn( sdo_Geometry1, sdo_Geometry2, ‘sdo_num_res’, Tolerance ):用于傳回幾何體sdo_Geometry2周邊附近有什麼其他幾何體集。

  ◇ sdo_Geometry1,sdo_Geometry2為空間資料對應的幾何對象。

  ◇ Tolerance: 容許的精度範圍;

  ◇ sdo_num_res=n: 表示傳回n個幾何體,=1表示隻傳回一個。

  ◆ sdo_Geom.Within_Distance(sdo_Geometry1, Distance, sdo_Geometry2, Tolerance, 'unit' )用于判斷幾何體sdo_Geometry2在指定的距離Distance内周邊附近有什麼其他幾何體集。

  ◇ sdo_Geometry1,sdo_Geometry2為空間資料對應的幾何對象。

  ◇ Tolerance: 容許的精度範圍;

  ◇ Distance: 指定的距離;

  ◇ Unit: 用于表示距離的機關,可能是Unit=M/ Unit=KM等長度機關,但必須是SDO_DIST_UNITS表中列舉出來的機關之一。

  4、傳回的資訊:

  傳回的資訊根據業務需要可以傳回空間資訊關聯到的所有資訊,然後用三段論方式組合成一段話,通過SMS等方式傳回到移動終端。

  ◆ 可以是目前位置的地名、城市地标、自定義地标、道路名稱等位置資訊; 

  ◆ 可以是目前位置的周邊資訊:醫院、飯店、加油站、公共汽車站等;

查詢:SELECT c.geometry.SDO_GTYPE,c.geometry.SDO_ORDINATES,

c.geometry.SDO_ELEM_INFO,c.geometry.SDO_SRID,c.geometry.SDO_POINT.X,

c.geometry.SDO_POINT.Y,c.geometry.SDO_POINT.Z FROM xz_chengshi c