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

一、创建空间数据表

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

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

二、编写入库存储过程

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

  1. SET ANSI_NULLS ON 
  2. GO  
  3. SET QUOTED_IDENTIFIER ON 
  4. GO  
  5. CREATE PROCEDURE [dbo].[SavePolygon]  
  6.     (  
  7.     @name varchar(50),  
  8.     @polytext varchar(max),  
  9.     @identity int OUTPUT 
  10.     )  
  11. AS 
  12.     INSERT INTO    dbo.DrawnPolygons  
  13.                 (Name,Polygon)   
  14.     VALUES        (@name, geography::STPolyFromText(@polytext, 4326))  
  15.     SET @identity = @@Identity  
  16.       
  17.     RETURN 

三、编写服务接口

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

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

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

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

  1. [ServiceContract]  
  2. public interface IDrawService  
  3. {  
  4.     ///   
  5.     /// 保存多边形对象到空间数据库  
  6.     ///   
  7.     ///  name="name">  
  8.     ///  name="arrayOfLatLong">  
  9.     /// <returns> returns>  
  10.     [OperationContract]  
  11.     int? SavePolygon(string name, List  arrayOfLatLong);  

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

  1. public class DrawService : IDrawService  
  2. {  
  3.     public int? SavePolygon(string name, List  arrayOfLatLong)  
  4.     {  
  5.         var sb = new StringBuilder();  
  6.         sb.Append("POLYGON ((");  
  7.  
  8.         for (var i = arrayOfLatLong.Count; i >= 1; i--)  
  9.         {  
  10.             var j = i - 1;  
  11.             sb.Append(arrayOfLatLong[j].Longitude.ToString());  
  12.             sb.Append(" ");  
  13.             sb.Append(arrayOfLatLong[j].Latitude.ToString());  
  14.             sb.Append(",");  
  15.         }  
  16.  
  17.         sb.Remove(sb.Length - 1, 1);  
  18.         sb.Append("))");  
  19.  
  20.         int? identity = 0;  
  21.  
  22.         var connectionString = ConfigurationManager.ConnectionStrings["Sql08ConnectionString"].ConnectionString;  
  23.         BMPTSDataContext ctx = new BMPTSDataContext(connectionString);  
  24.         ctx.SavePolygon("西南大区", sb.ToString(), ref identity);  
  25.  
  26.         return identity;  
  27.     }  

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

  1. ///   
  2. /// 地图坐标点(经度,纬度)  
  3. ///   
  4. [DataContract]  
  5. public class MapPoint  
  6. {  
  7.     [DataMember]  
  8.     public double Latitude { get; set; }  
  9.     [DataMember]  
  10.     public double Longitude { get; set; }  
  11.  
  12.     public MapPoint() { }  
  13.     public MapPoint(double lat, double lng)  
  14.     {  
  15.         this.Latitude = lat;  
  16.         this.Longitude = lng;  
  17.     }  

四、Bing Maps客户端的实现

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

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

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

  1. private void btnSave_Click(object sender, RoutedEventArgs e)  
  2. {  
  3.     LocationCollection lc = this._drawLine.Locations;  
  4.  
  5.     ObservableCollection  polygon = new ObservableCollection ();  
  6.     for (int i = 0; i < lc.Count; i++)  
  7.     {  
  8.         polygon.Add(new MapPoint { Longitude = lc[i].Longitude, Latitude = lc[i].Latitude });  
  9.     }  
  10.  
  11.     //调用WCF接口实现数据入库  
  12.     DrawServiceClient client = new DrawServiceClient();  
  13.     client.SavePolygonAsync(this.tbName.Text.Trim(), polygon);  
  14.     client.SavePolygonCompleted += client_SavePolygonCompleted;  
  15. }  
  16.  
  17. private void client_SavePolygonCompleted(object sender, SavePolygonCompletedEventArgs e)  
  18. {  
  19.     if (e.Error != null)  
  20.     {  
  21.         this.tbResult.Text = e.Result.Value > 0 ? "保存成功!" : "保存失败";  
  22.     }  

五、数据库中的空间数据

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

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

 

 

 

六、相关资料

[1]、Geography数据类型:http://msdn.microsoft.com/zh-cn/library/cc280766.aspx

[2]、地域实例上的OGC方法:http://msdn.microsoft.com/zh-cn/library/bb933917.aspx

[3]、地理实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933968.aspx

[4]、OGC静态地理方法:http://msdn.microsoft.com/zh-cn/library/bb933988.aspx

[5]、扩展静态地理方法:http://msdn.microsoft.com/zh-cn/library/bb933921.aspx

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

【编辑推荐】

  1. 日志真没想象的那么简单
  2. 用SQL查询日 月 周 季
  3. SQL Server 2008中的代码安全
  4. SQL问题与解答:维护日志和索引
  5. SQL Servr 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现

 

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

(0)
运维的头像运维
上一篇2025-04-21 13:45
下一篇 2025-04-21 13:46

相关推荐

  • 个人主题怎么制作?

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

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

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

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

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

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

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

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

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

    2025-11-20
    0

发表回复

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