1. 程式人生 > >Oracle 空間查詢, 數據類型為 sdo_geometry

Oracle 空間查詢, 數據類型為 sdo_geometry

dbm open 點線 function rep dbms nes pack lac

因網上搜索到的相關資料大部分都是關於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