標籤:
原文:SQL Server 2008空間資料應用系列六:基於SQLCRL的空間資料可程式化性
友情提示,您閱讀本篇博文的先決條件如下:
1、本文樣本基於Microsoft SQL Server 2008 R2調測。
2、具備 Transact-SQL 編程經驗和使用 SQL Server Management Studio 的經驗。
3、具有使用 Microsoft Visual Studio 進行 Microsoft .NET Framework開發的經驗。
4、熟悉或瞭解Microsoft SQL Server 2008中的空間資料類型。
5、具備相應(比如OGC)的GIS專業理論知識。
Microsoft .NET應用通常都是宿主在作業系統平台的.NET Framework之上,如果想在SQL Server 2008中使用.NET進行Managed 程式碼,SQL Server 2008將運行一個屬於自己的.NET Framewrok平台運行環境(SQLOS),SQLOS和.NET CLR將共用資料庫引擎進程空間,因此基於SQL Server 2008的CLR也被稱為的SQLCLR。基於SQL Server 2008的核心組件SQLCRL提供了友好的的可程式化性支援,SQL Server資料庫引擎將使用由CLR提供的功能無縫地提供了多種功能,其中包括使用空間資料類型goegraphy和goemetry的資料的可程式化性支援。
一、SQLCLR & .NET CLR互編程性
可以在SQL Server 2008的安裝目錄下找到SQLCLR與.NET CLR共用的空間資料類型共用庫組件(Microsoft.SqlServer.Types.dll),該組件除了支援基於SQL Server 2008的空間資料類型資料庫編程,同時也支援基於.NET Framework的物件導向編程,包括對VB.NET、C#的多語言的支援,該組件位於如下安裝目錄中:
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll
通過下面這個樣本程式可以示範基於Microsoft.SqlServer.Types.dll在SQLCLR和.NET CLR之間的雙向互支援性。
SQLCLR:定義一個地理座標點
declare @geom geometry;
set @geom = geometry::Point(107.04352,28.870554,4326);
select @geom;
-----------------------------------------------------------------------------------
.NET CLR:定義一個地理座標點
static void Main(string[] args)
{
var point = SqlGeometry.Point(107.04352, 28.870554, 4326);
Console.WriteLine(point.STX);
Console.WriteLine(point.STY);
Console.WriteLine(point.ToString());
}
在.NET CLR中可以使用所有SQLCLR編程中所提供的編程介面,也就是說在.NET CLR中變成不僅僅只是局限於再空間對象的定義上,還包括對象的相關屬性、方法的支援,如下代碼塊示範了SQLCLR和.NET CLR編程實現地理測距函數的對比。
declare @geom geometry;
set @geom = geometry::Point(107.04352,28.870554,4326);
declare @end geometry;
set @end = geometry::Point(103.84041, 29.170240,4326);
select @geom.STDistance(@end);
------------------------------------------------------------------------
var pointStart = SqlGeometry.Point(107.04352, 28.870554, 4326);
var pointEnd = SqlGeometry.Point(103.84041, 29.170240, 4326);
var result = pointStart.STDistance(pointEnd);
Console.WriteLine("地理距離:" + result + "(米)");
關於空間對象的屬性、函數的具體使用這裡就不做介紹了,詳細請查閱:幾何執行個體上的OGC方法。
二、建立空間對象到資料庫
Microsoft.SqlServer.Types.dll提供友好的.NET CLR編程性,同樣我們可以將在.NET CLR中建立的對象插入到空間資料庫中進行查詢,以便於做空間分析、計算。下面示範通過.NET CLR構造一個多邊形空間對象並插入到SQL Server 2008資料庫中。
static void Main(string[] args)
{
//定義一個多邊形
var polygon = SqlGeography.STGeomFromText(
new SqlChars(
new SqlString("POLYGON ((-114.01611328125 42.0003251483162, -114.0380859375 42.0003251483162,"
+ "-113.994140625 37.0200982013681, -109.05029296875 37.0200982013681, -109.09423828125 41.0130657870063, "
+ "-111.07177734375 41.0462168145206, -111.07177734375 42.0003251483162, -114.01611328125 42.0003251483162))",
111)),
4326);
var sql = "insert Cities (CityName,CityLocation) values (‘test‘,‘" + polygon.ToString() + "‘)";
InsertToDB(sql);
}
private static void InsertToDB(string sql)
{
using (var conn = new SqlConnection(ConfigurationManager.AppSettings["SQL2008"]))
{
if (conn.State == ConnectionState.Closed) conn.Open();
using (var cmd = new SqlCommand(sql, conn))
{
int row = cmd.ExecuteNonQuery();
}
}
}
三、查詢資料庫空間資料
首先來看看基於SQL Server Management Studio 查詢剛剛入庫的記錄,通過空間結果可以直接預覽查詢結果。
declare @city geometry;
select @city = CityLocation from Cities where ID=5;
select @city;
select @city.STArea() as 面積;--求面積 ---------------------------------------------------------------------------------------------------------------------------------------
0x000000000104080000000000000008815CC035B18AA70A0045400000000070825CC035B18AA70A00454000000000A07F5CC0CECAEE93928242400000000038435BC0CECAEE93928242400000000008465BC0BCF1C323AC8144400000000098C45BC01572BD6EEA8544400000000098C45BC035B18AA70A0045400000000008
(1 行受影響)
面積
----------------------
22.6802255629445
(1 行受影響)
同樣可以使用.NET CLR對其進行編程實現,這其實和查詢普通資料是沒有區別的,只是將查詢結果轉為為的是空間資料類型。可以通過如下代碼實現查詢空間資料到應用程式中。
static void Main(string[] args)
{
var sql = "select CityLocation from Cities where ID = 5";
var result = QueryDB(sql);
var polygon = SqlGeography.STGeomFromText(
new SqlChars(
new SqlString(result)), 4326);
Console.WriteLine(polygon.ToString());
}
private static string QueryDB(string sql)
{
using (var conn = new SqlConnection(ConfigurationManager.AppSettings["SQL2008"]))
{
if (conn.State == ConnectionState.Closed) conn.Open();
using (var cmd = new SqlCommand(sql, conn))
{
return cmd.ExecuteScalar().ToString();
}
}
}
本篇就大概介紹到這裡,經常內容請關注後續系列博文,下一篇將介紹微軟Bing Maps與空間資料的親密接觸,敬請期待~~~~
四、相關資料
[1]、資料表中使用空間資料類型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html
[2]、幾何執行個體上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx
[3]、幾何圖形執行個體上的擴充方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx
[4]、OGC 靜態幾何圖形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx
著作權說明
本文屬原創文章,歡迎轉載且註明文章出處,其著作權歸作者和部落格園共有。為了儲存作者的創作熱情,請在轉載後的明顯位置標記本文出處。
作 者:Beniao
文章出處:http://beniao.cnblogs.com/ 或 http://www.cnblogs.com/
SQL Server 2008空間資料應用系列六:基於SQLCRL的空間資料可程式化性