sqlserver2k5中利用CLR-UDF實現空間查詢

來源:互聯網
上載者:User
今天晚上比較閑,寫點東西。我已經在實際項目中使用sqlserver2005來構建空間資料庫並完成空間查詢的功能。

這裡僅給出一個利用sqlserver2k5中CLR UDF實現空間查詢的簡單樣本,具體演算法實現不詳表。

1。在VS2005中建立一個SQL Server Project。
2。新增一個User-Defined Function。編寫如下函數PointQuery

[SqlFunction]
public static SqlBoolean PointQuery(SqlDouble x, SqlDouble y, SqlDouble tolerance, SqlBytes binary)
{
//這裡進行空間計算,返回是否命中的布爾值
}

參數x, y為點座標,tolerance為容限,binary為二進位空間資料。
在函數體中把binary還原為geometry對象,與點對象進行幾何計算後返回一個布值表示是否命中。
(事實上可看做一個圓查詢)
3。編譯後deploy這個assembly到sqlserver2k5上。

下面給出一個在空間表中實現空間查詢的例子:
例如有個空間表world_contry的結構like this

column name data type
id int
minx float
miny float
maxx float
maxy float
property1  
...  
propertyN  
geometry image

T-SQL實現這個空間表的點選查詢,小括弧中為實際資料SELECT * FROM 
(--這裡先進行一次MBR過濾,得到一個表A
SELECT * 
FROM [world_contry]
WHERE
[minx]<(MBR.maxx)
[miny]<(MBR.maxy)
[maxx]>(MBR.minx)
[maxy]>(MBR.miny)
) A
WHERE
[dbo].[PointQuery]  --CLR UDF
(
(point.x),
(point.y),
(point.tolerance)
[A].[geometry]
)=1     

如果做屬性關聯則在其後追加,例如

AND
[name]
LIKE '%國%'

這是一個點查詢的簡單例子,其他諸如多邊形,折線等查詢以此類推。

簡單測試了一下,我的PC是P4 2.8G, 1G RAM。
在一個面類型的世界國家表(未做資料庫方面的任何最佳化)中,將其記錄反覆複製至8萬條
在這個單表中隨意加入一個點資料,執行一個點查詢後命中48條記錄,完成時間在600ms左右。
這48條記錄就是這個點查詢物件查詢出來的feature。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.