利用空間資料庫求兩點距離
前兩天在實現一個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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 空間資料庫三維空間兩點距離計算錯誤資料庫
- 空間距離計算
- 求二叉樹的給定兩個結點之間的距離二叉樹
- 計算地圖中兩點之間的距離地圖
- 求兩向量距離的CUDA實現
- 求矩陣中向量兩兩間的歐氏距離(python實現)矩陣Python
- 地理空間距離計算優化優化
- C語言:使用函式計算兩點間的距離C語言函式
- sql 計算兩個經緯度點之間的距離SQL
- Java二叉樹排序及任意兩點個節點間的最大距離Java二叉樹排序
- 根據經緯度計算兩點之間的距離的公式公式
- JAVA計算兩經緯度間的距離Java
- 百度地圖計算兩座標點之間距離計算地圖
- 【谷歌面試題】求陣列中兩個元素的最小距離谷歌面試題陣列
- 二叉樹中相距最遠的兩個節點之間的距離二叉樹
- 查詢sqlserver資料庫及各表格空間利用情況SQLServer資料庫
- 實現一個函式,對給定平面任意兩點座標(x 1 ,y 1 )和(x 2 ,y 2 ),求這兩點之間的距離函式
- 資料庫空間重整方案資料庫
- oracle的空間資料庫:Oracle資料庫
- 清理oracle資料庫空間Oracle資料庫
- 利用oracle 傳輸表空間來實現歷史資料分離的方案Oracle
- 利用Log還原資料庫到某一時間點資料庫
- 微信小程式——計算2點之間的距離微信小程式
- 通過sql 計算兩經緯度之間的距離SQL
- Python基於Excel資料加以反距離加權空間插值並掩膜圖層PythonExcel
- 空間索引 - 各資料庫空間索引使用報告索引資料庫
- PostgreSQL:表空間-->資料庫-->表SQL資料庫
- Sybase資料庫空間相關資料庫
- Oracle資料庫管理 版主空間Oracle資料庫
- 檢視資料庫表空間資料庫
- oracle清除資料庫表空間Oracle資料庫
- 資料庫硬碟空間如何算資料庫硬碟
- 刪除資料庫表空間資料庫
- 二叉樹中最遠的兩個結點的距離二叉樹
- 獲取資料庫空閒空間的SQL資料庫SQL
- 資料庫和表空間資料移動資料庫
- 空間統計之點資料分析
- 經緯度計算兩地之間的距離(原理與方法)