SQL Server 2008空間數據應用系列六:基於SQLCRL的空間數據可編程性

原文: SQL Server 2008空間數據應用系列六:基於SQLCRL的空間數據可編程性

  友情提示,您閱讀本篇博文的先決條件以下: html

  一、本文示例基於Microsoft SQL Server 2008 R2調測。sql

  二、具有 Transact-SQL 編程經驗和使用 SQL Server Management Studio 的經驗。數據庫

  三、具備使用 Microsoft Visual Studio 進行 Microsoft .NET Framework開發的經驗。編程

  四、熟悉或瞭解Microsoft SQL Server 2008中的空間數據類型。函數

  五、具有相應(好比OGC)的GIS專業理論知識。post


 

  Microsoft .NET應用一般都是宿主在操做系統平臺的.NET Framework之上,若是想在SQL Server 2008中使用.NET進行託管代碼,SQL Server 2008將運行一個屬於本身的.NET Framewrok平臺運行環境(SQLOS),SQLOS和.NET CLR將共享數據庫引擎進程空間,所以基於SQL Server 2008的CLR也被稱爲的SQLCLR基於SQL Server 2008的核心組件SQLCRL提供了友好的的可編程性支持,SQL Server數據庫引擎將使用由CLR提供的功能無縫地提供了多種功能其中包括使用空間數據類型goegraphygoemetry的數據的可編程性支持。ui

 

1、SQLCLR & .NET CLR互編程性url

   能夠在SQL Server 2008的安裝目錄下找到SQLCLR與.NET CLR共享的空間數據類型共享庫組件(Microsoft.SqlServer.Types.dll),該組件除了支持基於SQL Server 2008的空間數據類型數據庫編程,同時也支持基於.NET Framework的面向對象編程,包括對VB.NET、C#的多語言的支持,該組件位於以下安裝目錄中: spa

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方法

 

2、建立空間對象到數據庫

  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();
        }
    }
}

 

3、查詢數據庫空間數據

  首先來看看基於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與空間數據的親密接觸,敬請期待~~~~

 

4、相關資料

  [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/

相關文章
相關標籤/搜索