自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server 2008空間數(shù)據(jù)應(yīng)用系列七:基于Bing Maps(Silverlight) 的空間數(shù)據(jù)展現(xiàn)

數(shù)據(jù)庫 SQL Server
本篇博文以Bing Maps Silverlight Control為地圖應(yīng)用客戶端為基礎(chǔ),介紹如何實(shí)現(xiàn)在Bing Maps中呈現(xiàn)地理空間數(shù)據(jù)。

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

  1. 本文示例基于Microsoft SQL Server 2008 R2調(diào)測。
  2. 具備 Transact-SQL 編程經(jīng)驗(yàn)和使用 SQL Server Management Studio 的經(jīng)驗(yàn)。
  3. 具有使用 Microsoft Visual Studio 進(jìn)行 Microsoft .NET Framework開發(fā)的經(jīng)驗(yàn)。
  4. 具有使用WCF、Silverlight、ADO.NET開發(fā)的經(jīng)驗(yàn)。
  5. 熟悉或了解Microsoft SQL Server 2008中的空間數(shù)據(jù)類型。
  6. 具備相應(yīng)(比如OGC)的GIS專業(yè)理論知識(shí)。

 


SQL Server 2008中存儲(chǔ)的空間數(shù)據(jù),除了能夠直接基于SQL Server做空間查詢、空間分析外,由于SQLCLR提供了非常豐富、完善的開發(fā)API,使得空間數(shù)據(jù)可以在不同的常用空間數(shù)據(jù)類型之間轉(zhuǎn)換,同時(shí)還可以非常簡單的和地圖應(yīng)用無縫集成使用。本篇博文以Bing Maps Silverlight Control為地圖應(yīng)用客戶端為基礎(chǔ),介紹如何實(shí)現(xiàn)在Bing Maps中呈現(xiàn)地理空間數(shù)據(jù)。

一、準(zhǔn)備空間數(shù)據(jù)

為了演示如何基于Bing Maps Silverlight Control來呈現(xiàn)SQL Server 2008中存儲(chǔ)的空間數(shù)據(jù),首先需要在數(shù)據(jù)庫中模擬一些數(shù)據(jù)供數(shù)據(jù)查詢使用,隨意創(chuàng)建一個(gè)帶有空間數(shù)據(jù)類型字段的表就可以,如下SQL腳本。

  1. CREATE TABLE DrawnPolygons(  
  2.     [ID] [int] IDENTITY(1,1) NOT NULL,  
  3.     [Name] [varchar](50) NOT NULL,  
  4.     [Polygon] [geography] NOT NULL)  
  5. GO 
對于上面腳本所創(chuàng)建的表格,隨意的構(gòu)造幾條數(shù)據(jù),如下圖SQL Server Management Studio的空間結(jié)果中所呈現(xiàn)的效果。

二、編寫數(shù)據(jù)服務(wù)接口

數(shù)據(jù)結(jié)構(gòu)使用WebService或者WCF提供都可以,本篇選用WCF Service提供地圖數(shù)據(jù)訪問接口,實(shí)現(xiàn)將數(shù)據(jù)庫的空間數(shù)據(jù)讀取出來返回到Bing Maps的地圖客戶端。由于目前的Linq To Sql和ASP.NET Entity Framewrok還不支持SQL Server 2008的空間數(shù)據(jù)類型,數(shù)據(jù)訪問只能自己編寫ADO.NET實(shí)現(xiàn)。如下代碼塊:

  1. private DataTable Query(string sql)  
  2. {  
  3.     string cstring = ConfigurationManager.ConnectionStrings["BingMapsDB"].ConnectionString;  
  4.     SqlConnection conn = new SqlConnection(cstring);  
  5.     if (conn.State == ConnectionState.Closed) conn.Open();  
  6.     SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);  
  7.     DataSet ds = new DataSet();  
  8.     adapter.Fill(ds);  
  9.     return ds.Tables[0];  
直接在WCF中對外公布一個(gè)公共方法,并將其標(biāo)記為操作契約(OperationContract)就完成了服務(wù)接口的提供,該接口實(shí)現(xiàn)數(shù)據(jù)庫查詢并將數(shù)據(jù)庫數(shù)據(jù)數(shù)據(jù)組合為對象集合返回到客戶端,詳細(xì)實(shí)現(xiàn)如下代碼塊。
  1. [OperationContract]  
  2. public List QueryPolygons()  
  3. {  
  4.     var sql = "SELECT  * FROM [DrawnPolygons]";  
  5.  
  6.     var result = Query(sql);  
  7.     List areas = null;  
  8.     if (result != null && result.Rows.Count > 0)  
  9.     {  
  10.         areas = new List();  
  11.         foreach (DataRow row in result.Rows)  
  12.         {  
  13.             areas.Add(new DrawnPolygons  
  14.             {  
  15.                 ID = int.Parse(row["ID"].ToString()),  
  16.                 Name = row["NAME"].ToString(),  
  17.                 Xaml = ToXaml(row["Polygon"], row["ID"].ToString())  
  18.             });  
  19.         }  
  20.     }  
  21.     return areas;  
接口使用了數(shù)據(jù)傳輸對象DrawnPolygons,其他結(jié)構(gòu)如下定義:
  1. [DataContract]  
  2. public class DrawnPolygons  
  3. {  
  4.     [DataMember]  
  5.     public int ID { get; set; }  
  6.     [DataMember]  
  7.     public string Name { get; set; }  
  8.     [DataMember]  
  9.     public string Xaml { get; set; }  
  10. }  
三、構(gòu)造空間數(shù)據(jù)客戶端對象

在這里請大家講視眼轉(zhuǎn)移到本篇前面代碼片段的中加粗大紅字體處,會(huì)發(fā)現(xiàn)使用了一個(gè)名為“ToXaml()”的方法,此方法的主要功能就是實(shí)現(xiàn)將空間數(shù)據(jù)轉(zhuǎn)換為客戶端Silverlight能夠識(shí)別的xaml語言標(biāo)記。該方法的詳細(xì)實(shí)現(xiàn)如下代碼塊所示:

  1. private string ToXaml(object polygon,string id)  
  2. {  
  3.     StringBuilder sb = new StringBuilder();  
  4.     //將數(shù)據(jù)庫查詢出的空間數(shù)據(jù)構(gòu)造為SQL Server空間數(shù)據(jù)類型對象  
  5.     var geo = SqlGeography.STGeomFromText(  
  6.                                 new SqlChars(  
  7.                                 new SqlString(polygon.ToString())), 4326);  
  8.     //將空間數(shù)據(jù)構(gòu)造為Bing Maps圖形(多邊形)對象的Xaml文本,以返回到客戶端直接解析Xaml為Silverlight程序中的對象。  
  9.     for (int j = 1; j <= geo.NumRings(); j++)  
  10.     {  
  11.         if (geo.RingN(j).STNumPoints() > 1)  
  12.         {  
  13.             sb.Append(");  
  14.             sb.Append(" Fill=\"Red\" Locations=\"");  
  15.             for (int k = 1; k <= geo.RingN(j).STNumPoints(); k++)  
  16.             {  
  17.                 if (k > 1) sb.Append(" ");  
  18.                 sb.Append(String.Format("{0:0.#####},{1:0.#####}",   
  19.                     (double)geo.RingN(j).STPointN(k).Lat,   
  20.                     (double)geo.RingN(j).STPointN(k).Long));  
  21.             }  
  22.             sb.AppendLine("\"/>");  
  23.         }  
  24.     }  
  25.              
  26.     return sb.ToString();  
  27. }  
實(shí)際上,在服務(wù)端將空間數(shù)據(jù)轉(zhuǎn)化為Xaml并非實(shí)現(xiàn)傳遞空間數(shù)據(jù)到客戶端并解析呈現(xiàn)到GIS界面的***選擇,還可以將數(shù)據(jù)庫空間數(shù)據(jù)處理為KML、GML等常用的其它能夠表示存儲(chǔ)地圖數(shù)據(jù)的任意格式返回到客戶端使用。這里為何選擇將空間數(shù)據(jù)解析為Xaml語言標(biāo)記的目的是為了Silverlight能夠直接將Xaml語言標(biāo)記解析為對應(yīng)的對象,并能夠直接使用。如果選擇將空間數(shù)據(jù)解析為別的地圖數(shù)據(jù)格式,還需要額外的解析算法去實(shí)現(xiàn)空間數(shù)據(jù)的解析。

四、Bing Maps客戶端的實(shí)現(xiàn)

Bing Maps Silverlight客戶端只需要調(diào)用上面提供的WCF Service接口,將空間數(shù)據(jù)查詢到客戶端,然后通過XamlReader的接口解析Xaml為對應(yīng)的對象即可,可以在應(yīng)用程序加載時(shí)就發(fā)起對接口的調(diào)用。如下代碼塊所示:

  1. public MainPage()  
  2. {  
  3.     InitializeComponent();  
  4.       
  5.     //調(diào)用WCF服務(wù)接口查詢空間數(shù)據(jù)到客戶端  
  6.     DataServiceClient service = new DataServiceClient();  
  7.     service.QueryPolygonsCompleted += new EventHandler(service_QueryPolygonsCompleted);  
  8.     service.QueryPolygonsAsync();  
  9. }  
  10. private void service_QueryPolygonsCompleted(object sender, QueryPolygonsCompletedEventArgs e)  
  11. {  
  12.     if (e.Error != nullreturn;  
  13.  
  14.     for (int i = 0; i < e.Result.Count; i++)  
  15.     {  
  16.         //將空間數(shù)據(jù)所構(gòu)造的Xaml語言標(biāo)記解析為Bing Maps Silverlight Control中的多邊形(MapPolygon)對象。  
  17.         MapPolygon polygon = (MapPolygon)XamlReader.Load(e.Result[i].Xaml);  
  18.         //將多邊形對象添加到地圖中呈現(xiàn)。  
  19.         map.Children.Add(polygon);  
  20.  
  21.     }  
  22. }  

四、相關(guān)資料

[1]、數(shù)據(jù)表中使用空間數(shù)據(jù)類型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html

[2]、幾何實(shí)例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx

[3]、幾何圖形實(shí)例上的擴(kuò)展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx

[4]、OGC 靜態(tài)幾何圖形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx

[5]、Bing Maps開發(fā)系列博文:http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html

原文鏈接:http://www.cnblogs.com/beniao/archive/2011/03/20/1963361.html

 

【編輯推薦】

  1. 日志真沒想象的那么簡單
  2. 用SQL查詢?nèi)?月 周 季
  3. SQL Server 2008中的代碼安全
  4. SQL問題與解答:維護(hù)日志和索引
  5. SQL Servr 2008空間數(shù)據(jù)應(yīng)用系列六:基于SQLCRL的空間數(shù)據(jù)可編程性
責(zé)任編輯:艾婧 來源: 博客園
相關(guān)推薦

2011-03-22 15:10:49

Bing MapsSQL Server

2011-02-21 13:06:42

Microsoft S

2011-03-22 09:17:12

SQLCRLSQL Server

2011-02-21 13:41:14

SQL Server

2009-04-16 17:55:55

SQL Server 空間數(shù)據(jù).NET

2011-02-21 10:26:53

Microsoft S

2011-02-21 10:47:44

Microsoft S

2011-02-21 13:23:54

微軟 SQL Serv

2011-09-01 13:24:42

SQL Server 呈現(xiàn)GeoRSS訂閱的Bing Maps

2009-08-28 11:38:15

MapPoint

2011-03-22 15:36:44

Spatial TooSQL Server

2011-02-21 13:06:34

SQL Servr 2

2009-01-20 13:39:56

數(shù)據(jù)挖掘空間數(shù)據(jù)方法

2009-04-16 17:38:24

SQL Server 空間數(shù)據(jù)智能

2010-09-07 16:28:58

DB2 空間數(shù)據(jù)

2022-03-30 09:30:00

數(shù)據(jù)庫地理空間查詢SQL

2022-09-14 11:27:19

物聯(lián)網(wǎng)大數(shù)據(jù)智慧城市

2024-10-18 17:03:16

Python地理空間數(shù)據(jù)處理

2010-05-07 12:35:05

Oracle spat

2011-08-09 18:40:21

Oracle控制文件重做日志文件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)