Oracle Spatial中SDO_Geometry說明


Oracle Spatial中SDO_Geometry說明

    在ArcGIS中通過SDE存儲空間數據到Oracle中有多種存儲方式,分別有:二進制Long Raw 、ESRI的ST_Geometry以及基於Oracle Spatial的SDO_Geometry等等。

    關於這幾種方式的各自的優缺點不是主要的探討的方向,這些我們可以通過ArcGIS中的ArcGIS Server Help得到相關的幫助。這里主要是學習關於基於Oracle Spatial的存儲方式,通過這種存儲方式幾何列Shape的字段類型為mdsys.sde_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);

      其中sdo_geometry AS OBJECT ,標識該類型為對象類型。開始我們可以想想它為ArcObjects中的Geometry對象(本來要素的shape字段中的對象就是Geometry),而不要理解他是怎么樣組織的。至於該類型中的SDO_POINT_TYPE、SDO_ELEM_INFO_ARRAY、SDO_ORDINATE_ARRAY也是Oracle Spatial自定義的類型和 sdo_geometry是一樣的。

       現在對sdo_geometry 類型中的各個參數簡單的介紹:

        1、SDO_GTYPE :表示要存儲的幾何類型,如點線面。它是通過 NUMBER類型來表達的;

        2、SDO_SRID :幾何的空間參考坐標系,類型也為 NUMBER;

        3、SDO_POINT :如果幾何類型點類型的話,就是存儲點坐標,否則為空。oracle自定義的SDO_POINT_TYPE類型;

        4、SDO_ELEM_INFO :定義要如何理解SDO_ORDINATES中的坐標串的;

        5、SDO_ORDINATES :存儲實際坐標的,以X、Y以及不同點之間都是逗號隔開;

        下面將詳細介紹這些字段參數的含義

一、SDO_GTYPE

     SDO_GTYPE值是有四位數字組成的,它們的格式為:dltt 。

     其中,d 表示幾何的維數。如二維、三維對應的d=2和d=3;l 定義了LRS。一般l=0;

tt 定義了地理對象的類型。現在使用從00到07,如tt=01代表為單點;

   下面就是t=2的二維幾何類型,SDO_GTYPE參數值具體,如 圖1:

SDO_GTYPE

幾何類型

相關描述

2000

未知的地理類型

Spatial會無視這個類型的地理對象

2001

單點Point類型

地理對象包含一個普通的點

2002

單線Polyline和Curve類型

地理對象包含直線或片段segments

2003

Polygon類型

地理對象包含一個普通的多邊形,但不包含空島

2004

集合COLLECTION類型

地理包含不同類型元素集合

2005

多點MultiPoint類型

地理對象包含多個點的集合

2006

多線MutliPolyline和多曲線類型

地理對象有一或更多的線或曲線集合

2007

多多邊形MutliPolygon類型

一個地理對象包含島(多島)的多邊形和N個多邊形

 

 

 

 

 

 

 

 

 

 

 

 

 

    對於一個給定的層,所有的地理對象必須都是相同的維度,不能將二維與三維的數據放在一個層里。

二、SDO_SRID

     SDO_SRID定義了空間坐標參考系統。如果SDO_SRID為null,則沒有指定坐標系統,如果SDO_SRID不為null,那么它的值必須在在MDSYS.CS_SRS 表中的 SRID 列有對應的值,而且它的值必須插入USER_SDO_GEOM_METADATA視圖中。MDSYS.CS_SRS 表參考 圖2

MDSYS.CS_SRS表

列名

類型

列名描述

CS_NAME

VARCHAR2(68)

坐標系統名稱

SRID

NUMBER(38)

空間參考ID,為唯一值。1-999999為spatial使用的空間參考,1000000以后為用戶自定義

AUTH_SRID

NUMBER(38)

可選的SRID,是個外鍵。另一個坐標系統的SRID

AUTH_NAME

VARCHAR2(256)

 

WKTEXT

VARCHAR2(2046)

 

CS_BOUNDS

MDSYS.SDO_GEOMETRY

 

 

 

 

 

 

 

 

 

 

 

  

 

三、 SDO_POINT

 

    SDO_POINT類型的構造方法為:sdo_point_type(x,y,z),其中x,y,z類型為Double和Int都可

    SDO_POINT字段定義為含有X、Y、Z屬性的SDO_POINT_TYPE類型。如果幾何類型為點類型的話,SDO_ELEM_INFO 和SDO_ORDINATES對應的值都為Null,SDO_POINT不為空。其它情況下,SDO_POINT會被Spatial所忽略即設為Null。如果這個層只有點對象,那么推薦你將其保存在SDO_POINT屬性中。 SDO_POINT_TYPE類型的定義如下:

            CREATE TYPE sdo_point_type AS OBJECT (
                                 X    NUMBER, //X坐標值
                                 Y    NUMBER, //y坐標值
                                 Z    NUMBER); //z坐標值

四、SDO_ELEM_INFO

     SDO_ELEM_INFO類型的構造方法為:sdo_elem_info_array(a,b.c),其中a,b.c為Number類型。

     SDO_ELEM_INFO是理解和掌握SDO_Geometry的重點和難點,SDO_ELEM_INFO 定義了如何理解SDO_ORDINATES中的坐標字符串屬性。

     SDO_ELEM_INFO每三個數字組合為一個SDO_ELEM_INFO屬性單元(具體可以結合下面的例子理解)。

     每個SDO_ELEM_INFO屬性單元由:SDO_STARTING_OFFSET、SDO_ETYPE 和SDO_INTERPRETATION 組成。下面介紹一下這三個數字的具體含義:

    4.1、SDO_STARTING_OFFSET:聲明了組成當前幾何片段的第一個坐標在SDO_ORDINATES數組中的坐標序號。坐標序號是從1開始起算的而非從0開始。這里的SDO_ORDINATES就是sdo_geometry 中的坐標序列,坐標序列是已逗號隔開的數字,具體的計算如:sdo_ordinate_array(1,4,6,7,8,9)中如果以'6'開始幾何片段的話,坐標序號SDO_STARTING_OFFSET=3。(具體參考下面的例子理解)

    4.2、SDO_ETYPE :聲明元素的類型。可結合 SDO_STARTING_OFFSET和SDO_ETYPE 表來理解.

    SDO_ETYPE 值 = 1, 2, 1003,或2003,說明幾何為簡單的幾何類型。可以全部按SDO_ELEM_INFO 屬性單元【即三個以逗號隔開的數】來理解sdo_ordinate_array中的坐標序列。

    特別說明:SDO_ETYPE 值 = 1003 ,假如幾何類型為面,則表示為外多邊形環(以逆時針順序)

    SDO_ETYPE 值 = 2003 ,假如幾何類型為面,則表示為內多邊形環(以順時針順序)

    SDO_ETYPE 值 = 4,1005或2005,說明幾何為組合元素,往往第一個三數字組不是SDO_ELEM_INFO 屬性單元,而是為了說明組合元素的信息。具體可以參見下面 復雜多義線 和 復雜多邊形 的例子。

    4.3、SDO_INTERPRETATION:有兩種可能的意思,依賴地SDO_ETYPE是否是組合元素。如果SDO_ETYPE 值 = 4,1005或2005,標識的是有多少組合部分,具體參考 復雜多義線 和 復雜多邊形 的例子。如果SDO_ETYPE 值 = 1, 2, 1003,或2003,標識決定了元素坐標隊列的翻譯順序。

          SDO_STARTING_OFFSET和SDO_ETYPE 表  如下圖3:

         

五、SDO_ORDINATES

    SDO_ORDINATES類型的構造方法為:sdo_ordinate_array(x1,y1,x2,y2,……),其中x1,y1類型等為Double和Int都可。

    SDO_ORDINATES存儲的是空間對象的幾何節點坐標序列,用逗號將X、Y、Z以及不同點之間隔開,該字段性質:長度=1048576的數字Number類型。如果幾何為二維的情況,存儲的序列為{Y1, X2, Y2, X3, Y3, X4, Y4......}格式;幾何為三維坐標的話,如三維坐標的多邊形它的存儲的序列為{X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4, X1, Y1, Z1}格式。坐標序列中的數據必須都合法且不為空。具體坐標的組合成幾何的結合SDO_ELEM_INFO來理解。

          

六、參考例子

6.1、矩形:

     矩形的具體幾何形狀和坐標,如下圖:

           

    用SDO_GEOMETRY定義該矩形,如何確定sdo_geometry()構造方法中的各個參數值。詳細解釋如下:

    SDO_GTYPE = 2003;2003中的2表示二維數據,2003中的3表示表示多邊形。具體參考 圖1

     SDO_SRID = NULL;

     SDO_POINT = NULL;

     SDO_ELEM_INFO = (1, 1003, 3).;在屬性單元SDO_ELEM_INFO (1,1003,3)中的最后一個3表示該幾何為矩形,具體參考圖4。

       ---因為它是矩形且為二維所以它的構造方法為:sdo_point_type(左下坐標,右上坐標)。

    SDO_ORDINATES = (1,1, 5,7). 定義了具體的左下坐標和右上坐標的坐標序列。

     例子:用SQL 命令插入一個矩形:

           INSERT INTO beniy388 VALUES(
                      1,          //其他的屬性字段的值
                      'UpDooGIS',    //其他的屬性字段的值
                      MDSYS.SDO_GEOMETRY( //幾何字段SDO_GEOMETRY的值
                                  2003, -- 二維多邊形
                                  NULL,
                                  NULL,
                                  MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一個矩形(1003為逆時針方向)
                                  MDSYS.SDO_ORDINATE_ARRAY(1,1, 5,7) -- 只需要兩點

                     )
             );

6.2、有島多邊形:

      有島多邊形的具體幾何形狀和坐標,如下圖:

       
  

    用SDO_GEOMETRY定義該多邊形,如何確定sdo_geometry()構造方法中的各個參數值。詳細解釋如下: 

    SDO_GTYPE = 2003;---2003中的2表示二維數據,2003中的3表示表示多邊形。具體參考 圖1

     SDO_SRID = NULL;

     SDO_POINT = NULL;

     SDO_ELEM_INFO = (1,1003,1, 19,2003,1); ---有兩個三元組SDO_ELEM_INFO屬性元素。具體參考 圖4

       ---其中1003表明對應的坐標序列組成的幾何A為外多邊形環(順時針);而2003表明對應的坐標序列組成的幾何B為內多邊形環(逆時針)。

       ---19 表示幾何B坐標序列開始的位置,也就是說從19開始的幾何坐標組成幾何B,而1到18組成幾何A。

    SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10);---坐標系列       

      例子:用SQL 命令插入一個有島的多邊形:

            INSERT INTO beniy388 VALUES
                      10,                   //其他的屬性字段的值
                     'UpDooGIS',       //其他的屬性字段的值
                      MDSYS.SDO_GEOMETRY( //幾何字段SDO_GEOMETRY的值
                                 2003,
                                 NULL,
                                 NULL,
                                 MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- 有島多邊形
                                 MDSYS.SDO_ORDINATE_ARRAY(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)
                     )
            );

6.3、復雜多義線      

    下圖描述的是一個由一條直線和一條曲線構成的復雜多義線。圖中出現了4個點,(10,10)和(10,14)點表示的是直線;(10,14), (10,6), 和 (14,10) 描述的是圓弧曲線:

    
    用SDO_GEOMETRY定義該復雜多義線,如何確定sdo_geometry()構造方法中的各個參數值。詳細解釋如下:

    SDO_GTYPE = 2002;2002中的2表示二維數據,第二個2表示表示一條或多條直線段。具體參考 圖1。

     SDO_SRID = NULL;

     SDO_POINT = NULL;

     SDO_ELEM_INFO = (1,4,2, 1,2,1, 3,2,2). ---有三個三元組,其中后兩個是SDO_ELEM_INFO屬性元素三元組,前一個為表述組合。具體參考 圖4。

          ---第一個三元組【1,4,2】,根據4可以得到是個描述三元組,2表示有兩個幾何元素組成,即后兩個三元組描述各自的幾何A和幾何B。

          ---第二個三元組【1,2,1】,為SDO_ELEM_INFO屬性元素三元組,它描述的是幾何A。根據 圖4可以得到它是一條直線段,且該直線段的最后一個節點還是下一個幾何B的開始點,即幾何A和幾何B有幾何節點重合。

          ---第二個三元組【3,2,2】,為SDO_ELEM_INFO屬性元素三元組,它描述的是幾何B。根據 圖4可以得到它是一條曲線段,該幾何B的起點和幾何A終點節點重合。

          SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10);---坐標系列

          例子:用SQL 命令插入一個復雜多義線:

          INSERT INTO beniy388 VALUES(
                      11,                   //其他的屬性字段的值
                     'UpDooGIS',       //其他的屬性字段的值
                      MDSYS.SDO_GEOMETRY( //幾何字段SDO_GEOMETRY的值
                                 2002,
                                 NULL,
                                 NULL,
                                 MDSYS.SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), -- 復雜多義線
                                 MDSYS.SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10)
                     )
        );

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM