Oracle 空間查詢, 資料類型為 sdo_geometry

來源:互聯網
上載者:User

標籤:end   body   返回   pack   資料   create   method   語句   in out   

因網上搜尋到的相關資料大部分都是關於sdo_geometry的介紹和以及通過sql語句添加要素,查詢要素等等。沒有找到預存程序相關的例子,所以只好自己動手啦。 

準備

環境:windowsxp系統,安裝Arcgis 10.1,oracle11g32位,plsql。

資料:通過arcgis直連資料庫,匯入測試資料,匯入時資料類型選擇SDO_GEOMETRY。

測試資料包含點線面,點資料MAP_USER_POINT, 線資料MAP_USER_LINE,面資料MAP_USER_POLY。在arcmap中顯示如下:

 

 

 

建立預存程序 添加幾何要素建立函數  建立 幾何要素

create or replace FUNCTION FUN_CreateGeometry

( wkt IN VARCHAR2

  ,srid IN NUMBER

) RETURN sdo_geometry AS

BEGIN

  RETURN SDO_GEOMETRY(wkt,srid);

END FUN_CreateGeometry;

 

建立預存程序 向向量表插入要素

create or replace

PROCEDURE AddNEWPOINT(

  OBJECTID IN NUMBER

  WKT IN VARCHAR2

  ,SRID IN NUMBER

) AS

 v_Return SDO_GEOMETRY;

BEGIN

  v_Return := FUN_CREATEGEOMETRY(

    WKT => WKT,

    SRID => SRID

  );

 

  INSERT INTO MAP_USER_8332(OBJECTID, SHAPE)

  VALUES

    (OBJECTID, v_Return);

END AddNEWPOINT;

 

調用預存程序建立幾何,注意srid必須一致

 

Oracle SQL Developter中調用:

DECLARE

  OBJECTID NUMBER;

  WKT VARCHAR2(200);

  SRID NUMBER;

BEGIN

  OBJECTID := 100;

  WKT := ‘POINT (118.731963311458 32.0661417793197) ‘;

  SRID := 4326;

 

  ADDNEWPOINT(OBJECTID, WKT, SRID);

END;

Sql plus中調用:

   EXECUTE ADDNEWPOINT(1,’POINT(118 32)’, 4326)

   Commit

 

空間查詢

Sql語句給定要素500緩衝區之內的要素,可變部分為輸入要素wkt(點,線,面),查詢圖層,緩衝距離,樣本如下:

 

建立包,定義一個cursor

CREATE OR REPLACE

PACKAGE PACKAGE_GEOMETRY AS

  TYPE GEOMETRY_CURSOR IS ref cursor;

  /* TODO enter package declarations (types, exceptions, methods etc) here */

END PACKAGE_GEOMETRY;

 

建立預存程序,返回查詢結果cursor

create or replace

PROCEDURE SEARCHGEOMETRY(

 WKT VARCHAR2

,SRID NUMBER

,buflength VARCHAR2

,p_cursor in out PACKAGE_GEOMETRY.CURSOR_GEOMETRY) AS

 srarch_geom SDO_GEOMETRY;

 bufferCondition VARCHAR2(35);

BEGIN

    srarch_geom := FUN_CREATEGEOMETRY(

    WKT => WKT,

    SRID => SRID

  );

  bufferCondition := ‘distance=‘ || buflength;

  open p_cursor for SELECT c_c.objectid,c_c.NAME OBJNAME  FROM  MAP_USER_0000008332 c_c

    WHERE SDO_WITHIN_DISTANCE(c_c.SHAPE, srarch_geom, bufferCondition) = ‘TRUE‘;

   

END SEARCHGEOMETRY;

 

調用預存程序查詢要素

Oracle SQL Developter或plSql中調用:

DECLARE

  BUFLENGTH VARCHAR2(25);

  WKT VARCHAR2(200);

  SRID NUMBER;

  RESULT_CUR PACKAGE_GEOMETRY.CURSOR_GEOMETRY;

  OBJECTID NUMBER;

  OBJNAME VARCHAR2(200);

BEGIN

 

  WKT := ‘POINT (118.731963311458 32.0661417793197) ‘;

  SRID := 4326;

  BUFLENGTH := ‘500‘;

  SEARCHGEOMETRY(WKT, SRID,BUFLENGTH, RESULT_CUR);

   loop

        fetch RESULT_CUR

            into OBJECTID,OBJNAME;

        exit when RESULT_CUR%notfound;

        dbms_output.put_line(OBJECTID);

dbms_output.put_line(OBJNAME);

   end loop;

CLOSE RESULT_CUR;

END;

 

 

空間查詢測試查詢點周圍500米內的點資料

選取點資料內某一個點擷取其wkt座標:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_POINT CC WHERE CC.NAME=‘湖心花園‘

POINT (118.748698730662 32.035395102502)   

修改SEARCHGEOMETRY內查詢的表名為MAP_USER_POINT,

查詢結果:


8

車站小區

9

文體西村

7

蓓蕾小區

11

迎賓村

10

茶亭村

12

湖心花園

19

園中園公寓

Arcmap查詢結果:

 

Plsql查詢結果與arcmap查詢結果一致。

 

查詢點周圍500米內的線資料

選取點資料內某一個點擷取其wkt座標:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_POINT CC WHERE CC.NAME=‘萬科金色家園‘

POINT (118.759385095746 32.0420345318682)

  

修改查詢參數wkt為’ POINT (118.759385095746 32.0420345318682)’, 修改預存程序SEARCHGEOMETRY內查詢的表名為MAP_USER_LINE。

查詢結果:

線段2被選中,arcmap中做該點的緩衝區查詢,線段2被選中。修改查詢緩衝區大小為700米,線段2、3被選中。

Plsql查詢結果與arcmap查詢結果一致。

 

查詢點周圍500米內的面資料

選取點資料內某一個點擷取其wkt座標:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_POINT CC WHERE CC.NAME=‘名湖雅居‘

POINT (118.759724313726 32.0354580244683)

 

修改查詢參數wkt為’ POINT (118.759724313726 32.0354580244683)’, 修改預存程序SEARCHGEOMETRY內查詢的表名為MAP_USER_POLY。

查詢結果:

2
face2
6
face6
7
face7
面2、6、7被選中,arcmap中做該點的500米緩衝區查詢,面2、6、7被選中。

 

Plsql查詢結果與arcmap查詢結果一致。

 

查詢線周圍500米內的點資料

選取線資料內某一條線段擷取其wkt座標:

SELECT CC.SHAPE.GET_WKT() FROM MAP_USER_LINE CC WHERE CC.NAME=‘line3‘

查詢所得wkt:

LINESTRING (118.763605759798 32.0391445982447, 118.763755695669 32.0386259340397, 118.763874074329 32.0381089704527, 118.763949962721 32.0377700573423, 118.764039433573 32.0374028695468, 118.764145034666 32.0369562671181, 118.764232941597 32.0365690568166, 118.76430597554 32.0362041074337, 118.764344298351 32.0359930356501, 118.764388237427 32.0357066978059, 118.764487386784 32.0350466349943, 118.764565439843 32.0345753407794, 118.76460084975 32.0343352406788, 118.764633191169 32.0341192388119, 118.764646064065 32.0339927329783, 118.764660872302 32.0337829885941, 118.764663602643 32.0336185295715, 118.764666619869 32.0334691063143, 118.764654318942 32.0330732652191, 118.764633596763 32.032851987929, 118.764589327635 32.0325688795502, 118.764551264729 32.0323638844857, 118.764504484694 32.0321339440263, 118.764435108294 32.0317689748584, 118.764351598148 32.0313420450993, 118.764308733761 32.0311321028643, 118.764242330519 32.0307380145478, 118.76422386474 32.0305728504567)

 

修改查詢參數wkt為上一步查詢到的wkt,修改預存程序SEARCHGEOMETRY內查詢的表名為MAP_USER_POINT。

查詢結果:

5

碧虹苑

6

草根居

22

君園

23

莫愁東寓小區

24

名湖雅居

25

萬科金色家園

36

羅廊巷2號小區

37

環宇軒小區

38

中興新村

39

止馬營社區

44

陶李王巷新苑

45

漢中苑物管小區

46

漢中苑物管小區

47

止馬村

48

通宇花園

49

韓家苑小區

50

韓家苑小區

         在arcmap中通過line3的500米緩衝區查詢點要素,查詢結果如:

 

Plsql查詢結果與arcmap查詢結果一致。

查詢線周圍500米內的線資料

Plsql查詢結果與arcmap查詢結果一致。

查詢線周圍500米內的面資料

PLSQL 查詢結果:

1
face1
3
face3
6
face6
7
face7

arcmap查詢結果如:

 

 

Plsql查詢結果與arcmap查詢結果一致。

Oracle 空間查詢, 資料類型為 sdo_geometry

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.