利用空間資料庫求兩點距離
前兩天在實現一個SQL的時候,需要計算平面上2點間的距離,如果使用SQL函式實現,程式碼比較長,於是想到能否利用空間資料庫的結構來實現這個功能。
測試環境為11.1.0.6,如果是9i,由於沒有建立同義詞,還需要在SDO物件的前面加上MDSYS字首。
這裡借用MDSYS的SDO_GEOMETRY物件,下面是一個簡單的例子,計算(0, 0)到(3, 4)兩點間的距離:
SQL> SELECT
2 SDO_GEOM.SDO_DISTANCE(
3 SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(0, 0, NULL), NULL, NULL),
4 SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(3, 4, NULL), NULL, NULL),
5 0.0001) DISTANCE
6 FROM DUAL;
DISTANCE
----------
5
簡單看一下SDO_GEOMETRY的結構:
SQL> DESC SDO_GEOMETRY
名稱 是否為空? 型別
-------------------------------------------------- -------- --------------------
SDO_GTYPE NUMBER
SDO_SRID NUMBER
SDO_POINT MDSYS.SDO_POINT_TYPE
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY
METHOD
------
MEMBER FUNCTION GET_GTYPE RETURNS NUMBER
METHOD
------
MEMBER FUNCTION GET_DIMS RETURNS NUMBER
METHOD
------
MEMBER FUNCTION GET_LRS_DIM RETURNS NUMBER
METHOD
------
MEMBER FUNCTION GET_WKB RETURNS BLOB
METHOD
------
MEMBER FUNCTION GET_WKT RETURNS CLOB
METHOD
------
MEMBER FUNCTION ST_COORDDIM RETURNS NUMBER
METHOD
------
MEMBER FUNCTION ST_ISVALID RETURNS NUMBER
METHOD
------
FINAL CONSTRUCTOR FUNCTION SDO_GEOMETRY RETURNS SELF AS RESULT
引數名稱 型別 輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
WKT CLOB IN
SRID NUMBER IN DEFAULT
METHOD
------
FINAL CONSTRUCTOR FUNCTION SDO_GEOMETRY RETURNS SELF AS RESULT
引數名稱 型別 輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
WKT VARCHAR2 IN
SRID NUMBER IN DEFAULT
METHOD
------
FINAL CONSTRUCTOR FUNCTION SDO_GEOMETRY RETURNS SELF AS RESULT
引數名稱 型別 輸入/輸出預設值?
------------------------------ ----------------------- ------ --------
WKB BLOB IN
SRID NUMBER IN DEFAULT
其中引數SDO_GTYPE的值2001表示是一個二維的點,這個型別的具體函式描述可以參考空間資料庫的官方文件。
而隨後的SDO_POINT構造了一個點的位置,然後透過SDO_GEOM.SDO_DISTANCE 函式來計算兩個點的距離。
可能二維點的計算,這種方法和SQL直接計算沒有太大的差別,而對於三維點而言,這種方式就顯得簡單得多了:
SQL> SELECT
2 SDO_GEOM.SDO_DISTANCE(
3 SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(0, 0, 0), NULL, NULL),
4 SDO_GEOMETRY(3001, NULL, SDO_POINT_TYPE(3, 4, 12), NULL, NULL),
5 0.0001) DISTANCE
6 FROM DUAL;
DISTANCE
----------
13
另外對於二維點,10g以上版本可以利用更簡單的方法來構造:
SQL> SELECT
2 SDO_GEOM.SDO_DISTANCE(
3 SDO_GEOMETRY('POINT(0 0)'),
4 SDO_GEOMETRY('POINT(3 4)'),
5 0.0001) DISTANCE
6 FROM DUAL;
DISTANCE
----------
5
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-551933/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 求矩陣中向量兩兩間的歐氏距離(python實現)矩陣Python
- 計算地圖中兩點之間的距離地圖
- C語言:使用函式計算兩點間的距離C語言函式
- 空間或平面判斷兩線段相交(求交點)
- 根據經緯度計算兩點之間的距離的公式公式
- JAVA計算兩經緯度間的距離Java
- 清理oracle資料庫空間Oracle資料庫
- 實現一個函式,對給定平面任意兩點座標(x 1 ,y 1 )和(x 2 ,y 2 ),求這兩點之間的距離函式
- Python基於Excel資料加以反距離加權空間插值並掩膜圖層PythonExcel
- PostgreSQL:表空間-->資料庫-->表SQL資料庫
- 通過sql 計算兩經緯度之間的距離SQL
- 微信小程式——計算2點之間的距離微信小程式
- 最小距離分類器,互動式選取影像樣本分類資料,進行最小距離分類(實現歐式距離,馬氏距離,計程距離)
- oracle dg庫資料檔案空間不足Oracle
- Oracle資料庫閃回區空間不足Oracle資料庫
- 點到直線的距離,垂足,對稱點,兩點所成的直線方程
- 常見問題01:計算地球上兩個點的距離
- 2058. 找出臨界點之間的最小和最大距離
- 達夢資料庫表空間等空間大小查詢方法總結資料庫
- SQLServer行版本資訊吃資料庫tempdb空間SQLServer資料庫
- C++語言演算法之求任意兩個相同字元的最大距離C++演算法字元
- 定義Point類,採用友元類的方式計算兩個點之間的水平和垂直距離
- DB2建立資料庫,建立表空間DB2資料庫
- 獲取資料庫中到指定經緯度距離的座標資料庫
- 根據兩點經緯度計算距離和角度——java實現Java
- SciPy 空間資料
- WebGIS 利用 WebGL 在 MapboxGL 上渲染 DEM 三維空間資料Web
- 【資料庫資料恢復】SQL Server資料庫磁碟空間不足的資料恢復案例資料庫資料恢復SQLServer
- 資料技術大融合,HSTAP資料庫有多少想象空間?資料庫
- Php兩點地理座標距離的計算方法和具體程式碼PHP
- ASM空間爆滿導致資料庫掛起ASM資料庫
- 檢視資料庫佔用磁碟空間的方法資料庫
- 虛擬主機資料庫與空間關係資料庫
- 尤拉計劃547:帶洞正方形內任意點間距離
- 2.5.9 在資料庫建立期間支援大檔案表空間資料庫
- 馬氏距離與歐氏距離
- 視覺化學習:利用向量計算點到線段的距離並展示視覺化
- GBase8s 檢視資料庫表空間資訊資料庫
- 時間和空間的完美統一!阿里雲時空資料庫正式商業化阿里資料庫