今天晚上比較閑,寫點東西。我已經在實際項目中使用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。