SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

友情提示,您阅读本篇博文的先决条件如下:

  1. 本文示例基于Microsoft SQL Server 2008 R2调测。
  2. 具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。
  3. 具有使用 Microsoft Visual Studio 进行 Microsoft .NET Framework开发的经验。
  4. 具有使用WCF、Silverlight、ADO.NET开发的经验。
  5. 熟悉或了解Microsoft SQL Server 2008中的空间数据类型。
  6. 具备相应(比如OGC)的GIS专业理论知识。

 


SQL Server 2008中存储的空间数据,除了能够直接基于SQL Server做空间查询、空间分析外,由于SQLCLR提供了非常丰富、完善的开发API,使得空间数据可以在不同的常用空间数据类型之间转换,同时还可以非常简单的和地图应用无缝集成使用。本篇博文以Bing Maps Silverlight Control为地图应用客户端为基础,介绍如何实现在Bing Maps中呈现地理空间数据。

一、准备空间数据

为了演示如何基于Bing Maps Silverlight Control来呈现SQL Server 2008中存储的空间数据,首先需要在数据库中模拟一些数据供数据查询使用,随意创建一个带有空间数据类型字段的表就可以,如下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 

对于上面脚本所创建的表格,随意的构造几条数据,如下图SQL Server Management Studio的空间结果中所呈现的效果。

二、编写数据服务接口

数据结构使用WebService或者WCF提供都可以,本篇选用WCF Service提供地图数据访问接口,实现将数据库的空间数据读取出来返回到Bing Maps的地图客户端。由于目前的Linq To Sql和ASP.NET Entity Framewrok还不支持SQL Server 2008的空间数据类型,数据访问只能自己编写ADO.NET实现。如下代码块:

  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中对外公布一个公共方法,并将其标记为操作契约(OperationContract)就完成了服务接口的提供,该接口实现数据库查询并将数据库数据数据组合为对象集合返回到客户端,详细实现如下代码块。

  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;  

接口使用了数据传输对象DrawnPolygons,其他结构如下定义:

  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. }  

三、构造空间数据客户端对象

在这里请大家讲视眼转移到本篇前面代码片段的中加粗大红字体处,会发现使用了一个名为“ToXaml()”的方法,此方法的主要功能就是实现将空间数据转换为客户端Silverlight能够识别的xaml语言标记。该方法的详细实现如下代码块所示:

  1. private string ToXaml(object polygon,string id)  
  2. {  
  3.     StringBuilder sb = new StringBuilder();  
  4.     //将数据库查询出的空间数据构造为SQL Server空间数据类型对象  
  5.     var geo = SqlGeography.STGeomFromText(  
  6.                                 new SqlChars(  
  7.                                 new SqlString(polygon.ToString())), 4326);  
  8.     //将空间数据构造为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. }  

实际上,在服务端将空间数据转化为Xaml并非实现传递空间数据到客户端并解析呈现到GIS界面的***选择,还可以将数据库空间数据处理为KML、GML等常用的其它能够表示存储地图数据的任意格式返回到客户端使用。这里为何选择将空间数据解析为Xaml语言标记的目的是为了Silverlight能够直接将Xaml语言标记解析为对应的对象,并能够直接使用。如果选择将空间数据解析为别的地图数据格式,还需要额外的解析算法去实现空间数据的解析。

四、Bing Maps客户端的实现

Bing Maps Silverlight客户端只需要调用上面提供的WCF Service接口,将空间数据查询到客户端,然后通过XamlReader的接口解析Xaml为对应的对象即可,可以在应用程序加载时就发起对接口的调用。如下代码块所示:

  1. public MainPage()  
  2. {  
  3.     InitializeComponent();  
  4.       
  5.     //调用WCF服务接口查询空间数据到客户端  
  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.         //将空间数据所构造的Xaml语言标记解析为Bing Maps Silverlight Control中的多边形(MapPolygon)对象。  
  17.         MapPolygon polygon = (MapPolygon)XamlReader.Load(e.Result[i].Xaml);  
  18.         //将多边形对象添加到地图中呈现。  
  19.         map.Children.Add(polygon);  
  20.  
  21.     }  
  22. }  

四、相关资料

[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

[5]、Bing Maps开发系列博文: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查询日 月 周 季
  3. SQL Server 2008中的代码安全
  4. SQL问题与解答:维护日志和索引
  5. SQL Servr 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/247455.html<

(0)
运维的头像运维
上一篇2025-04-27 03:18
下一篇 2025-04-27 03:19

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注