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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

 在《SQL Servr 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现》一文中介绍了如何基于Bing Maps呈现SQL Server 2008中存储的空间数据,对于标准的地理空间数据可以通过数据导入的方式将其存放到数据库中(后续文章将详细介绍),对于一些非标准的空间数据或者说是一个软件产品中的业务空间数据,则需要通过人为或其他方式将其存储进数据库,本篇将以如何在Bing Maps(Silverlight)中动态绘制多边图形然后将其存储到SQL Server 2008的空间数据列中为例,详细介绍如何实现自定义图形存储入库的实现方式和原理。

 

一、创建空间数据表

  首先创建空间数据类型字段表,以存储在Bing Maps(Silverlight)中动态绘制的多边形图形数据到空间数据列。

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

 

二、编写入库存储过程

  目前Linq To Sql和ASP.NET Entity Framework都不支持SQL Server 2008的空间数据类型,前台只能通过字符串或者对象的形式将数据传递到后台服务端,然后通过调用存储过程,在存储过程中对空间数据的字符串进行空间数据对象转换,然后入库。针对上面所创建的空间数据表可以创建如下存储过程来实现多边形空间数据的入库存储。

SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
CREATE   PROCEDURE   [ dbo ] . [ SavePolygon ]
    (
    
@name   varchar ( 50 ),
    
@polytext   varchar ( max ),
    
@identity   int  OUTPUT
    )
AS
    
INSERT   INTO     dbo.DrawnPolygons
                (Name,Polygon) 
    
VALUES         ( @name , geography::STPolyFromText( @polytext 4326 ))
    
SET   @identity   =   @@Identity
    
    
RETURN

 

三、编写服务接口

  入库接口可以采用WebService或者WCF技术提供,本篇采用WCF作为数据操作接口技术,Linq To Sql做数据访问,自定义方法调用存储过程实现数据库入库操作。

 

  在项目中添加Linq To Sql文件,然后打开对于的代码隐藏文件,在Linq To Sql自动生产的创建数据库连接的代码下面添加如下自定义方法实现数据库存储过程的调用。

[Function(Name  =   " dbo.SavePolygon " )]
public   int  SavePolygon([Parameter(DbType  =   " VarChar(50) " )]  string  name, 
                    [Parameter(DbType 
=   " VarChar(MAX) " )]  string  polygontext, 
                    [Parameter(DbType 
=   " Int " )]  ref  System.Nullable < int >  identity)
{
    IExecuteResult result 
=   this .ExecuteMethodCall( this , ((MethodInfo)(MethodInfo.GetCurrentMethod())), name, polygontext, identity);
    identity 
=  ((System.Nullable < int > )(result.GetParameterValue( 2 )));
    
return  (( int )(result.ReturnValue));
}

 

  如上实现了Linq To Sql对存储过程的调用,接下来就是创建WCF服务提供给Silverlight调用。

[ServiceContract]
public   interface  IDrawService
{
    
///   <summary>
    
///  保存多边形对象到空间数据库
    
///   </summary>
    
///   <param name="name"></param>
    
///   <param name="arrayOfLatLong"></param>
    
///   <returns></returns>
    [OperationContract]
    
int ?  SavePolygon( string  name, List < MapPoint >  arrayOfLatLong);
}

 

  在WCF服务的详细实现中将Bing Maps客户端传递过来的参数构造为空间数据类型的WKT文本格式,通过上面的存储过程就可以直接将WKT转化为空间数据类型直接入库。

public   class  DrawService : IDrawService
{
    
public   int ?  SavePolygon( string  name, List < MapPoint >  arrayOfLatLong)
    {
        var sb 
=   new  StringBuilder();
        sb.Append(
" POLYGON (( " );

        
for  (var i  =  arrayOfLatLong.Count; i  >=   1 ; i -- )
        {
            var j 
=  i  -   1 ;
            sb.Append(arrayOfLatLong[j].Longitude.ToString());
            sb.Append(
"   " );
            sb.Append(arrayOfLatLong[j].Latitude.ToString());
            sb.Append(
" , " );
        }

        sb.Remove(sb.Length 
-   1 1 );
        sb.Append(
" )) " );

        
int ?  identity  =   0 ;

        var connectionString 
=  ConfigurationManager.ConnectionStrings[ " Sql08ConnectionString " ].ConnectionString;
        BMPTSDataContext ctx 
=   new  BMPTSDataContext(connectionString);
        ctx.SavePolygon(
" 西南大区 " , sb.ToString(),  ref  identity);

        
return  identity;
    }
}

 

  接口中使用的数据传输对象MapPoint的详细定义如下代码块:

///   <summary>
///  地图坐标点(经度,纬度)
///   </summary>
[DataContract]
public   class  MapPoint
{
    [DataMember]
    
public   double  Latitude {  get set ; }
    [DataMember]
    
public   double  Longitude {  get set ; }

    
public  MapPoint() { }
    
public  MapPoint( double  lat,  double  lng)
    {
        
this .Latitude  =  lat;
        
this .Longitude  =  lng;
    }
}

 

四、Bing Maps客户端的实现

  客户端的实现非常简单,首先创建Silverlight应用程序并添加Bing Maps Silverlight Control开发组件的引用,其次在界面中添加Map对象以显示Bing Maps原型界面,最后可以设计一个小的工具面板,以按钮的方式驱动触发绘制多边形的行为,以及保存图形到数据库的命令请求。如下界面效果:  

        

 

  对于绘制多边形的算法这里鉴于篇幅限制就不一一贴出来了,详细可通过文末提供的代码下载链接下载本文的示例代码。比如限制绘制一个【成都-重庆-贵阳-昆明】这四个城市组成的西南大区多变型图形,并将其图形数据以空间数据的形式存储到SQL Server 2008中。图形如下图所示:

        

 

  通过点击“保存数据”按钮则将地图界面绘制的图形数据取出来构造为数组传递到WCF服务接口,调用数据库存储过程实现数据入库操作,下面是保存按钮的代码实现。

private   void  btnSave_Click( object  sender, RoutedEventArgs e)
{
    LocationCollection lc 
=   this ._drawLine.Locations;

    ObservableCollection
< MapPoint >  polygon  =   new  ObservableCollection < MapPoint > ();
    
for  ( int  i  =   0 ; i  <  lc.Count; i ++ )
    {
        polygon.Add(
new  MapPoint { Longitude  =  lc[i].Longitude, Latitude  =  lc[i].Latitude });
    }

    
// 调用WCF接口实现数据入库
    DrawServiceClient client  =   new  DrawServiceClient();
    client.SavePolygonAsync(
this .tbName.Text.Trim(), polygon);
    client.SavePolygonCompleted 
+=  client_SavePolygonCompleted;
}

private   void  client_SavePolygonCompleted( object  sender, SavePolygonCompletedEventArgs e)
{
    
if  (e.Error  !=   null )
    {
        
this .tbResult.Text  =  e.Result.Value  >   0   ?   " 保存成功! "  :  " 保存失败 " ;
    }
}

 

五、数据库中的空间数据

  当通过Bing Maps中动态绘制多边形图形对象,然后将图形数据通过WCF服务接口入库保存后,可以通过SQL Server Management Studio查询并在空间数据结果中直接预览结果。

SELECT   [ ID ] , [ Name ] , [ Polygon ]   FROM   [ dbo ] . [ DrawnPolygons ]

 





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

相关实践学习
使用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
目录
相关文章
|
14天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
30 0
|
3月前
|
SQL 关系型数据库 数据库
数据库空间之谜:彻底解决RDS for SQL Server的空间难题
【8月更文挑战第16天】在管理阿里云RDS for SQL Server时,合理排查与解决空间问题是确保数据库性能稳定的关键。常见问题包括数据文件增长、日志文件膨胀及索引碎片累积。利用SQL Server的动态管理视图(DMV)可有效监测文件使用情况、日志空间及索引碎片化程度。例如,使用`sp_spaceused`检查文件使用量,`sys.dm_db_log_space_usage`监控日志空间,`sys.dm_db_index_physical_stats`识别索引碎片。同时,合理的备份策略和文件组设置也有助于优化空间使用,确保数据库高效运行。
69 2
|
3月前
|
SQL 存储 NoSQL
从SQL到NoSQL:理解不同数据库类型的选择与应用——深入比较数据模型、扩展性、查询语言、一致性和适用场景,为数据存储提供全面决策指南
【8月更文挑战第31天】在信息技术飞速发展的今天,数据库的选择至关重要。传统的SQL数据库因其稳定的事务性和强大的查询能力被广泛应用,而NoSQL数据库则凭借其灵活性和水平扩展性受到关注。本文对比了两种数据库类型的特点,帮助开发者根据应用场景做出合理选择。SQL数据库遵循关系模型,适合处理结构化数据和复杂查询;NoSQL数据库支持多种数据模型,适用于非结构化或半结构化数据。SQL数据库在一致性方面表现优异,但扩展性较差;NoSQL数据库则设计之初便考虑了水平扩展性。SQL使用成熟的SQL语言,NoSQL的查询语言更为灵活。
68 0
|
5月前
|
SQL 存储 Oracle
sql数据库恢复空间不足
当SQL数据库恢复时遇到空间不足的问题,这通常意味着目标系统上的磁盘空间不足以容纳整个数据库或其恢复过程中的某个阶段。以下是一些建议的解决步骤: 1. **检查磁盘空间**: - 使用系
|
6月前
|
SQL 存储 关系型数据库
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
Presto【实践 01】Presto查询性能优化(数据存储+SQL优化+无缝替换Hive表+注意事项)及9个实践问题分享
648 0
|
SQL 存储 关系型数据库
大数据数据存储的数据库的关系型数据库之SQL Server
在大数据领域中,数据存储是一个至关重要的环节。而数据库作为常用的数据存储方式,在各种数据处理场景中扮演着不可或缺的角色。本文将介绍SQL Server关系型数据库的基本概念、特点和使用方法,希望能够为大家提供一些参考和帮助。
163 2
|
SQL 关系型数据库 数据库
解决 RDS SQL Server 日志空间增长问题
解决 RDS SQL Server 日志空间增长问题
|
SQL Oracle 关系型数据库
Oracle 临时表空间 SQL语句
以下总结了关于 Oracle 数据库临时表空间的相关 SQL 语句:
|
SQL 缓存 监控
【巡检问题分析与最佳实践】RDS SQL Server 空间使用问题
实例的空间使用率是RDS SQL Server用户日常需要重点关注的监控项之一。如果实例的存储空间完全打满,将会导致严重的影响,包括:数据库无法写入、数据库备份无法正常完成、存储空间扩容任务的执行耗时可能更长等。
【巡检问题分析与最佳实践】RDS SQL Server 空间使用问题
|
SQL 关系型数据库 数据库
RDS for SQL server 空间问题排查汇总
SQL server的空间问题一直有客户在询问,今天就给大家汇总讲解下SQL server 的全部空间开销
RDS for SQL server 空间问题排查汇总