关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » SQL Server »SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight

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

    2011-03-22 15:10:00 出处:ITJS
    分享

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

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

    在《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  {      /// 

         /// 保存多边形对象到空间数据库      ///       /// 

    name="name">      /// 

    name="arrayOfLatLong">      /// <returns>returns>      [OperationContract]      int  SavePolygon(string name, List arrayOfLatLong);  }  在WCF服务的详细实现中将Bing Maps客户端传递过来的参数构造为空间数据类型的WKT文本格式,通过上面的存储过程就可以直接将WKT转化为空间数据类型直接入库。

    public class DrawService : IDrawService  {      public int  SavePolygon(string name, List 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的详细定义如下代码块:

    /// 

     /// 地图坐标点(经度,纬度)  ///   
    [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 polygon = new ObservableCollection();      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]   

     

    六、相关资料

    [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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    帝国CMS7.5编辑器上传图片取消宽高的三种方法

    帝国cms如何自动生成缩略图的实现方法

    Windows 12即将到来,将彻底改变人机交互

    帝国CMS 7.5忘记登陆账号密码怎么办?可以phpmyadmin中重置管理员密码

    帝国CMS 7.5 后台编辑器换行,修改回车键br换行为p标签

    Windows 11 版本与 Windows 10比较,新功能一览

    Windows 11激活产品密钥收集及专业版激活方法

    IT头条

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    严重缩水!NVIDIA将推中国特供RTX 5090 DD:只剩24GB显存

    00:17

    无线路由大厂 TP-Link突然大裁员:补偿N+3

    02:39

    Meta 千万美金招募AI高级人才

    00:22

    技术热点

    微软已修复windows 7/windows 8.1媒体中心严重漏洞 用户可下载安

    卸载MySQL数据库,用rpm如何实现

    windows 7中使用网上银行或支付宝支付时总是打不开支付页面

    一致性哈希算法原理设计

    MySQL数字类型中的三种常用种类

    如何解决SQL Server中传入select语句in范围参数

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。