原文: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)中动态绘制的多边形图形数据到空间数据列。

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 ONGOSET QUOTED_IDENTIFIER ONGOCREATE 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]

        

六、相关资料

  [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

七、示例代码下载

  

版权说明

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

作      者:Beniao

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

SQL Server 2008空间数据应用系列八:基于Bing Maps(Silverlight)的空间数据存储的更多相关文章

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

    原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft ...

  2. SQL SERVER 2008中使用VARBINARY(MAX)进行图像存取的实现方法

          在数据库应用项目开发中,经常会使用一些二进制的图像数据,存储和读取显示图像数据主要采用的是路径链接法和内存流法.路径链接法是将图像文件保存在固定的路径下,数据库中只存储图像文件的路径和名称 ...

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

    原文:SQL Server 2008空间数据应用系列六:基于SQLCRL的空间数据可编程性 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 ...

  4. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. ...

  5. SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据

    原文:SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Se ...

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

    原文:SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Serv ...

  7. SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息

    原文:SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2 ...

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

    原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...

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

    原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...

随机推荐

  1. 逻辑数据库设计 - 需要ID(谈主键Id)

    本文的目标就是要确认那些使用了主键,却混淆了主键的本质而造成的一种反模式. 一.确立主键规范 每个了解数据库设计的人都知道,主键对于一张表来说是一个很重要,甚至必需的部分.这确实是事实,主键是好的数据 ...

  2. ADO.Net对Oracle数据库的操作【转载】

    一 ADO.Net简介 访问数据库的技术有许多,常见的有一下几种:开放数据库互联(ODBC).数据访问对象(DAO).远程数据对象 (RDO). ActiveX数据对象(ADO).我们今天主要要学习A ...

  3. Android setTextColor无效_安卓setTextColor()的参数设置方式

    通过代码setTextColor时.如果color是一个资源文件 会set失败 没有效果 遇到这样的情况有两种解决办法.亲测过.两种都是有效的 一.注解方式 通过在方法上面添加注解解决问题 代码如下 ...

  4. 【转】如何在ubuntu12.04设置adb驱动

    原文网址:http://www.xuebuyuan.com/1475698.html 在ubuntu上adb驱动不用像在windows上一样需要额外装,只需要写一个配置文件就可以,下面是设置的步骤: ...

  5. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  6. Java Fuck Bignumber

    为了熟悉java , 开一套poj大数处理的题来写. ------------------------------------------------------------------- A: (1 ...

  7. Android面试题07

    62. 说说mvc模式的原理,它在android中的运用. MVC英文即Model-View-Controller,即把一个应用的输入.处理.输出流程按照Model.View.Controller的方 ...

  8. Linux Java的环境变量搭建

    JAVA JDK:http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载完后,解压完并将其中的jdk文件夹移动到/u ...

  9. Ajax 介绍

    Ajax的关键技术:  异步处理数据 使用XHTML(HTML)和CSS构建标准化的展示层 使用DOM(document object model)进行动态显示和交互 使用XML和XSLT进行数据交换 ...

  10. Hibernate(五)——面向对象查询语言和锁

    Hibernate做了数据库中表和我们实体类的映射,使我们不必再编写sql语言了.但是有时候查询的特殊性,还是需要我们手动来写查询语句呢,Hibernate框架为了解决这个问题给我们提供了HQL(Hi ...