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

原文: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脚本。

CREATE TABLE DrawnPolygons(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [Polygon] [geography] NOT NULL)
GO

  

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

         

 

二、编写数据服务接口

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

private DataTable Query(string sql)
{
    string cstring = ConfigurationManager.ConnectionStrings["BingMapsDB"].ConnectionString;
    SqlConnection conn = new SqlConnection(cstring);
    if (conn.State == ConnectionState.Closed) conn.Open();
    SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);
    DataSet ds = new DataSet();
    adapter.Fill(ds);
    return ds.Tables[0];
}

 

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

[OperationContract]
public List<DrawnPolygons> QueryPolygons()
{
    var sql = "SELECT  * FROM [DrawnPolygons]";

    var result = Query(sql);
    List<DrawnPolygons> areas = null;
    if (result != null && result.Rows.Count > 0)
    {
        areas = new List<DrawnPolygons>();
        foreach (DataRow row in result.Rows)
        {
            areas.Add(new DrawnPolygons
            {
                ID = int.Parse(row["ID"].ToString()),
                Name = row["NAME"].ToString(),
                Xaml = ToXaml(row["Polygon"], row["ID"].ToString())
            });
        }
    }
    return areas;
}

 

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

[DataContract]
public class DrawnPolygons
{
    [DataMember]
    public int ID { get; set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Xaml { get; set; }
}

 

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

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

private string ToXaml(object polygon,string id)
{
    StringBuilder sb = new StringBuilder();
    //将数据库查询出的空间数据构造为SQL Server空间数据类型对象
    var geo = SqlGeography.STGeomFromText(
                                new SqlChars(
                                new SqlString(polygon.ToString())), 4326);
    //将空间数据构造为Bing Maps图形(多边形)对象的Xaml文本,以返回到客户端直接解析Xaml为Silverlight程序中的对象。
    for (int j = 1; j <= geo.NumRings(); j++)
    {
        if (geo.RingN(j).STNumPoints() > 1)
        {
            sb.Append("<m:MapPolygon xmlns:m=\"clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl\"");
            sb.Append(" Fill=\"Red\" Locations=\"");
            for (int k = 1; k <= geo.RingN(j).STNumPoints(); k++)
            {
                if (k > 1) sb.Append(" ");
                sb.Append(String.Format("{0:0.#####},{1:0.#####}", 
                    (double)geo.RingN(j).STPointN(k).Lat, 
                    (double)geo.RingN(j).STPointN(k).Long));
            }
            sb.AppendLine("\"/>");
        }
    }
           
    return sb.ToString();
}

 

 

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

 

四、Bing Maps客户端的实现

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

public MainPage()
{
    InitializeComponent();
    
    //调用WCF服务接口查询空间数据到客户端
    DataServiceClient service = new DataServiceClient();
    service.QueryPolygonsCompleted += new EventHandler<QueryPolygonsCompletedEventArgs>(service_QueryPolygonsCompleted);
    service.QueryPolygonsAsync();
}

private void service_QueryPolygonsCompleted(object sender, QueryPolygonsCompletedEventArgs e)
{
    if (e.Error != null) return;

    for (int i = 0; i < e.Result.Count; i++)
    {
        //将空间数据所构造的Xaml语言标记解析为Bing Maps Silverlight Control中的多边形(MapPolygon)对象。
        MapPolygon polygon = (MapPolygon)XamlReader.Load(e.Result[i].Xaml);
        //将多边形对象添加到地图中呈现。
        map.Children.Add(polygon);

    }
}

 

       

 

四、相关资料

  [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

 

版权说明

  本文属原创文章,欢迎转载且注明文章出处,其版权归作者和博客园共有。为了保存作者的创作热情,请在转载后的明显位置标记本文出处。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

时间: 2024-10-27 10:47:27

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

SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储

原文: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.具有

SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性

原文: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 S

SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案

原文:SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的GIS专业理论知识. 5.

SQL Server 2008空间数据应用系列一:空间信息基础

原文:SQL Server 2008空间数据应用系列一:空间信息基础 Microsoft SQL Server 2008 提供了全面性的空间支持,可让组织通过具空间功能的应用程序来无缝地取用.使用及扩展以位置为基础的数据,最后可协助用户做出更好的决策.空间分析是一项非常复杂的工作,包含一系列学术内容:地理.数学.天文.图形等.虽然在使用SQL Server 2008的空间特性中不必要深入研究关于地理.数学.天文以及图形等学科,但如果你想在学习或者是正式的项目开发中能够很好的使用空间特性,适当和有

SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初子午线.计量单位.投影等相关理论知识,我们可以使用这些空间参照系统组件来定义一系列应用于地球空间上的几何图像来表示地理空间中的特定功能,表示着地球上一个一个特定的位置点. 本篇主要介绍地理空间索引的概念以及微软SQL Server 2008 R2中的空间索引的应用.   一.空间索引 空间索引是指依

SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应的GIS专业理论知识. 5.其他相关知识.     SQL S

SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识.   通过前面几篇文章介

在SQL Server 2008中使用空间数据实现位置智能

1. 导言 现今的信息工作人员和消费者处理大量不同类型的信息,从电子表格和数据库中的商业数据的传统数 据表,到在线的基于媒体的数据例如视频.照片和音乐.近来朝向mash up解决方案(mash up解决方案是 指合并从多个来源获得的信息和内容来创建通用的在线应用程序)发展的趋势表明计算机用户使用高度集 成的解决方案来利用它们可用的大量信息. 同时,技术优势导致地理服务和设备的发展,包括在线绘制地图解决方案,例如Microsoft Virtual Earth,和较便宜的全球定位系统(GPS)解决方

SQL Server 2008空间数据使用教程

  在你的应用程序中采用位置智能 业务和消费者的不断发展快速的形成了大量的数据和增强的数字地图的有效性,而空间化应用程序创建了一个空前的机遇,它将地理要素合并到设计中去进行处理和分析. Microsoft SQL Server 2008推出了全面的空间支持,使得公司可以通过采用了空间技术的应用程序无缝的消耗.使用和扩展基于本地的数据,这应用程序最终帮助终端用户作更好的决策. 全面的空间支持 利用SQL Server 2008中对空间数据的支持将空间能力添加到你的应用程序中. · 使用测地学和平面