SQL Server 2008空間數(shù)據(jù)應用系列六:基于SQLCRL的空間數(shù)據(jù)可編程性
友情提示,您閱讀本篇博文的先決條件如下:
- 本文示例基于Microsoft SQL Server 2008 R2調(diào)測。
- 具備 Transact-SQL 編程經(jīng)驗和使用 SQL Server Management Studio 的經(jīng)驗。
- 具有使用 Microsoft Visual Studio 進行 Microsoft .NET Framework開發(fā)的經(jīng)驗。
- 熟悉或了解Microsoft SQL Server 2008中的空間數(shù)據(jù)類型。
- 具備相應(比如OGC)的GIS專業(yè)理論知識。
Microsoft .NET應用通常都是宿主在操作系統(tǒng)平臺的.NET Framework之上,如果想在SQL Server 2008中使用.NET進行托管代碼,SQL Server 2008將運行一個屬于自己的.NET Framewrok平臺運行環(huán)境(SQLOS),SQLOS和.NET CLR將共享數(shù)據(jù)庫引擎進程空間,因此基于SQL Server 2008的CLR也被稱為的SQLCLR?;赟QL Server 2008的核心組件SQLCRL提供了友好的的可編程性支持,SQL Server數(shù)據(jù)庫引擎將使用由CLR提供的功能無縫地提供了多種功能,其中包括使用空間數(shù)據(jù)類型goegraphy和goemetry的數(shù)據(jù)的可編程性支持。
一、SQLCLR & .NET CLR互編程性
可以在SQL Server 2008的安裝目錄下找到SQLCLR與.NET CLR共享的空間數(shù)據(jù)類型共享庫組件(Microsoft.SqlServer.Types.dll),該組件除了支持基于SQL Server 2008的空間數(shù)據(jù)類型數(shù)據(jù)庫編程,同時也支持基于.NET Framework的面向?qū)ο缶幊?,包括對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編程實現(xiàn)地理測距函數(shù)的對比。
- 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 + "(米)");
二、創(chuàng)建空間對象到數(shù)據(jù)庫
Microsoft.SqlServer.Types.dll提供友好的.NET CLR編程性,同樣我們可以將在.NET CLR中創(chuàng)建的對象插入到空間數(shù)據(jù)庫中進行查詢,以便于做空間分析、計算。下面演示通過.NET CLR構造一個多邊形空間對象并插入到SQL Server 2008數(shù)據(jù)庫中。
- 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();
- }
- }
- }
三、查詢數(shù)據(jù)庫空間數(shù)據(jù)
首先來看看基于SQL Server Management Studio 查詢剛剛入庫的記錄,通過空間結果可以直接預覽查詢結果。
- declare @city geometry;
- select @city = CityLocation from Cities where ID=5;
- select @city;
- select @city.STArea() as 面積;--求面積
0x000000000104080000000000000008815CC035B18AA70A0045400000000070825CC035B18AA70A00454000000000
A07F5CC0CECAEE93928242400000000038435BC0CECAEE93928242400000000008465BC0BCF1C323AC814440000000
0098C45BC01572BD6EEA8544400000000098C45BC035B18AA70A0045400000000008
(1 行受影響)
面積
22.6802255629445
(1 行受影響)
同樣可以使用.NET CLR對其進行編程實現(xiàn),這其實和查詢普通數(shù)據(jù)是沒有區(qū)別的,只是將查詢結果轉為為的是空間數(shù)據(jù)類型??梢酝ㄟ^如下代碼實現(xiàn)查詢空間數(shù)據(jù)到應用程序中。
- 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();
- }
- }
- }
本篇就大概介紹到這里,經(jīng)常內(nèi)容請關注后續(xù)系列博文,下一篇將介紹微軟Bing Maps與空間數(shù)據(jù)的親密接觸,敬請期待~~~~
四、相關資料
[1]、數(shù)據(jù)表中使用空間數(shù)據(jù)類型: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 靜態(tài)幾何圖形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx
原文出處:http://www.cnblogs.com/beniao/archive/2011/02/24/1961729.html
【編輯推薦】