1. 程式人生 > >Oracle Spatial 空間分析之緩衝區分析

Oracle Spatial 空間分析之緩衝區分析

緩衝區分析需要主要使用Oracle Spatial 空間分析操作函式,下面會對其各個引數進行詳細講解,資料有來源於網上與書上。

SDO_GEOM.SDO_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表中列舉出來的單位之一。

另一種是 SDO_WITHIN_DISTANCE(SDO_GTYPE,sdo_Geometry,Distance);

其中 SDO_GTYPE   NUMBER  表示要儲存的幾何型別,如點線面。它是通過 NUMBER型別來表達的;

sdo_Geometry 表示查詢的緩衝區,下面後詳細說明如何構建

Distance表示緩衝區範圍大小

例子:SD0_WITHIN_DISTANCE(2002,MDSYS.SDO_GEOMETRY(2002,null,null,MDSYS.SDO_ELEM_INFO_ARRY(1,2,1),MDSYS.SDO_ORDINATE_ARRAY(100,100,200,200)),'DISTANCE'='500')='TRUE'

一.緩衝幾何體構建使用 

空間資料在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_SRID

           SDO_SRID定義了空間座標參考系統。如果SDO_SRID為null,則沒有指定座標系統,如果SDO_SRID不為null,那麼它的值必須在在MDSYS.CS_SRS 表中的 SRID 列有對應的值,而且它的值必須插入USER_SDO_GEOM_METADATA檢視中。MDSYS.CS_SRS 表參考 圖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座標值

          四、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_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)
                     )
        );


相關推薦

Oracle Spatial 空間分析緩衝區分析

緩衝區分析需要主要使用Oracle Spatial 空間分析操作函式,下面會對其各個引數進行詳細講解,資料有來源於網上與書上。 SDO_GEOM.SDO_WITHIN_DISTANCE(sd

ArcGIS Engine空間分析緩衝區分析的實現

緩衝分析(BufferAnalysis)的結果是一個面狀要素——即緩衝要素,點狀要素、線狀要素和麵狀要素,被緩衝分析功能處理過之後,它們的周圍產生一個緩衝區域,該區域即新產生的面狀要素。 在緩衝方向上,點狀要素和線狀要素只能進行向外緩衝,面狀要素可以雙向緩衝——向外緩衝和向內緩衝。 在ArcGIS Engi

Oracle spatial空間查詢的選擇度分析

left info ext 字符串類型 計算模型 rom 經緯度 排序 try 在上一篇中,我用一個案例演示了對於數值或字符串類型的字段,選擇度的計算方法。並證明了當字段值的選擇度不同時,將會影響CBO選擇最終的執行計劃。對於可排序的字段類型,選擇度計算模型已經有很多人寫博

空間分析距離分析

繼續總結下距離分析。如下是ArcGIS 10.x中,距離分析相關的工具: ArcGIS中,主要可以通過如下的幾種方式進行距離分析: 1) 歐氏距離分析 2) 成本加權距離分析 3) 用於垂直移

編譯原理(六)自底向上分析LR分析

markdown lr分析 編譯原理 lock mar blog pre 分析法 logs 自底向上分析之LR分析法 說明:以老師PPT為標準,借鑒部分教材內容,AlvinZH學習筆記。 本節內容太多了,考完再寫了,對不起~ 引用說明 - 邵老師課堂PDF - 《編譯原

Java並發系列[1]----AbstractQueuedSynchronizer源碼分析概要分析

人的 等等 子類 運行 pos unsafe fse oid 出了 學習Java並發編程不得不去了解一下java.util.concurrent這個包,這個包下面有許多我們經常用到的並發工具類,例如:ReentrantLock, CountDownLatch, Cyclic

Android編譯系統分析make分析

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top Android 編譯系統解析系列文件 解析lunch的執行過程以及make執行過程中include檔案的順序 Android編譯系統分析之lunch分析 Android

Android 編譯系統分析lunch分析

已開通新的部落格,後續文字都會發到新部落格 http://www.0xfree.top 目錄 Android 編譯系統分析之lunch分析 envsetup.sh指令碼 定義函式 新增編譯引數

【搞定Java併發程式設計】第15篇:佇列同步器AQS原始碼分析概要分析

AQS系列文章: 1、佇列同步器AQS原始碼分析之概要分析 2、佇列同步器AQS原始碼分析之獨佔模式 3、佇列同步器AQS原始碼分析之共享模式 4、佇列同步器AQS原始碼分析之Condition介面、等待佇列 先推薦兩篇不錯的博文: 1、一行一行原始碼分析清楚Abstract

Java併發系列 | AbstractQueuedSynchronizer原始碼分析概要分析

學習Java併發程式設計不得不去了解一下java.util.concurrent這個包,這個包下面有許多我們經常用到的併發工具類,例如:ReentrantLock, CountDownLatch, CyclicBarrier, Semaphore等。而這些類的底層實現都依賴於AbstractQueu

顛覆大資料分析實時分析的應用

顛覆大資料分析之實時分析的應用 譯者:吳京潤    購書 在這一節,我們將看到構建兩個應用的步驟:一個工業日誌分類系統和一個網際網路流量過濾應用。 工業日誌分類 隨新舊生產工程系統的自動化以及電子工程的發展,大量的機器之間(M2M)的資料正在被生成出來。機器之間的資料可以來自多個不同的源頭,包

MapReduce原始碼分析InputSplit分析

前言 MapReduce的原始碼分析是基於Hadoop1.2.1基礎上進行的程式碼分析。 什麼是InputSplit        InputSplit是指分片,在MapReduce當中作業中,作為map task最小輸入單位。分片是基於檔案基礎上出來的而來的概念,通俗的理

【編譯原理】自下而上的語法分析LR分析

LR分析器是一種由下而上(bottom-up)的上下文無關語法分析器。LR意指由左(Left)至右處理輸入字串,並以最右邊優先派生(Right derivation)的推導順序(相對於LL分析器)建構語法樹。能以此方式分析的語法稱為LR語法。而在LR(k)這樣的名稱中,

語義分析情感分析

紙上得來終覺淺,一直苦於沒有小專案來看看鍛鍊下自己,相信很多初學程式設計的同學也一樣,那就是不知道自己到底學的怎麼樣,而且也覺得沒有一個實際的專案來幫助提高自己的實際動手能力,理論總是美好的,在實際的專案中會碰到這樣那樣的小問題,而且每一個問題都不是書上全部講到的,就比如我將

Linux cgroup機制分析框架分析

八:cgroup中檔案的操作 接下來,就來看cgroup檔案的操作.在上面曾分析到:檔案對應的操作集為cgroup_file_operations.如下所示: static struct file_operations cgroup_file_operations = {     .read = c

MapReduce原始碼分析MapTask分析(二)

SpillThread分析 為什麼需要Spill          記憶體大小總是有效,因此在Mapper在處理過程中,資料持續輸出到記憶體中時,必然需要有機制能將記憶體中的資料換出,合理的刷出到磁碟上。SpillThread就是用來完成這部分工作。          Sp

效能分析IO分析-jbd2引起的IO高

 背景:請事假在外中,聽平臺組同事反饋了一個問題,在往生產資料庫中匯入部分資料時會造成客戶端的訪問超時,初步定位是因為伺服器磁碟佔用IO過高,導資料時IO會飆升到100%,因此引起了不少資料庫的慢查詢操作導致客戶端響應超時,無奈只好暫時停止了匯入資料的指令碼,同時也延誤了針對

LDD3原始碼分析poll分析

作者:劉昊昱 編譯環境:Ubuntu 10.10 核心版本:2.6.32-38-generic-pae LDD3原始碼路徑:examples/scull/pipe.c  examples/scull/main.c 本文分析LDD3第6章的poll(輪詢)操作。要理解驅動程式中poll函式的作用和實現,

5.dubbo原始碼分析 SPI分析

如果大家看過之前的 dubbo 核心 SPI 實現 – 2.dubbo原始碼分析 之 核心SPI實現, 有可能還是一頭霧水,下面我講一下dubbo的具體應用。最典型的應用就是 Protocol 介面。 Protocol 屬於 dubbo 十層結構 中的遠端呼叫

影象分析直方圖分析

  - created by gloomyfish 影象分析之強度直方圖分析 直方圖介紹 強度直方圖圖形化顯示不同的畫素值在不同的強度值上的出現頻率,對於灰度影象來說強度 範圍為[0~255]之間,對於RGB的彩色影象可以獨立顯示三種顏色的強度直方圖。強度直方