SDO_Geometry結構詳細說明


完全轉自:http://blog.sina.com.cn/s/blog_9d0a434f0102wnt4.html

前言

在ArcGIS中通過SDE存儲空間數據到Oracle中有多種存儲方式,分別有:二進制Long Raw 、ESRI的ST_Geometry以及基於Oracle Spatial的SDO_Geometry等等。 這里主要是學習關於基於Oracle Spatial的存儲方式,通過這種存儲方式幾何列Shape的字段類型為mdsys.sdo_geometry類型。

1  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); 

   其中sdo_geometry AS OBJECT ,標識該類型為對象類型。至於該類型中的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以及不同點之間都是逗號隔開; 

1.1 類型解釋

1.1.1 SDO_GTYPE  --標識幾何體類型

  SDO_GTYPE值是有四位數字組成的,有4位數字構成 dltt

Ø  d:表示幾何的維數。如二維、三維對應的d=2和d=3;

Ø  l:標識三維線狀參考系統(Linear referencing system,LRS)幾何體的LRS度量維,即哪一維含度量值(measure value),可能的取值為3、4,對於非LRS幾何體或者以ORACLE     SPATIAL默認的最后一維為LRS度量維,則l取值為0;

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

如下表1:

幾何體類型

描述

dl00

UNKNOW_GEOMETRY

Oracle Spatial忽略該幾何體數據

dl01

POINT

該幾何體為一個點

dl02

LINE or CURVE

該幾何體為一線串(線串中的段可以為直線段也可以為弧線斷

dl03

POLYGON

該幾何體為一多邊形,該多邊形可有洞也可沒有

dl04

COLLECTION

是元素的集合,其中的元素只要是非COLLECTION類型的即可

dl05

MULTIPOINT

含一個或多個點的幾何體

dl06

MULTILINE or MULTICURVE

含一個或多個線串的幾何體

dl07

MULTIPOLYGON

多個DISJOINT的多邊形

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

SDO_GTYPE

幾何類型

相關描述

2000

未知的地理類型

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

2001

單點Point類型

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

2002

單線Polyline和Curve類型

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

2003

Polygon類型

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

2004

集合COLLECTION類型

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

2005

多點MultiPoint類型

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

2006

多線MultiPolyline和多曲線類型

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

2007

多多邊形MultiPolygon類型

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

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

1.1.2 SDO_SRID    --標識坐標系統

SDO_SRID定義了空間坐標參考系統。如果SDO_SRID為null,則沒有指定坐標系統,如果SDO_SRID不為null,則該值必須來自於MDSYS.CS_SRS的SRID列,並且這樣的值必須插入到USER_SDO_GEOM_METADATA視圖的SRID列中,一圖層中,各幾何體的SRID值必須相同。MDSYS.CS_SRS 表參考

如下表3:

列名

類型

列名描述

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

 

1.1.3 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坐標值

1.1.4 SDO_ELEM_INFO   --坐標解釋方式

SDO_ELEM_INFO類型的構造方法為:sdo_elem_info_array(a,b,c),其中a,b,c為Number類型,其用途是該屬性給出了SDO_ORDINATES中坐標的解釋方式。SDO_ELEM_INFO數組中,每三個數值為一組,用於解釋一個元素(ELEMENT),組中的數值的意義為:

SDO_STARTING_OFFSET:第一個數值,存放該元素的首坐標在SDO_ORDIANTES中的位置(從1開始);

SDO_ETYPE:第二個數值,標識元素的類型;

SDO_INTERPRETATION:和以上兩個數據一起解釋元素;

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組成。下面介紹一下這三個數字的具體含義:

 (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。(具體參考下面的例子理解)

 (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 屬性單元,而是為了說明組合元素的信息。具體可以參見下面 復雜多義線 和 復雜多邊形 的例子。

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

SDO_STARTING_OFFSET和SDO_ETYPE 表  如下4:

SDO_ETYPE

SDO_INTERPRETATION

兩個組合值的具體含義

參見例子

0

任何數(n)

Oracle Spatial不支持的幾何類型

 

1

1

普通單點

 

1

n(>1)

多點

 

2

1

由直線組成的多義線(Polyline就是多義線之一)

 

2

2

由曲線片段組成的多義線。每一曲線由三個點來描述:起點,任意在曲線段組成的一點,終點,且前一個曲線終點是下一個曲線的起點

 

1003/2003

1

由系列直線組成的多邊形,務必寫出每個節點的坐標,而且最后一個點的坐標要和第一個點相同,構成封閉

1003表示外環,2003表示內環,以下同

有島的多邊形

1003/2003

2

由系列曲線構成的自封閉的多邊形,該多邊形的前一條弧段的終點和后一條弧段的起點重合

 

1003/2003

3

矩形,用左下和右上的兩個點進行描述,本類型不用於地理數據

矩形

1003/2003

4

圓(由圓上任意三個非共線的點坐標進行描述)

 

4

n(n>1)

由系列直線和系列曲線組成的復雜多義線。其中n值表示多義線總共由幾部分直線和曲線構成。此時SDO_ELEM_INFO包含的該三元組不是SDO_ELEM_INFO屬性單元,接下來SDO_ELEM_INFO有n個SDO_ELEM_INFO屬性單元用於表述成多義線各個部分

復雜多義線

1005/2005

n(n>1)

由系列直線和曲線組成的復雜多邊形,n表示這些子線串的個數,其他與上面雷同

復雜多邊形

 

1.1.5 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來理解。

1.1.6 參考例子

(1)      矩形

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

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

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

例子:矩形實例:

sdo_geometry (

                           2003,  -- 二維多邊形

                        NULL,

                        NULL,

                        SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一個矩形(1003為逆時針方向)

                        SDO_ORDINATE_ARRAY(1,1, 5,7) -- 只需要兩個點的坐標

                     )

             );

 

(2)      有島的多邊形

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

SDO_Geometry結構詳細說明

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

      例子:用SQL 命令更新一個有島的多邊形:

DECLARE

       geom sdo_geometry;

BEGIN

geom:=sdo_geometry (
                                 2003,
                                 null,
                                 null,
                                 SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),

---有兩個三元組SDO_ELEM_INFO屬性元素

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

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

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)  ---坐標系列

                     )
            );

execute immediate  'update zd_test set shape=:gm where objectid=227944' using geom;

END;                   ---zd_test為表名,shape為幾何對象

(3)      復雜多義線

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

SDO_Geometry結構詳細說明

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

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

例子:用SQL 命令更新一個復雜多義線:

DECLARE

      geom sdo_geometry;

BEGIN

      geom:=sdo_geometry(                   

                     2002,

                     NULL,

                     NULL,

                     sdo_elem_info_array(1,4,2, 1,2,1, 3,2,2),

---有三個三元組,其中后兩個是SDO_ELEM_INFO屬性元素三元組,前一個為表述組合。

---第一個三元組【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_ordinate_array(10,10, 10,14, 6,10, 14,10)

                   );                  

execute immediate  'update zd_test set shape=:gm where objectid=218950' using geom;

END;

SDO_Geometry結構詳細說明

 

 

 

 

 

1.2 SDO_GEOMETRY的sql語句實例

1.2.1 簡單點(單點)

Ø  單點

sdo_geometry(

2001,   ---2001代表單點

        null,

        sdo_point_type(63918.6936868593, 39300.6724619204, null),

----分別對應點X、Y、Z的值

         null,

         null

        );

1.2.2 簡單線(單部件連續的折線)

Ø  折線串(由多條直線段組成)

sdo_geometry

               (2002,  

                null,

                null,

                sdo_elem_info_array(1,2,1),

                sdo_ordinate_array(63918.6936868593, 39300.6724619204, 63918.7296493314, 39302.5029543953, 63918.7576130323, 39304.3335865351, 63918.777577428, 39306.1643233876)

                 );

Ø  單曲線

sdo_geometry

               (2002,

                null,

                null,

                sdo_elem_info_array(1,2,2),   ----2,2 代表由曲線片段組成的多義線,每一線段由三個點來描述:起點、任意在曲線段上的一點,終點,且前一個曲線終點是下一個曲線的起點

                sdo_ordinate_array(40602883.52196759, 3497165.8231581002, 40602944.9893748, 3497397.0575331002, 40602901.083979294, 3497657.5621717945)

                 );

SDO_Geometry結構詳細說明

Ø  

 

 

 

 

 

 

 

 

 

 

 

 

多部件線(1個或多個簡單線)

sdo_geometry

               (2006,     

                null,

                null,

                sdo_elem_info_array(1,2,1,9,2,1),--"9"代表第二條直線第一個點的坐標在坐標序列中的位置

                sdo_ordinate_array(

--第一條折線

63918.6936868593, 39300.6724619204, 63918.7296493314, 39302.5029543953, 63918.777577428, 39306.1643233876, 63918.7895421375, 39307.9951299983,

------第二條折線

63824.5720349896, 39287.4658036968, 63824.4568945635, 39285.8607059794, 63824.3337761012, 39284.2562004966, 63824.3191716341, 39284.0725430048  

);

SDO_Geometry結構詳細說明

 

 

 

注:這種方式地理對象在宗地里一般不使用;

1.2.3 多邊形

Ø  簡單多邊形

sdo_geometry( 2003,

         null,

         null,

         sdo_elem_info_array(1,1003,1),

         sdo_ordinate_array(58184.2949999999, 39390.5210000016, 58208.6500000013, 39291.8900000025, 58499.0099999998, 39310.700000003, 58482.4699999997, 39409.8360000011, 58184.2949999999, 39390.5210000016)

                 );  --注意首尾坐標相同

)
SDO_Geometry結構詳細說明

 

 

 

 

 

 

 

Ø  多邊形:環

sdo_geometry( 2003,

         null,

         null,

         sdo_elem_info_array(1,1003,1,15,2003,1),

-----第一個“1”代表外多邊形的第一個坐標在坐標數組中的位置,最后一個“1”代表該多邊形是由直線組 成的多邊形                                                 

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

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

sdo_ordinate_array(40604250.220275894,3498887.5979003981,40602839.3861084,3498132.30 29174954,40602696.877685592,3497070.6145019978,40603886.8234863,349 6137.183898896,40604549.488098189,3496557.5839232951,40604984.13909 9091,3497947.0416869968,40604250.220275894,3498887.5979003981,40604 214.5930786,3496977.9838866964,40603430.7963257,3496956.6077270955, 40603430.7963257,3497241.6246947944,40603417.9331055,3497762.590270 9961,40604307.223693892,3498210.6824950948,40604556.613525391,34974 83.8892821968,40604214.5930786,3496977.9838866964)          

);

SDO_Geometry結構詳細說明

 

 

 

 

 

 

  

 

 

 

 

 

 

 

Ø  多邊形多面即包含多個多邊形

sdo_geometry( 2007,   --多面或多邊形

        null,

        null,

        sdo_elem_info_array(1,1003,1,9,1003,1),

        ---sdo_elem_info_array(1,1003,1,15,1003,1,29,1003,1),-----由三個面組成的元素組合    

       sdo_ordinate_array(63918.6936868593, 39300.6724619204, 63918.7296493314,

39302.5029543953, 63918.7576130323, 39304.3335865351,63918.6936868593, 39300.6724619204, 63918.777577428 ,39306.1643233876, 63918.7895421375, 39307.9951299983, 63918.7935069322, 39309.8259714115, 63918.7894717364, 39311.6568126709,63918.777577428, 39306.1643233876)

                )SDO_Geometry結構詳細說明;

前言

在ArcGIS中通過SDE存儲空間數據到Oracle中有多種存儲方式,分別有:二進制Long Raw 、ESRI的ST_Geometry以及基於Oracle Spatial的SDO_Geometry等等。 這里主要是學習關於基於Oracle Spatial的存儲方式,通過這種存儲方式幾何列Shape的字段類型為mdsys.sdo_geometry類型。

1  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); 

   其中sdo_geometry AS OBJECT ,標識該類型為對象類型。至於該類型中的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以及不同點之間都是逗號隔開; 

1.1 類型解釋

1.1.1 SDO_GTYPE  --標識幾何體類型

  SDO_GTYPE值是有四位數字組成的,有4位數字構成 dltt

Ø  d:表示幾何的維數。如二維、三維對應的d=2和d=3;

Ø  l:標識三維線狀參考系統(Linear referencing system,LRS)幾何體的LRS度量維,即哪一維含度量值(measure value),可能的取值為3、4,對於非LRS幾何體或者以ORACLE     SPATIAL默認的最后一維為LRS度量維,則l取值為0;

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

如下表1:

幾何體類型

描述

dl00

UNKNOW_GEOMETRY

Oracle Spatial忽略該幾何體數據

dl01

POINT

該幾何體為一個點

dl02

LINE or CURVE

該幾何體為一線串(線串中的段可以為直線段也可以為弧線斷

dl03

POLYGON

該幾何體為一多邊形,該多邊形可有洞也可沒有

dl04

COLLECTION

是元素的集合,其中的元素只要是非COLLECTION類型的即可

dl05

MULTIPOINT

含一個或多個點的幾何體

dl06

MULTILINE or MULTICURVE

含一個或多個線串的幾何體

dl07

MULTIPOLYGON

多個DISJOINT的多邊形

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

SDO_GTYPE

幾何類型

相關描述

2000

未知的地理類型

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

2001

單點Point類型

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

2002

單線Polyline和Curve類型

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

2003

Polygon類型

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

2004

集合COLLECTION類型

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

2005

多點MultiPoint類型

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

2006

多線MultiPolyline和多曲線類型

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

2007

多多邊形MultiPolygon類型

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

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

1.1.2 SDO_SRID    --標識坐標系統

SDO_SRID定義了空間坐標參考系統。如果SDO_SRID為null,則沒有指定坐標系統,如果SDO_SRID不為null,則該值必須來自於MDSYS.CS_SRS的SRID列,並且這樣的值必須插入到USER_SDO_GEOM_METADATA視圖的SRID列中,一圖層中,各幾何體的SRID值必須相同。MDSYS.CS_SRS 表參考

如下表3:

列名

類型

列名描述

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

 

1.1.3 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坐標值

1.1.4 SDO_ELEM_INFO   --坐標解釋方式

SDO_ELEM_INFO類型的構造方法為:sdo_elem_info_array(a,b,c),其中a,b,c為Number類型,其用途是該屬性給出了SDO_ORDINATES中坐標的解釋方式。SDO_ELEM_INFO數組中,每三個數值為一組,用於解釋一個元素(ELEMENT),組中的數值的意義為:

SDO_STARTING_OFFSET:第一個數值,存放該元素的首坐標在SDO_ORDIANTES中的位置(從1開始);

SDO_ETYPE:第二個數值,標識元素的類型;

SDO_INTERPRETATION:和以上兩個數據一起解釋元素;

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組成。下面介紹一下這三個數字的具體含義:

 (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。(具體參考下面的例子理解)

 (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 屬性單元,而是為了說明組合元素的信息。具體可以參見下面 復雜多義線 和 復雜多邊形 的例子。

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

SDO_STARTING_OFFSET和SDO_ETYPE 表  如下4:

SDO_ETYPE

SDO_INTERPRETATION

兩個組合值的具體含義

參見例子

0

任何數(n)

Oracle Spatial不支持的幾何類型

 

1

1

普通單點

 

1

n(>1)

多點

 

2

1

由直線組成的多義線(Polyline就是多義線之一)

 

2

2

由曲線片段組成的多義線。每一曲線由三個點來描述:起點,任意在曲線段組成的一點,終點,且前一個曲線終點是下一個曲線的起點

 

1003/2003

1

由系列直線組成的多邊形,務必寫出每個節點的坐標,而且最后一個點的坐標要和第一個點相同,構成封閉

1003表示外環,2003表示內環,以下同

有島的多邊形

1003/2003

2

由系列曲線構成的自封閉的多邊形,該多邊形的前一條弧段的終點和后一條弧段的起點重合

 

1003/2003

3

矩形,用左下和右上的兩個點進行描述,本類型不用於地理數據

矩形

1003/2003

4

圓(由圓上任意三個非共線的點坐標進行描述)

 

4

n(n>1)

由系列直線和系列曲線組成的復雜多義線。其中n值表示多義線總共由幾部分直線和曲線構成。此時SDO_ELEM_INFO包含的該三元組不是SDO_ELEM_INFO屬性單元,接下來SDO_ELEM_INFO有n個SDO_ELEM_INFO屬性單元用於表述成多義線各個部分

復雜多義線

1005/2005

n(n>1)

由系列直線和曲線組成的復雜多邊形,n表示這些子線串的個數,其他與上面雷同

復雜多邊形

 

1.1.5 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來理解。

1.1.6 參考例子

(1)      矩形

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

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

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

例子:矩形實例:

sdo_geometry (

                           2003,  -- 二維多邊形

                        NULL,

                        NULL,

                        SDO_ELEM_INFO_ARRAY(1,1003,3), -- 一個矩形(1003為逆時針方向)

                        SDO_ORDINATE_ARRAY(1,1, 5,7) -- 只需要兩個點的坐標

                     )

             );

 

(2)      有島的多邊形

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

SDO_Geometry結構詳細說明

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

      例子:用SQL 命令更新一個有島的多邊形:

DECLARE

       geom sdo_geometry;

BEGIN

geom:=sdo_geometry (
                                 2003,
                                 null,
                                 null,
                                 SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1),

---有兩個三元組SDO_ELEM_INFO屬性元素

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

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

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)  ---坐標系列

                     )
            );

execute immediate  'update zd_test set shape=:gm where objectid=227944' using geom;

END;                   ---zd_test為表名,shape為幾何對象

(3)      復雜多義線

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

SDO_Geometry結構詳細說明

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

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

例子:用SQL 命令更新一個復雜多義線:

DECLARE

      geom sdo_geometry;

BEGIN

      geom:=sdo_geometry(                   

                     2002,

                     NULL,

                     NULL,

                     sdo_elem_info_array(1,4,2, 1,2,1, 3,2,2),

---有三個三元組,其中后兩個是SDO_ELEM_INFO屬性元素三元組,前一個為表述組合。

---第一個三元組【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_ordinate_array(10,10, 10,14, 6,10, 14,10)

                   );                  

execute immediate  'update zd_test set shape=:gm where objectid=218950' using geom;

END;

SDO_Geometry結構詳細說明

 

 

 

 

 

1.2 SDO_GEOMETRY的sql語句實例

1.2.1 簡單點(單點)

Ø  單點

sdo_geometry(

2001,   ---2001代表單點

        null,

        sdo_point_type(63918.6936868593, 39300.6724619204, null),

----分別對應點X、Y、Z的值

         null,

         null

        );

1.2.2 簡單線(單部件連續的折線)

Ø  折線串(由多條直線段組成)

sdo_geometry

               (2002,  

                null,

                null,

                sdo_elem_info_array(1,2,1),

                sdo_ordinate_array(63918.6936868593, 39300.6724619204, 63918.7296493314, 39302.5029543953, 63918.7576130323, 39304.3335865351, 63918.777577428, 39306.1643233876)

                 );

Ø  單曲線

sdo_geometry

               (2002,

                null,

                null,

                sdo_elem_info_array(1,2,2),   ----2,2 代表由曲線片段組成的多義線,每一線段由三個點來描述:起點、任意在曲線段上的一點,終點,且前一個曲線終點是下一個曲線的起點

                sdo_ordinate_array(40602883.52196759, 3497165.8231581002, 40602944.9893748, 3497397.0575331002, 40602901.083979294, 3497657.5621717945)

                 );

SDO_Geometry結構詳細說明

Ø  

 

 

 

 

 

 

 

 

 

 

 

 

多部件線(1個或多個簡單線)

sdo_geometry

               (2006,     

                null,

                null,

                sdo_elem_info_array(1,2,1,9,2,1),--"9"代表第二條直線第一個點的坐標在坐標序列中的位置

                sdo_ordinate_array(

--第一條折線

63918.6936868593, 39300.6724619204, 63918.7296493314, 39302.5029543953, 63918.777577428, 39306.1643233876, 63918.7895421375, 39307.9951299983,

------第二條折線

63824.5720349896, 39287.4658036968, 63824.4568945635, 39285.8607059794, 63824.3337761012, 39284.2562004966, 63824.3191716341, 39284.0725430048  

);

SDO_Geometry結構詳細說明

 

 

 

注:這種方式地理對象在宗地里一般不使用;

1.2.3 多邊形

Ø  簡單多邊形

sdo_geometry( 2003,

         null,

         null,

         sdo_elem_info_array(1,1003,1),

         sdo_ordinate_array(58184.2949999999, 39390.5210000016, 58208.6500000013, 39291.8900000025, 58499.0099999998, 39310.700000003, 58482.4699999997, 39409.8360000011, 58184.2949999999, 39390.5210000016)

                 );  --注意首尾坐標相同

)
SDO_Geometry結構詳細說明

 

 

 

 

 

 

 

Ø  多邊形:環

sdo_geometry( 2003,

         null,

         null,

         sdo_elem_info_array(1,1003,1,15,2003,1),

-----第一個“1”代表外多邊形的第一個坐標在坐標數組中的位置,最后一個“1”代表該多邊形是由直線組 成的多邊形                                                 

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

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

sdo_ordinate_array(40604250.220275894,3498887.5979003981,40602839.3861084,3498132.30 29174954,40602696.877685592,3497070.6145019978,40603886.8234863,349 6137.183898896,40604549.488098189,3496557.5839232951,40604984.13909 9091,3497947.0416869968,40604250.220275894,3498887.5979003981,40604 214.5930786,3496977.9838866964,40603430.7963257,3496956.6077270955, 40603430.7963257,3497241.6246947944,40603417.9331055,3497762.590270 9961,40604307.223693892,3498210.6824950948,40604556.613525391,34974 83.8892821968,40604214.5930786,3496977.9838866964)          

);

SDO_Geometry結構詳細說明

 

 

 

 

 

 

  

 

 

 

 

 

 

 

Ø  多邊形多面即包含多個多邊形

sdo_geometry( 2007,   --多面或多邊形

        null,

        null,

        sdo_elem_info_array(1,1003,1,9,1003,1),

        ---sdo_elem_info_array(1,1003,1,15,1003,1,29,1003,1),-----由三個面組成的元素組合    

       sdo_ordinate_array(63918.6936868593, 39300.6724619204, 63918.7296493314,

39302.5029543953, 63918.7576130323, 39304.3335865351,63918.6936868593, 39300.6724619204, 63918.777577428 ,39306.1643233876, 63918.7895421375, 39307.9951299983, 63918.7935069322, 39309.8259714115, 63918.7894717364, 39311.6568126709,63918.777577428, 39306.1643233876)

                )SDO_Geometry結構詳細說明;


免責聲明!

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



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