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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

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

 





本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/520943,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
6天前
|
SQL 人工智能 自然语言处理
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
|
1月前
|
存储 SQL
物料清单应用输入模板的SQL存储过程设计
物料清单应用输入模板的SQL存储过程设计
|
3月前
|
SQL Oracle 关系型数据库
Oracle PL/SQL基础知识及应用案例
Oracle PL/SQL基础知识及应用案例
33 0
|
4月前
|
SQL 关系型数据库 C语言
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
45 0
|
4月前
|
SQL 关系型数据库 数据库
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
47 0
|
存储 SQL 程序员
【Sql Server】存储过程通过作业定时执行按天统计记录
通过前两篇文章的学习,我们已经对创建表、存储过程、作业等功能点有所了解 本次将结合前面所学习的知识点,创建统计表以及结合作业定时按天以及实时统计域名各个长度的记录值
301 0
【Sql Server】存储过程通过作业定时执行按天统计记录
|
9月前
|
存储 SQL 数据库
SQL Server——为什么要使用存储过程?不使用是什么样的?
提高数据库执行速度,可能第一次见到这句话的小伙伴们感觉到非常的匪夷所思叭!怎么就提高了它的执行速度捏,从哪方面可以表现出来呢?既然这里要说到的是为什么要使用存储过程,也就是说它的优点是什么。那我们肯定就要对使用和不使用存储过程两方面来进行对比才能看出它的优点对吧。
|
12月前
|
存储 SQL Go
SQL Server 存储过程
SQL Server 存储过程
117 0
|
SQL 存储 数据可视化
【Sql Server】存储过程通过定时执行添加记录作业
通过上篇了解了什么是存储过程,创建存储过程的方法,以及调用存储过程的方法 本次将通过数据库中的作业功能,进行定时执行存储过程,这样就可以完成我们刚开始假设的场景
449 0
|
SQL 存储 安全
【Sql Server】存储过程的创建和调用,随机添加域名记录
假设有这样一个场景 创建一个储存过程A,它执行添加一条随机产生3到8位长度的域名记录,通过定时器T1每隔1秒执行一次存储过程A 创建另一个存储过程B,它执行统计域名的长度3到8的记录数,通过定时器T2每隔1秒执行一次存储过程B
151 0
【Sql Server】存储过程的创建和调用,随机添加域名记录