阅读:13444回复:12
SQL Server 2008空间数据应用系列【文集】 Microsoft SQL Server 2008
提供了全面性的空间支持,可让组织通过具空间功能的应用程序来无缝地取用、使用及扩展以位置为基础的数据,最后可协助用户做出更好的决策。空间分析是一项非常复杂的工作,包含一系列学术内容:地理、数学、天文、图形等。虽然在使用SQL
Server
2008的空间特性中不必要深入研究关于地理、数学、天文以及图形等学科,但如果你想在学习或者是正式的项目开发中能够很好的使用空间特性,适当和有效的掌握一些关于空间信息方面的理论概念可谓理所当然。
一、什么是空间数据 空间数据是指用来表示空间实体的位置、形状、大小及其分布特征诸多方面信息的数据,它可以用来描述来自现实世界的目标,它具有定位、定性、时间和空间关系等特性。定位是指在已知的坐标系里空间目标都具有唯一的空间位置;定性是指有关空间目标的自然属性,它伴随着目标的地理位置 ;时间是指空间目标是随时间的变化而变化;空间关系通常一般用拓扑关系表示。空间数据是一种用点、线、面以及实体等基本空间数据结构来表示人们赖以生存的自然世界的数据。
来自百度百科的定义:用于描述有关空间实体的位置、形状和相互关系的数据,以坐标和拓扑关系的形式存储。
地理服务的普遍性,和用户使用数据所采用的混合度的提高意味着这个空间信息只是合成到解决方案中的另一个组件,并且是作出更好决策和提供更高的价值服务的一个基础。SQL Server 2008通过引入新的空间数据类型提供了对地理数据的支持,你可以使用它来存储和操纵基于位置的信息,SQL server 2008中的空间支持可以帮助用户通过分析基于地理的位置数据来作出更好的决策。
二、地图上的空间数据 空间数据提供了可以在不同领域的广泛使用的信息,比如地图、地图分析、空间分析、GPS定位、车辆监控等多行业领域。这里不分别详细介绍空间数据到各个行业领域的应用,主要介绍空间数据在地图上的应用为主。实际上地图上的空间对象是很复杂且不规则的对象,通常表现为一些复杂、不规则的几何图形,使用空间数据来解释就是:“近似他们实际的形状和位置的简单、或复杂的几何形状”。
SQL Server 2008 主要支持三种类型的空间数据,用来表示空间信息的几何图形,分别为:点(Point)、线(LineString)和面(Polygon)。 1、点(Point):点是几何的基本类型,用来表示空间上的一个位置。 2、线(LineString):线条描述了空间上的两个点之间的距离,有两个端点,分别为:起止点(StartPoint)和终止点(EndPoint)。 3、面(Polygon):面用来表示空间上的一块几何区域,可以是三角形、四边形等,也可以是不规则的任意几何图形块。
在地图上的面(Polygon)通常可以在空间数据中用来表示群岛、湖泊、工厂、学校、政府、司法管理区域等一块地市区域,如下重庆市区县分布图所示:
三、坐标系统(Coordinate System) 常用的坐标系为地理坐标系(Geograpic Coordinate System,简称GCS)和投影坐标系(Projected Coordinate System,简称PCS)。
地理坐标系统(GCS)用一个三维的球面来确定地物在地球上的位置,地面点的地理坐标有经度、纬度、高程构成。地理坐标系统与选择的地球椭球体和大地基准面有关。椭球体定义了地球的形状,而大地基准面确定了椭球体的中心。地理空间中可以使用两个坐标值定义在地球表面上的任何位置,既地理经度和地理纬度,经度和纬度共同组成一个地理坐标点(Point),既:Point(latitude,longitude)。
投影坐标系统(PCS)是根据某种映射关系,将地理坐标系统中由经纬度确定的三维球面坐标投影到二维的平面上所使用的坐标系统。在该坐标系统中,点的位置是由(x,y,z)坐标来确定的。由于投影坐标是将球面展会在平面上,因此不可避免会产生变形。这些变形包括3种:长度变形、角度变形以及面积变形。通常情况下投影转换都是在保证某种特性不变的情况下牺牲其他属性。根据变形的性质可分为等角投影、等面积投影等。
四、空间参考系统 上面分别介绍了基于角坐标经度和纬度的地理坐标系统(GCS),以及使用X和Y的笛卡尔坐标的投影坐标系统(PCS)。无论是基于何种坐标系统,一组坐标始终只能表示坐标系统中的一个位置点,要想了解关于地球上的坐标系统的应用更多的知识,我们需要研究空间参考系统,既地球椭球体、基准、本初子午线、计量单位、投影等其他知识点。
地球椭球体(Ellipsoid):即等角横切椭圆柱投影。假想用一个圆柱横切于地球椭球体的某一经线上,这条与圆柱面相切的经线,称中央经线。以中央经线为投影的对称轴,将东西各3°或1°30′的两条子午线所夹经差6°或3°的带状地区按数学法则、投影法则投影到圆柱面上,再展开成平面,即高斯-克吕格投影,简称高斯投影。这个狭长的带状的经纬线网叫做高斯-克吕格投影带。
基准(Datum):大地基站设计用为最密合部分或全部大地水准面的数据模式。它由椭球体本身及椭球体和地表上一点视为原点之间关系来定义。此关系能以6个量来定义,既:经度、纬度、原点高度、原点垂线偏差之两分量及原点至某点的大地方位角。
本初子午线(Prime Meriaian):0°经线,是计算东西经度的起点。1884年国际会议决定用通过英国格林威治(Greenwich)天文台子午仪中心的经线为本初子午线。1957年后,格林尼治天文台迁移台址。1968年国际上以国际协议原点(CIO)作为地极原点,经度起点实际上不变。
计量单位(Unit):各种物理量都有它们的量度单位,并以选定的物质在规定条件显示的数量作为基本量度单位的标准,在不同时期和不同的学科中,基本量的选择何以不同。如物理学上以时间、长度、质量、温度、电流强度、发光强度、物质的量这7个物理单位为基本量,它们的单位依次为:秒、米 (单位)、千克、开尔文、安培、坎德拉、摩尔。
投影(Projection):从初中数学的角度来说,一般地,用光线照射物体,在某个平面(地面、墙壁等)上得到的影子叫做物体的投影(projection),照射光线叫做投影线,投影所在的平面叫做投影面。有时光线是一组互相平行的射线,例如太阳光或探照灯光的一束光中的光线。由平行光线形成的投影是平行投影(parallel projection).由同一点(点光源发出的光线)形成的投影叫做中心投影(center projection)。投影线垂直于投影面产生的投影叫做正投影。投影线不平行于投影面产生的投影叫做斜投影。物体正投影的形状、大小与它相对于投影面的位置和角度有关。
投影分很多种,最为常见的则为墨卡托投影,百度地图、Google
Maps、微软Bing
Maps都是基于墨卡托投影架构的。
五、参考资料 地理坐标系与投影坐标系的区别:http://www.cnblogs.com/jetz/archive/2005/03/29/127547.html 地球椭球体(Ellipsoid)、大地基准面(Datum)及地图投影(Projection)三者的基本概念 :http://wenku.baidu.com/view/061c40c7aa00b52acfc7cad1.html |
|
|
1楼#
发布于:2013-06-05 15:45
多谢楼主!!学习中,谢谢!!
|
|
|
2楼#
发布于:2011-11-28 16:44
作 者:Beniao
|
|
|
3楼#
发布于:2011-11-28 16:44
GeoRSS是一种描述和查明互联网内容所在物理位置的方法。通过使用GeoRSS,搜索Web站点或者与地理位置有关的项目就成为可能。GeoRSS利用地理标识语言(GML),即利用可扩展标记语言
(Extensible Markup Language, XML)存储和传输地理数据的方法。原始的GML模型以由World Wide
Web联盟(W3C)所开发的资源描述框架(RDF)为基础。GML保持着RDF的许多特性,包括智能代理和一个用于描述和查询数据的标准语法。
GeoRSS 是在 RSS 订阅源中包含地理空间数据时所用的一个标准,它定义了一种名为 GeoRSS GML 的特定格式,用来在订阅源中包含 GML 格式的数据。客户端应用程序可以订阅 GeoRSS 订阅源,订阅方式与订阅常规 RSS 订阅源相同。可以轻松地将 GeoRSS 格式的数据导入Microsoft Bing Maps、Google Maps中,同样也可以将空间数据库中的空间数据发布为GeoRss订阅后快速的在GIS中呈现,本篇将介绍如何基于微软Bing Maps for Silverlight中呈现GeoRss订阅的空间数据。 一、发布空间数据到GeoRss 前一篇文章《SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息》介绍了如何将空间数据通过存储过程+HTTP请求接口发布为GeoRss的具体实现,这里就一笔带过,详细请查阅上篇博文。 二、创建GeoRss阅读器 创建GeoRss阅读器的目的是为了动态的请求GeoRss地址,将GeoRss数据解析为自己想要的数据结构,如下便是根据自己的需求结合GeoRss定义的一种数据结构样例。 using System.Collections.Generic; using Microsoft.Maps.MapControl; namespace GeoRss.Map.GeoRssUtils { public class GeoRssItem { public string Title { get; set; } public string Description { get; set; } public string Link { get; set; } public string PubData { get; set; } public LocationCollection Locatios { get; set; } } } 核心原理就是使用WebClient动态的发起http请求,将返回的GeoRss数据通过Linq To XML的方式解析为对象结构的数据。其实现非常简单,不做具体分析,详细代码如下所示: using System.Collections.Generic; using System; using System.Net; using System.Xml.Linq; using System.Linq; using System.Windows; using Microsoft.Maps.MapControl; namespace GeoRss.Map.GeoRssUtils { public delegate void DownloadGeoRssCompletedEventHandler(List public delegate void DownloadGeoRssExceptionEventHandler(Exception e); public class GeoRssReader { public GeoRssReader() { wc = new WebClient(); wc.DownloadStringCompleted += WebClientDownloadGeoRssCompleted; } public GeoRssReader(Uri uri) : this() { this.uri = uri; } public GeoRssReader(Uri uri, DownloadGeoRssCompletedEventHandler evh) : this(uri) { DownloadGeoRssCompleted += evh; } public Uri uri { get; set; } public event DownloadGeoRssCompletedEventHandler DownloadGeoRssCompleted; public event DownloadGeoRssExceptionEventHandler DownloadGeoRssException; public void ReadAsync() { if (DownloadGeoRssCompleted.Target != null) { wc.DownloadStringAsync(uri); } } #region _private private readonly WebClient wc; private void WebClientDownloadGeoRssCompleted(object sender, DownloadStringCompletedEventArgs e) { try { XNamespace nsXml = "http://www.w3.org/2005/Atom"; XNamespace nsGeorss = "http://www.georss.org/georss"; XNamespace nsGeo = "http://www.w3.org/2003/01/geo/wgs84_pos#"; XNamespace nsMedia = "http://search.yahoo.com/mrss/"; var items = from item in XElement.Parse(e.Result).Descendants("item") select new GeoRssItem { Title = (item.Element("title") != null) ? item.Element("title").Value : null, Link = (item.Element("link") != null) ? item.Element("link").Value : null, Description = (item.Element("description") != null) ? item.Element("description").Value : null, PubData = (item.Element("pubDate") != null) ? item.Element("pubDate").Value : null, Locatios = ParserLocations(XElement.Parse(item.LastNode.ToString().Replace(":", "X")).Value) }; if (DownloadGeoRssCompleted.Method != null) { DownloadGeoRssCompleted.Invoke(items.ToList()); } } catch (Exception ex) { if (DownloadGeoRssException.Method != null) { DownloadGeoRssException.Invoke(ex); } else { throw; } } } private LocationCollection ParserLocations(string points) { LocationCollection lc = new LocationCollection(); string[] ps = points.Split(' '); for (int i = 0; i < ps.Length; i+=2) { lc.Add(new Location(double.Parse(ps), double.Parse(ps[i + 1]))); } return lc; } #endregion } } 三、基于SLBM呈现GeoRss数据 引入Bing Maps Silverlight Control的控件库,定义一个专门的MapLayer图层来呈现GeoRss数据,其Silverlight前台的代码如下。 CopyrightVisibility="Collapsed"> 应用程序加载的过程中使用上面所开发完成的GeoRss阅读器进行数据读取并解析,随后将结果呈现在Bing Maps Silverlight Control的应用中。代码如下: public MainPage() { InitializeComponent(); string url = "http://localhost:32484/SHBuildingGeoHandler.ashx"; GeoRssReader reader = new GeoRssReader(new Uri(url, UriKind.RelativeOrAbsolute)); reader.DownloadGeoRssCompleted+=new DownloadGeoRssCompletedEventHandler(reader_DownloadGeoRssCompleted); reader.ReadAsync(); } void reader_DownloadGeoRssCompleted(List { //System.Diagnostics.Debug.WriteLine(items.Count); foreach (var item in items) { MapPolygon mp = new MapPolygon(); mp.Locations = item.Locatios; mp.Fill = new SolidColorBrush(Colors.Red); this.mlayer.Children.Add(mp); } } ![]() 四、相关资料 [1]、数据表中使用空间数据类型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html [2]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx [3]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx [4]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx [5]、Bing Maps开发系列博文:http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html |
|
|
4楼#
发布于:2011-11-28 16:43
GeoRSS是一种描述和查明互联网内容所在物理位置的方法。通过使用GeoRSS,搜索Web站点或者与地理位置有关的项目就成为可能。GeoRSS利用地理标识语言(GML),即利用可扩展标记语言
(Extensible Markup Language, XML)存储和传输地理数据的方法。原始的GML模型以由World Wide
Web联盟(W3C)所开发的资源描述框架(RDF)为基础。GML保持着RDF的许多特性,包括智能代理和一个用于描述和查询数据的标准语法。GeoRSS 是在
RSS 订阅源中包含地理空间数据时所用的一个标准,它定义了一种名为 GeoRSS GML 的特定格式,用来在订阅源中包含 GML
格式的数据。客户端应用程序可以订阅 GeoRSS 订阅源,订阅方式与订阅常规 RSS 订阅源相同。可以轻松地将 GeoRSS 格式的数据导入Microsoft
Bing Maps、Google Maps中。
一、GeoRSS聚合格式 相信很多朋友多玩过RSS订阅的,其聚合数据的格式以XML方式承载,主要包括头信息和体信息,体信息可能是一项或多项的数据组成。以下为RSS的聚合格式: 网站或栏目的URL地址 新闻的链接地址 …… 而GeoRSS的XML数据格式和RSS几乎相同,只是在RSS的基础上使用GML扩展了对于地理空间数据的描述信息,如下GeoRSS数据。 xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" > conference. Had some great sandwiches at Joe's. If you haven't been to Cedarburg, Wisconsin, then you haven't really experienced the MidWest... ![]() 二、GeoRSS空间编码 通常有三种GeoRSS编码,既简单编码、GML编码和W3C编码。详细请查阅:http://www.georss.org/Encodings。 简单编码通常用于定义点、线、多边形等规则的空间数据,GML则通常适用于定义不规则的空间数据,如地市区域。 三、定义GeoRSS数据 定义GeoRSS数据其实主要就是在玩GeoRSS空间编码,知道如何定义点、线、多边形以及不规则的空间图形。如下GeoRSS定义了一个点(重庆)坐标。 同样的定义一条空间线段,只是使用的GeoRSS编码不同,如下定义了【成都--重庆】的空间线段示例。 四、创建GeoRSS聚合存储过程 创建GeoRSS聚合存储过程的作用就是将空间数据格式化为GeoRSS的数据格式,存储过程中实现查询空间数据,转换空间数据为GML后并构造为GeoRSS的数据输出。《SQL Server 2008空间数据应用系列九:使用空间工具(Spatial Tools)导入ESRI格式地图数据》一文中实现了将shp数据导入到SQL Server 2008中,本篇以此数据为例创建存储过程发布GeoRSS。 ![]() USE [BingMapsDB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[CQGeoRSSFeeder] AS BEGIN SET NOCOUNT ON; -- 定义XML类型变量用于存储GeoRSS内容 DECLARE @GeoRSS xml; WITH XMLNAMESPACES ( 'http://www.opengis.net/gml' AS gml, 'http://www.georss.org/georss' AS georss ) SELECT @GeoRSS = (SELECT [NAME] AS title, [NAME] AS description, 'http://www.beginningspatial.com/' + CAST([ID] AS varchar(8)) AS link, geom.AsGml() AS [georss:where] FROM CQ_Region FOR XML PATH('item'), ROOT('channel') ) /** * 使用XQuery格式化XML结果 **/ SELECT @GeoRSS.query(' xmlns:gml="http://www.opengis.net/gml"> http://www.beginningspatial.com { for $e in channel/item return { $e/link/text() } { for $child in $e/georss:where/* return if (fn:local-name($child) = "Point") then else if (fn:local-name($child) = "LineString") then else if (fn:local-name($child) = "Polygon") then else if (fn:local-name($child) = "MultiPoint") then else if (fn:local-name($child) = "MultiCurve") then else if (fn:local-name($child) = "MultiSurface") then else if (fn:local-name($child) = "MultiGeometry") then else () } } ') AS GeoRSSFeed; end 注:执行该存储过程后的就可以将表中所有的空间数据建立GeoRSS输出,输出内容比较大,这里就不贴XML结果了,随本文末的示例代码一起提供给大家下载。 五、.NET发布GeoRSS订阅 .NET服务端可以通过ASPX、ASHX等方式来发布GeoRSS订阅服务,这一步其实非常简单,就是直接调用上面的存储过程,见数据库中的空间数据以GeoRSS的数据格式输出到客户端呈现即可。以下为详细的代码实现: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.SqlClient; namespace GeoRSSService { /// /// 发布SQL Server 2008中的空间数据为GeoRSS。 /// public class GeoRSSHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.C; context.Response.Charset = "iso-8859-1"; context.Response.CacheC; context.Response.Expires = 0; SqlConnection myConn = new SqlConnection( @"server=.;database=BingMapsDB;uid=sa;pwd=beniao;"); myConn.Open(); string myQuery = "exec dbo.CQGeoRSSFeeder"; SqlCommand myCMD = new SqlCommand(myQuery, myConn); SqlDataReader myReader = myCMD.ExecuteReader(); while (myReader.Read()) { //输出GeoRSS到客户端 context.Response.Write(myReader["GeoRSSFeed"].ToString()); } myReader.Close(); myConn.Close(); } public bool IsReusable { get { return false; } } } } ![]() 六、相关资料 [1]、RSS官网:http://www.georss.org/georss [2]、RSS简介:http://baike.baidu.com/view/1644.htm [3]、GML简介:http://baike.baidu.com/view/609279.htm |
|
|
5楼#
发布于:2011-11-28 16:42
geography 和geometry数据类型包括以用于在OGC中所定义的地理数据的已知文本(Well Known Text,WKT)和已知二进制(Well
Known Binary,WKB)格式导入和导出数据的方法,还包括普遍使用的地理标示语言(Geographic Markup
Language,GML)格式,这使得很容易从支持这些格式的数据源导入地理数据。地理数据很容易从一些政府和商业数据源获得,并且可以相对容易地从许多现有的GIS应用程序和GPS系统中导出。Microsoft保持与一些第三方GIS供应商和地理数据解决方案供应商的紧密关系,这帮助确保SQL
server 2008和广泛的行业标准工具间的强大兼容能力,以用于导入、导出和操纵空间数据。
通常我们开发一个GIS应用,基于GIS做数据分布呈现、统计汇总、搜索等等的功能,几乎都离不开地图数据的支持,一方面是作为地图呈现需要,其次是为了方便做空间分析等诸多功能。而对于空间数据的需求,通常不需要自己去建立空间数据,市面上有许多非常成熟的地图数据可以直接被采购使用,并以此为基础直接建立基于地图空间数据的GIS应用。另外网上也提供了比较多的空间数据免费下载资源,可以轻松的获取到空间数据。本篇将使用SQL空间工具(SqlSpatialTools) 介绍ESRI地图空间数据(shpfile)导入到SQL Server 2008的实现。
一、SQL空间数据导入工具(Shape2SQL) SharpGIS发布了一个专门用来导入ESRI地图空间数据(shpfile)的工具,可以非常简单的实现将shpfile的地图数据文件中的空间数据导入到SQL Server 2008中,可以通过如下地址下载该工具。 SQL空间工具下载地址:http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx
该工具的运行环境需要微软.NET Framewrok 3.5和Microsoft SQL Server System CLR Types。使用该工具通过简单的可视化界面即可连接上SQL Server 2008的数据库服务器,目前该工具仅仅只支持几种常用的主流空间类型数据,包括:Point 、MultiPoint、(Multi)Polygon 和 (Multi)LineStrings 。详细可访问:http://www.sharpgis.net/page/Shape2SQL.aspx
二、SQL空间数据查询工具(SqlSpatial-Query-Tool) SQL Server 2008空间数据查询工具可以直接连接到SQL Server 2008数据库服务器,实现空间数据的查询,可视化界面呈现。详细可访问:http://www.sharpgis.net/page/SqlSpatial-Query-Tool.aspx
三、导入Shpfile地图空间数据 如本文篇前的截图,使用SQL空间导入工具实现将ESRI的shpfile地图空间数据导入SQL Server 2008其实非常简单,在导入的时候注意表名和SRID就可以了,其他的可以不用管。如下图演示了将重庆市的大区边界地图数据导入到SQL Server 2008中。
四、查询空间数据 实现可以查询可以在SQL Server Management Studio中执行对表(CQ_Region)的的全表查询,于空间结果选项中可以看到如下图所示的空间呈现效果。 另外还可以使用空间查询工具实现SQL Server 2008中的空间数据查询,Spatial Query Tools查询出的空间输入结果如下所示。
五、空间计算支持 数据库里面有了空间数据,就可以给予数据展开空间计算、统计、分析等给力的功能实现,与GIS客户端结合来完成各种简单、负责的空间计算、分析。如下SQL演示了计算上面导入的重庆大界区的地图的地理面积计算。 select geom.STArea() from CQ_Region WHERE ID=1; select geom.STArea() from CQ_Region WHERE ID=2 select geom.STArea() from CQ_Region WHERE ID=3; select geom.STArea() from CQ_Region WHERE ID=4; select SUM(geom.STArea()) from CQ_Region;
六、相关资料 [1]、KML规范:http://www.opengeospatial.org/standards/kml/ [2]、Google KML文档简介:http://code.google.com/intl/zh-CN/apis/kml/documentation/ [3]、空间工具(Spatial Tools): http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx |
|
|
6楼#
发布于:2011-11-28 16:41
对于标准的地理空间数据可以通过数据导入的方式将其存放到数据库中(后续文章将详细介绍),对于一些非标准的空间数据或者说是一个软件产品中的业务空间数据,则需要通过人为或其他方式将其存储进数据库,本篇将以如何在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 { IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), name, polygontext, identity); identity = ((System.Nullable return ((int)(result.ReturnValue)); } 如上实现了Linq To Sql对存储过程的调用,接下来就是创建WCF服务提供给Silverlight调用。 [ServiceContract] public interface IDrawService { /// /// 保存多边形对象到空间数据库 /// /// /// /// [OperationContract] int? SavePolygon(string name, List } 在WCF服务的详细实现中将Bing Maps客户端传递过来的参数构造为空间数据类型的WKT文本格式,通过上面的存储过程就可以直接将WKT转化为空间数据类型直接入库。 public class DrawService : IDrawService { public int? SavePolygon(string name, List { 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 for (int i = 0; i < lc.Count; i++) { polygon.Add(new MapPoint { Longitude = lc.Longitude, Latitude = lc.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 |
|
|
7楼#
发布于:2011-11-28 16:41
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 { var sql = "SELECT * FROM [DrawnPolygons]"; var result = Query(sql); List if (result != null ;; result.Rows.Count > 0) { areas = new List 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(" 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 service.QueryPolygonsAsync(); } private void service_QueryPolygonsCompleted(object sender, QueryPolygonsCompletedEventArgs e) { if (e.Error != null) return; for (int i = 0; i < e.Result.Count; i++) { //将空间数据所构造的Xaml语言标记解析为Bing Maps Silverlight Control中的多边形(MapPolygon)对象。 MapPolygon polygon = (MapPolygon)XamlReader.Load(e.Result.Xaml); //将多边形对象添加到地图中呈现。 map.Children.Add(polygon); } } ![]() 四、相关资料 [1]、数据表中使用空间数据类型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html [2]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx [3]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx [4]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx [5]、Bing Maps开发系列博文:http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html |
|
|
8楼#
发布于:2011-11-28 16:40
Microsoft
.NET应用通常都是宿主在操作系统平台的.NET Framework之上,如果想在SQL Server 2008中使用.NET进行托管代码,SQL Server
2008将运行一个属于自己的.NET Framewrok平台运行环境(SQLOS),SQLOS和.NET CLR将共享数据库引擎进程空间,因此基于SQL
Server 2008的CLR也被称为的SQLCLR。基于SQL Server 2008的核心组件SQLCRL提供了友好的的可编程性支持,SQL Server数据库引擎将使用由CLR提供的功能无缝地提供了多种功能,其中包括使用空间数据类型goegraphy和goemetry的数据的可编程性支持。 一、SQLCLR ; .NET CLR互编程性 可以在SQL Server 2008的安装目录下找到SQLCLR与.NET CLR共享的空间数据类型共享库组件(Microsoft.SqlServer.Types.dll),该组件除了支持基于SQL Server 2008的空间数据类型数据库编程,同时也支持基于.NET Framework的面向对象编程,包括对VB.NET、C#的多语言的支持,该组件位于如下安装目录中: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll 通过下面这个示例程序可以演示基于Microsoft.SqlServer.Types.dll在SQLCLR和.NET CLR之间的双向互支持性。 SQLCLR:定义一个地理坐标点 declare @geom geometry; set @geom = geometry::Point(107.04352,28.870554,4326); select @geom; ----------------------------------------------------------------------------------- .NET CLR:定义一个地理坐标点 static void Main(string[] args) { var point = SqlGeometry.Point(107.04352, 28.870554, 4326); Console.WriteLine(point.STX); Console.WriteLine(point.STY); Console.WriteLine(point.ToString()); } 在.NET CLR中可以使用所有SQLCLR编程中所提供的编程接口,也就是说在.NET CLR中变成不仅仅只是局限于再空间对象的定义上,还包括对象的相关属性、方法的支持,如下代码块演示了SQLCLR和.NET CLR编程实现地理测距函数的对比。 declare @geom geometry; set @geom = geometry::Point(107.04352,28.870554,4326); declare @end geometry; set @end = geometry::Point(103.84041, 29.170240,4326); select @geom.STDistance(@end); ------------------------------------------------------------------------ var pointStart = SqlGeometry.Point(107.04352, 28.870554, 4326); var pointEnd = SqlGeometry.Point(103.84041, 29.170240, 4326); var result = pointStart.STDistance(pointEnd); Console.WriteLine("地理距离:" + result + "(米)"); 关于空间对象的属性、函数的具体使用这里就不做介绍了,详细请查阅:几何实例上的OGC方法。 二、创建空间对象到数据库 Microsoft.SqlServer.Types.dll提供友好的.NET CLR编程性,同样我们可以将在.NET CLR中创建的对象插入到空间数据库中进行查询,以便于做空间分析、计算。下面演示通过.NET CLR构造一个多边形空间对象并插入到SQL Server 2008数据库中。 static void Main(string[] args) { //定义一个多边形 var polygon = SqlGeography.STGeomFromText( new SqlChars( new SqlString("POLYGON ((-114.01611328125 42.0003251483162, -114.0380859375 42.0003251483162," + "-113.994140625 37.0200982013681, -109.05029296875 37.0200982013681, -109.09423828125 41.0130657870063, " + "-111.07177734375 41.0462168145206, -111.07177734375 42.0003251483162, -114.01611328125 42.0003251483162))", 111)), 4326); var sql = "insert Cities (CityName,CityLocation) values ('test','" + polygon.ToString() + "')"; InsertToDB(sql); } private static void InsertToDB(string sql) { using (var conn = new SqlConnection(ConfigurationManager.AppSettings["SQL2008"])) { if (conn.State == ConnectionState.Closed) conn.Open(); using (var cmd = new SqlCommand(sql, conn)) { int row = cmd.ExecuteNonQuery(); } } } 三、查询数据库空间数据 首先来看看基于SQL Server Management Studio 查询刚刚入库的记录,通过空间结果可以直接预览查询结果。 declare @city geometry; select @city = CityLocation from Cities where ID=5; select @city; select @city.STArea() as 面积;--求面积 --------------------------------------------------------------------------------------------------------------------------------------- 0x000000000104080000000000000008815CC035B18AA70A0045400000000070825CC035B18AA70A00454000000000A07F5CC0CECAEE93928242400000000038435BC0CECAEE93928242400000000008465BC0BCF1C323AC8144400000000098C45BC01572BD6EEA8544400000000098C45BC035B18AA70A0045400000000008 (1 行受影响) 面积 ---------------------- 22.6802255629445 (1 行受影响) ![]() 同样可以使用.NET CLR对其进行编程实现,这其实和查询普通数据是没有区别的,只是将查询结果转为为的是空间数据类型。可以通过如下代码实现查询空间数据到应用程序中。 static void Main(string[] args) { var sql = "select CityLocation from Cities where ID = 5"; var result = QueryDB(sql); var polygon = SqlGeography.STGeomFromText( new SqlChars( new SqlString(result)), 4326); Console.WriteLine(polygon.ToString()); } private static string QueryDB(string sql) { using (var conn = new SqlConnection(ConfigurationManager.AppSettings["SQL2008"])) { if (conn.State == ConnectionState.Closed) conn.Open(); using (var cmd = new SqlCommand(sql, conn)) { return cmd.ExecuteScalar().ToString(); } } } 本篇就大概介绍到这里,经常内容请关注后续系列博文,下一篇将介绍微软Bing Maps与空间数据的亲密接触,敬请期待~~~~ 四、相关资料 [1]、数据表中使用空间数据类型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html [2]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx [3]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx [4]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx |
|
|
9楼#
发布于:2011-11-28 16:40
通过前面几篇文章介绍了关于SQL Server 2008中空间数据类型相关的知识点,了解到了什么是空间数据,什么是空间数据类型,如何在SQL中变成定义基础的空间对象实例,这些知识点主要是为了后续学习空间数据应用和做地理空间分析做准备。本篇将继续介绍SQL Server 2008中空间数据类型的应用知识点,主要介绍如何在数据表中使用空间数据类型列,如何存储空间数据到空间数据类型,以及如何查询、预览空间数据等相关知识点。
选择使用空间数据类型,意味着必须在SQL数据表中添加空间数据类型列以存储空间数据。通常有两种情况: 1、创建一张带有空间数据类型的新表。 2、向已有数据表中添加空间数据类型列字段。
一、创建空间数据类型新表 创建一个带有空间数据类型的新表和创建普通的表基本没有区别,唯一的不同就是使用了空间数据类型字段。以下SQL演示了创建带有空间数据类型的数据表: CREATE TABLE [Cities] ( [ID] [int] IDENTITY(1,1) NOT NULL, [CityName] [varchar](255) NOT NULL, [CityLocation] [geometry] NOT NULL ) GO
二、添加空间数据类型到已有表 向已有表中添加空间数据类型列和普通表添加新的列是一样的,同样使用alter table xxx add yyy datatype命令完成。下面代码演示了向刚创建的新表添加一空间数据类型字段: --向已有表中添加空间数据类型字段 ALTER TABLE [Cities] ADD geo geography GO
三、为空间数据类型列制定空间引用标识(SRID) 任何空间数据类型字段都可以向其指派相应的空间引用标识(SRID),部分空间数据类型字段还是必须制定SRID的。实现对空间数据类型列指派SRID也非常简单,SQL提供了指派命令来完成,下面的SQL命令演示了给上面新添加的空间数据类型指派SRID的实现。 --指派空间数据类型列的SRID ALTER TABLE [Cities] ADD CONSTRAINT [enforce_srid_geographycolumn] CHECK (geo.STSrid = 4326) GO
四、插入空间数据到空间数据类型字段 插入数据导表格中同样使用“insert into table.....”语法实现,不同的是插入空间数据的时候需要对数据进行格式化处理才能被成功的插入到空间数据类型列。针对于两种(geography和geometry)空间数据类型,系统提供了专门的空间格式化语法来处理,比如通过将WKT文本插入到空间数据列,可以使用geometry::STGeomFromText()或者geography::STGeomFromText()函数来对WKT文本进行空间数据类型格式转化。 insert into Cities (CityName,CityLocation) values ('chongqing',geometry::STGeomFromText('POLYGON ((107.04352 28.870554, 107.043891 28.873231......)',4326));
注:上面SQL代码块实现了将重庆市区区域WKT格式的空间数据插入到Cities表的CityLocation字段中,由于WKT内用太长,代码段中对其进行了截取。
四、查询空间数据类型数据 查询空间数据和普通的数据查询几乎没有区别,同样使用“select xxx from table where x=y”的方式实现数据查询。下面SQL命令演示了查询刚刚插入的数据记录: select * from Cities; 同样可以使用系统函数将查询出的空间结果转化为WKT文本格式输出,下面的SQL命令详细演示了改功能函数的使用: --转换空间数据为WKT文本 DECLARE @chongqing geometry; select @chongqing = CityLocation from Cities where ID=1; select @chongqing as 重庆市; select @chongqing.ToString() as 重庆市; select @chongqing.STAsText() as 重庆市; --WKT
五、相关资料 [1]、空间数据库(百度百科):http://baike.baidu.com/view/1194566.htm [2]、使用空间数据实现位置智能:http://tech.ddvip.com/2008-04/120816526343873.html [3]、基础空间对象(MSDN):http://msdn.microsoft.com/de-de/library/bb964711.aspx [4]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx [5]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx [6]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx [7]、扩展静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933805.aspx |
|
|