gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:12382回复:12

SQL Server 2008空间数据应用系列【文集】

楼主#
更多 发布于:2011-11-28 16:35
<font size="4"> Microsoft SQL Server 2008
提供了全面性的空间支持,可让组织通过具空间功能的应用程序来无缝地取用、使用及扩展以位置为基础的数据,最后可协助用户做出更好的决策。空间分析是一项非常复杂的工作,包含一系列学术内容:地理、数学、天文、图形等。虽然在使用SQL
Server
2008的空间特性中不必要深入研究关于地理、数学、天文以及图形等学科,但如果你想在学习或者是正式的项目开发中能够很好的使用空间特性,适当和有效的掌握一些关于空间信息方面的理论概念可谓理所当然。

</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">一、什么是空间数据</font></strong></p><font size="4">
</font><p><font size="4">  空间数据是指用来表示空间实体的位置、形状、大小及其分布特征诸多方面信息的数据,它可以用来描述来自现实世界的目标,它具有定位、定性、时间和空间关系等特性。定位是指在已知的坐标系里空间目标都具有唯一的空间位置;定性是指有关空间目标的自然属性,它伴随着目标的地理位置
;时间是指空间目标是随时间的变化而变化;空间关系通常一般用拓扑关系表示。空间数据是一种用点、线、面以及实体等基本空间数据结构来表示人们赖以生存的自然世界的数据。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  来自</font><a href="http://baike.baidu.com/view/125911.htm"><font color="#1a8bc8" size="4">百度百科</font></a><font size="4">的定义:用于描述有关空间实体的位置、形状和相互关系的数据,以坐标和拓扑关系的形式存储。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  地理服务的普遍性,和用户使用数据所采用的混合度的提高意味着这个空间信息只是合成到解决方案中的另一个组件,并且是作出更好决策和提供更高的价值服务的一个基础。SQL
Server 2008通过引入新的空间数据类型提供了对地理数据的支持,你可以使用它来存储和操纵基于位置的信息,SQL server
2008中的空间支持可以帮助用户通过分析基于地理的位置数据来作出更好的决策。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">二、地图上的空间数据</font></strong></p><font size="4">
</font><p><font size="4">  空间数据提供了可以在不同领域的广泛使用的信息,比如地图、地图分析、空间分析、GPS定位、车辆监控等多行业领域。这里不分别详细介绍空间数据到各个行业领域的应用,主要介绍空间数据在地图上的应用为主。实际上地图上的空间对象是很复杂且不规则的对象,通常表现为一些复杂、不规则的几何图形,使用空间数据来解释就是:“近似他们实际的形状和位置的简单、或复杂的几何形状”。</font></p><font size="4">
</font><p><font size="4">         <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/PointLineStringPolygon.jpg" width="521" height="199"/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  SQL Server 2008
主要支持三种类型的空间数据,用来表示空间信息的几何图形,分别为:点(Point)、线(LineString)和面(Polygon)。</font></p><font size="4">
</font><p><font size="4">  1、点(Point):点是几何的基本类型,用来表示空间上的一个位置。</font></p><font size="4">
</font><p><font size="4">  2、线(LineString):线条描述了空间上的两个点之间的距离,有两个端点,分别为:起止点(StartPoint)和终止点(EndPoint)。</font></p><font size="4">
</font><p><font size="4">  3、面(Polygon):面用来表示空间上的一块几何区域,可以是三角形、四边形等,也可以是不规则的任意几何图形块。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  在地图上的面(Polygon)通常可以在空间数据中用来表示群岛、湖泊、工厂、学校、政府、司法管理区域等一块地市区域,如下重庆市区县分布图所示:</font></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/CQ_County_region.jpg"/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">三、坐标系统(Coordinate System)</font></strong></p><font size="4">
</font><p><font size="4">  常用的坐标系为地理坐标系(Geograpic Coordinate System,简称GCS)和投影坐标系(Projected Coordinate
System,简称PCS)。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  地理坐标系统(GCS)用一个三维的球面来确定地物在地球上的位置,地面点的地理坐标有经度、纬度、高程构成。地理坐标系统与选择的地球椭球体和大地基准面有关。椭球体定义了地球的形状,而大地基准面确定了椭球体的中心。地理空间中可以使用两个坐标值定义在地球表面上的任何位置,既地理经度和地理纬度,经度和纬度共同组成一个地理坐标点(Point),既:Point(latitude,longitude)。</font></p><font size="4">
</font><p><font size="4">         </font></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/Projected.jpg" width="768" height="253"/></font></p><font size="4">
</font><p><font size="4">  投影坐标系统(PCS)是根据某种映射关系,将地理坐标系统中由经纬度确定的三维球面坐标投影到二维的平面上所使用的坐标系统。在该坐标系统中,点的位置是由(x,y,z)坐标来确定的。由于投影坐标是将球面展会在平面上,因此不可避免会产生变形。这些变形包括3种:长度变形、角度变形以及面积变形。通常情况下投影转换都是在保证某种特性不变的情况下牺牲其他属性。根据变形的性质可分为等角投影、等面积投影等。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">四、空间参考系统</font></strong></p><font size="4">
</font><p><font size="4">  上面分别介绍了基于角坐标经度和纬度的地理坐标系统(GCS),以及使用X和Y的笛卡尔坐标的投影坐标系统(PCS)。无论是基于何种坐标系统,一组坐标始终只能表示坐标系统中的一个位置点,要想了解关于地球上的坐标系统的应用更多的知识,我们需要研究空间参考系统,既地球椭球体、基准、本初子午线、计量单位、投影等其他知识点。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  </font><a href="http://baike.baidu.com/view/1559032.html"><font color="#1a8bc8" size="4">地球椭球体(Ellipsoid)</font></a><font size="4">:即等角横切椭圆柱投影。假想用一个圆柱横切于地球椭球体的某一经线上,这条与圆柱面相切的经线,称中央经线。以中央经线为投影的对称轴,将东西各3°或1°30′的两条子午线所夹经差6°或3°的带状地区按数学法则、投影法则投影到圆柱面上,再展开成平面,即高斯-克吕格投影,简称高斯投影。这个狭长的带状的经纬线网叫做高斯-克吕格投影带。
</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  </font><a href="http://baike.baidu.com/view/742311.htm"><font color="#1a8bc8" size="4">基准(Datum)</font></a><font size="4">:大地基站设计用为最密合部分或全部大地水准面的数据模式。它由椭球体本身及椭球体和地表上一点视为原点之间关系来定义。此关系能以6个量来定义,既:经度、纬度、原点高度、原点垂线偏差之两分量及原点至某点的大地方位角。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  </font><a href="http://baike.baidu.com/view/9786.htm"><font color="#1a8bc8" size="4">本初子午线(Prime
Meriaian)</font></a><font size="4">:0°经线,是计算东西经度的起点。1884年国际会议决定用通过英国格林威治(Greenwich)天文台子午仪中心的经线为本初子午线。1957年后,格林尼治天文台迁移台址。1968年国际上以国际协议原点(CIO)作为地极原点,经度起点实际上不变。
</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  </font><a href="http://baike.baidu.com/view/535902.htm"><font color="#1a8bc8" size="4">计量单位(Unit)</font></a><font size="4">:各种物理量都有它们的量度单位,并以选定的物质在规定条件显示的数量作为基本量度单位的标准,在不同时期和不同的学科中,基本量的选择何以不同。如物理学上以时间、长度、质量、温度、电流强度、发光强度、物质的量这7个物理单位为基本量,它们的单位依次为:秒、米
(单位)、千克、开尔文、安培、坎德拉、摩尔。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  </font><a href="http://baike.baidu.com/view/550991.htm"><font color="#1a8bc8" size="4">投影(Projection)</font></a><font size="4">:从初中数学的角度来说,一般地,用光线照射物体,在某个平面(地面、墙壁等)上得到的影子叫做物体的投影(projection),照射光线叫做投影线,投影所在的平面叫做投影面。有时光线是一组互相平行的射线,例如太阳光或探照灯光的一束光中的光线。由平行光线形成的投影是平行投影(parallel
projection).由同一点(点光源发出的光线)形成的投影叫做中心投影(center
projection)。投影线垂直于投影面产生的投影叫做正投影。投影线不平行于投影面产生的投影叫做斜投影。物体正投影的形状、大小与它相对于投影面的位置和角度有关。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  投影分很多种,最为常见的则为</font><a href="http://baike.baidu.com/view/301981.htm"><font color="#1a8bc8" size="4">墨卡托投影</font></a><font size="4">,</font><a href="http://map.baidu.com/"><font color="#1a8bc8" size="4">百度地图</font></a><font size="4">、</font><a href="http://maps.google.com/"><font color="#1a8bc8" size="4">Google
Maps</font></a><font size="4">、微软</font><a href="http://cn.bing.com/ditu/?FORM=Z9LH3"><font color="#1a8bc8" size="4">Bing
Maps</font></a><font size="4">都是基于墨卡托投影架构的。<br/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">五、参考资料</font></strong></p><font size="4">
</font><p><font size="4">  百度百科:</font><a href="http://baike.baidu.com/"><font color="#1a8bc8" size="4">http://baike.baidu.com/</font></a></p><font size="4">
</font><p><font size="4">  地理坐标系与投影坐标系的区别:</font><a href="http://www.cnblogs.com/jetz/archive/2005/03/29/127547.html"><font color="#1a8bc8" size="4">http://www.cnblogs.com/jetz/archive/2005/03/29/127547.html</font></a></p><font size="4">
</font><p><font size="4">    地球椭球体(Ellipsoid)、大地基准面(Datum)及地图投影(Projection)三者的基本概念 :</font><a href="http://wenku.baidu.com/view/061c40c7aa00b52acfc7cad1.html"><font color="#1a8bc8" size="4">http://wenku.baidu.com/view/061c40c7aa00b52acfc7cad1.html</font></a></p>
喜欢0 评分0
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
1楼#
发布于:2011-11-28 16:37
<font size="4"> 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体、基准、本初子午线、计量单位、投影等相关理论知识,我们可以使用这些空间参照系统组件来定义一系列应用于地球空间上的几何图像来表示地理空间中的特定功能,表示着地球上一个一个特定的位置点。
本篇主要介绍地理空间索引的概念以及微软SQL Server 2008 R2中的空间索引的应用。
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">一、空间索引</font></strong></p><font size="4">
</font><p><font size="4">  空间索引是指依据空间对象的位置和形状或空间对象之间的某种空间关系按一定的顺序排列的一种数据结构,其中包含空间对象的概要信息。作为一种辅助性的空间数据结构,空间索引介于空间操作算法和空间对象之间,它通过筛选作用,大量与特定空间操作无关的空间对象被排除,从而提高空间操作的速度和效率。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  来至</font><a href="http://baike.baidu.com/view/1346795.htm"><font color="#1a8bc8" size="4">百科</font></a><font size="4">的定义:为便于空间目标的定位及各种空间数据操作,按要素或目标的位置和形状或空间对象之间的某种空间关系来组织和存储数据的结构。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  关于更多空间索引的知识点需要深入了解EPSG和SRID,本文主要介绍基于微软SQL Server
2008的空间数据特性实现介绍,故不详细介绍这些基础理论知识点,有兴趣的可以访问文末的推荐资料链接,了解更多关于EPSG核SRID的相关知识。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  SQL Server 2008中的空间数据类型作为CLR系统类型来执行。SQL Server
2008增加了数据库中的CLR类型的最大规模,提高了原来在SQL Server
2005中的8000字节的限制,这使得它可以存储非常复杂的空间数据元素,例如通过许多点定义的多边形。通过在关系表中存储空间数据,SQL Server 2008
使得可以结合空间数据到其他任何商业数据类型中去;这消除了对维护一个单独的只用于空间数据存储的维护要求,并使得可以做高性能查询,它不需要结合从多个外部来源获得的数据。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  在SQL Server 2008中对空间索引的支持进一步增强了对空间数据的查询操作。你可以用一个集成在SQL
Server数据库引擎中的适合的多级网格索引来检索空间数据。空间索引包含一个基于网格的层级,在其中每一级索引又细分为由上一级所定义的网格区域。下图为官方给出的一个空间索引的概率模型图:</font></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://img.ddvip.com/2008_04/1208165249_ddvip_3497.jpg" width="331" height="398"/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  SQL
Server查询优化器会作出基于成本的决策,决定对给定的查询使用哪种索引,并且因为空间索引是数据库引擎的一个完整部分,可以作出关于是否使用特殊的空间索引的基于成本的决策,就像其它索引一样。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">二、SQL Server 2008的空间参考系统</font></strong></p><font size="4">
</font><p><font size="4">  微软SQL Server
2008的空间系统表(实际上是一个系统视图)"sys.spatial_reference_systems"中存储了详细的支持所有大地测量空间参考系统标准,该表中的每一行数据对应于一个唯一的空间参考系统,可以基于这些空间参考系统在SQL
Server 2008中来定义任何形式的空间数据。</font></p><font size="4">
</font><div class="cnblogs_code"><font size="4">
</font><div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><font size="4"><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 128, 128);">*</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> sys.spatial_reference_systems</span></font></div></div><font size="4">
</font><p><font size="4">   <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SRID0.jpg" width="956" height="290"/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  系统表“sys.spatial_reference_systems”中实际上仅仅只是存储了应用于SQL Server
2008中地理参照坐标的参考系统,除了空间参考系统可以使用这张表中列出的参考系统标准,也可以基于这些标准来定义基于任何地理投影的空间数据。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4"> 三、空间参照文本格式(WKT)</font></strong></p><font size="4">
</font><p><font size="4">  Well-Known Text (WKT) Representation of Spatial Reference
Systems:顾名思义用众所周知的文字形式来描述看见坐标参考系统,它与EPSG(2005年已经换名)的坐标文字表述模型一致。WKT字符串应用于确定空间参考系统的组成部分的描述,其定义主要包含以下10项内容:</font></p><font size="4">
</font><p><font size="4">  1、一个总体的坐标系名</font></p><font size="4">
</font><p><font size="4" face="宋体">  2、一个地理图形坐标系统名<br/>  3、一个基准面定义<br/>  4、一个椭球体的名字。长半轴(semi-major
axis)和反扁率(inverse flattening)<br/>  5、本初子午线(prime
meridian)名和其与格林威治子午线的偏移值<br/>  6、投影方法类型(如横轴莫卡托)<br/>  7、投影参数列表(如中央经线等)<br/>  8、一个单位的名称和其到米和弧度单位的转换参数<br/>  9、轴线的名称和顺序<br/>  10、在预定义的权威坐标系中的编码(如EPSG)</font></p><font size="4">
</font><p><font face="宋体"></font><font size="4"> </font></p><font size="4">
</font><div class="cnblogs_code"><font size="4">
</font><div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><span style="color: rgb(0, 0, 255);"><font size="4">select</font></span><font size="4"><span style="color: rgb(0, 0, 0);"> well_known_text <br/>    </span><span style="color: rgb(0, 0, 255);">from</span></font><font size="4"><span style="color: rgb(0, 0, 0);"> sys.spatial_reference_systems <br/>        </span><span style="color: rgb(0, 0, 255);">where</span><span style="color: rgb(0, 0, 0);"> authorized_spatial_reference_id</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(128, 0, 0); font-weight: bold;">4326</span></font><font size="4"><span style="color: rgb(0, 0, 0);"> <br/>            </span><span style="color: rgb(128, 128, 128);">and</span><span style="color: rgb(0, 0, 0);"> authority_name</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">EPSG</span><span style="color: rgb(255, 0, 0);">'</span></font></div></div><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  基于sys.spatial_reference_systems表定义了多种不同的空间参照系统的WKT描述,如上SQL语句查询出的是我们平时在地图应用开发中使用最多的EPSG:4326空间参照系统标准,则对于的WKT如下:</font></p><font size="4">
</font><div class="cnblogs_code"><font size="4">
</font><div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><font size="4"><span style="color: rgb(0, 0, 0);">GEOGCS</span><span style="color: rgb(255, 0, 0);">[</span></font><font size="4"><span style="color: rgb(255, 0, 0);">"WGS 84", <br/>        DATUM["World Geodetic System 1984", <br/>        ELLIPSOID["WGS 84", 6378137, 298.257223563</span><span style="color: rgb(255, 0, 0);">]</span></font><font size="4"><span style="color: rgb(0, 0, 0);">], <br/>        PRIMEM</span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">"Greenwich", 0</span><span style="color: rgb(255, 0, 0);">]</span></font><font size="4"><span style="color: rgb(0, 0, 0);">, <br/>        
UNIT</span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">"Degree", 0.0174532925199433</span><span style="color: rgb(255, 0, 0);">]</span></font><span style="color: rgb(0, 0, 0);"><br/><font size="4">      ]</font></span></div></div><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  以上KWT字符串确定了EPSG:4326空间参照系统的组成部分元素描述,其主要使用了四种空间配置,分别为:基准(Datum)、椭圆(Ellipsoid)、本初子午线(Primem)和Unit(计量单位)。关于这些空间参考系统参数在上一篇文中中介绍过,这里就不在做重复介绍,以上KWT字符串表述的意思大致是这样的:“WGS
84坐标系,采用1984年订立的世界地理坐标系统标准,地理标准半径为:6378137........”。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">四、SQL Server 2008的空间索引</font></strong></p><font size="4">
</font><p><font size="4">  SQL Server 2008 引入了对空间数据和空间索引的支持。“空间索引”是一种扩展索引,允许您对空间列编制索引。空间列是包含空间数据类型(如
geometry 或 geography)数据的表列。本节中的主题介绍了空间索引。 </font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  在 SQL Server 2008 中,空间索引(存储在:sys.spatial_indexes表中)使用 B 树构建而成,也就是说,这些索引必须按
B 树的线性顺序表示二维空间数据。因此,将数据读入空间索引之前,SQL Server 2008
先实现对空间的分层均匀分解。索引创建过程会将空间分解<em></em>成一个四级“网格层次结构”<em></em>。这些级别指的是“第 1
级”<em></em>(顶级)、“第 2 级”<em></em>、“第 3 级”<em></em>和“第 4 级”<em></em>。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  每个后续级别都会进一步分解其上一级,因此上一级别的每个单元都包含下一级别的整个网格。在给定级别上,所有网格沿两个轴都有相同数目的单元(例如 4x4 或
8x8),并且单元的大小都相同。下图显示了网格层次结构每个级别的右上角单元被分解成 4x4
网格的情况。事实上,所有单元都是以这种方式分解的。因此,以此为例,将一个空间分解成四个级别的 4x4 网格际上会总共产生 65,536
个第四级单元。针对空间索引进行的空间分解与应用程序数据使用的度量单位无关。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><a href="http://images.cnblogs.com/cnblogs_com/TerryFeng/WindowsLiveWriter/SQLServer2008_E241/untitled.png"><font color="#1a8bc8" size="4">        <img style="border: 0px="0px"  currentColor; display: inline;" title="untitled" border="0" alt="untitled" src="http://images.cnblogs.com/cnblogs_com/TerryFeng/WindowsLiveWriter/SQLServer2008_E241/untitled_thumb.png" width="429" height="216"/></font></a><font size="4"> </font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  网格层次结构的单元是利用多种 Hilbert 空间填充曲线以线性方式编号的。然而,出于演示目的,这里使用的是简单的按行编号,而不是由 Hilbert
曲线实际产生的编号。在下图中,几个表示建筑物的多边形和表示街道的线已经放进了一个 4x4 的 1 级网格中。第 1 级单元的编号为 1 到
16,编号从左上角的单元开始。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><a href="http://images.cnblogs.com/cnblogs_com/TerryFeng/WindowsLiveWriter/SQLServer2008_E241/untitle22d.png"><font color="#1a8bc8" size="4">        <img style="border: 0px="0px"  currentColor; display: inline;" title="untitle22d" border="0" alt="untitle22d" src="http://images.cnblogs.com/cnblogs_com/TerryFeng/WindowsLiveWriter/SQLServer2008_E241/untitle22d_thumb.png" width="412" height="266"/></font></a><font size="4"> </font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  沿网格轴的单元数目确定了网格的“密度”<em></em>:单元数目越大,网格的密度越大。例如,8x8 网格(产生 64 个单元)的密度就大于 4x4
网格(产生 16 个单元)的密度。网格密度是以每个级别为基础定义的。网格配置单元数目低 :4X4 =16,中8X8 = 64,高16X16
=256,默认设置所有级别都为 <strong>中</strong>。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  您可以通过指定非默认的网格密度控制分解过程。例如,在不同级别指定不同网格密度对于基于索引空间的大小和空间列中的对象来优化索引可能非常有用。空间索引的网格密度显示在
sys.spatial_index_tessellations 目录视图的 level_1_grid、level_2_grid、level_3_grid 和
level_4_grid 列中。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  将索引空间分解成网格层次结构后,空间索引将逐行读取空间列中的数据。读取空间对象(或实例)的数据后,空间索引将为该对象执行“分割过程”<em></em>。分割过程<em></em>通过将对象与其接触的网格单元集(“接触单元”<em></em>)相关联使该对象适合网格层次结构。从网格层次结构的第
1 级开始,分割过程以“广度优先”<em></em>方式对整个级别进行处理。在可能的情况下,此过程可以连续处理所有四个级别,一次处理一个级别。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  注:以上内容截取SQL Server 2008帮助文档,详细请查看联机帮助文档。<br/> </font></p><font size="4">
</font><p><strong><font size="4">五、相关资料</font></strong></p><font size="4">
</font><p><font size="4">  [1]、EPSG:</font><a href="http://en.wikipedia.org/wiki/European_Petroleum_Survey_Group"><font color="#1a8bc8" size="4">http://en.wikipedia.org/wiki/European_Petroleum_Survey_Group</font></a></p><font size="4">
</font><p><font size="4">  [2]、SRID:</font><a href="http://en.wikipedia.org/wiki/SRID"><font color="#1a8bc8" size="4">http://en.wikipedia.org/wiki/SRID</font></a></p><font size="4">
</font><p><font size="4">  [3]、WKT:</font><a href="http://en.wikipedia.org/wiki/Well-known_text"><font color="#1a8bc8" size="4">http://en.wikipedia.org/wiki/Well-known_text</font></a></p><font size="4">
</font><p><font size="4">  [4]、空间索引概论:</font><a href="http://www.cnblogs.com/terryfeng/archive/2009/05/27/1490803.html"><font color="#1a8bc8" size="4">http://www.cnblogs.com/terryfeng/archive/2009/05/27/1490803.html</font></a></p>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
2楼#
发布于:2011-11-28 16:37
<font size="4">  友情提示,您阅读本篇博文的先决条件如下:
  1、本文示例基于Microsoft SQL Server 2008 R2调测。<br/>
  2、具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。<br/>
  3、熟悉或了解Microsoft SQL Server 2008中的空间数据类型。<br/>
  4、具备相应的GIS专业理论知识。<br/>
  5、其他相关知识。<br/>

<br/>

 <br/>
   SQL Server
2008为大地测量空间数据提供了geography数据类型,为平面空间数据提供了geometry数据类型。这两个都是Microsoft .NET
Framework通用语言运行时(CLR)类型,并且可以用来存储不同种类的地理元素,例如点、线和多边形。这两个数据类型都提供了你可以用来执行空间操作的属性和方法,例如计算位置间的距离和找出两者间交叉的地理特性(例如一条河流经一个城镇)。本篇以SQL
Server 2008的数据类型为核心内容,介绍其数据类型的支持以及新的空间数据类型的相关特性及基本应用。 <br/>
         <img border="0" alt="" src="http://www.microsoft.com/taiwan/sql2008/graphics/homepage/PublishingImages/scrn-planar-model.jpg" width="220" height="162"/><img border="0" alt="" src="http://www.microsoft.com/taiwan/sql2008/graphics/homepage/PublishingImages/scrn-geodetic-model.jpg" width="220" height="215"/><img border="0" alt="" src="http://www.microsoft.com/taiwan/sql2008/graphics/homepage/PublishingImages/scrn-spatial-dataframework.jpg" width="220" height="171"/><br/>
 <br/>
一、SQL Server 2008通用数据类型<br/>
  在SQL Server 2008中的每个变量,参数都会被定义为一个特定的数据类型,这些特定的数据类型主要用于排序、存储等,在SQL Server
2008中的通用数据类型和SQL Server 2005一样,主要的几个通用数据类型为下表所示:<br/>  
通用数据类型






数据类型
描述

char
固定长度字符串

datetime
日期时间类型字段

float
单精度字段

int
整型字段

money
货币类型

nvarchar
可变长字符型
 <br/>
二、SQL Server 2008空间数据类型<br/>
   SQL Server
2008中出了兼容低版本的SQL数据库的通用数据类型和其他基础数据类型(比如:real、text等类型),新推出了两个用于支持空间数据存储的空间数据类型,分别为:大地向量空间类型(geography)和几何平面向量空间类型(geometry)。<br/>
 <br/>
  1、geography数据类型<br/>
  官方定义:geography数据类型为空间数据提供了一个由经度和纬度联合定义的存储结构。使用这种数据的典型用法包括定义道路、建筑、或者地理特性如可以覆盖到一个光栅图上的向量数据,它考虑了地球的弯曲性,或者计算真实的圆弧距离和空中传播轨道,而这些在一个平面模型中所存在的固有失真引起的错误程度是不可接受的。<br/>
 <br/>
  2、geometry数据类型<br/>
  官方定义:geometry数据类型为空间数据提供了一个存储结构,它是由任意平面上的坐标定义的。这种数据通常是用在区域匹配系统中的,例如由美国政府制定的州平面系统,或者是不需要考虑地球弯曲性的地图和内层布置图。geometry
数据类型提供了与开放地理空间联盟(OGC)Simple Features Specification for
SQL标准结合的属性和方法,使得你可以对geometry数据执行操作以产生行业标准的行为。<br/>
       <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SDataTypeMap.jpg"/><br/>
 <br/>
  虽然这两个数据类型都可以用于存储空间数据,在针对不同的空间数据的时候还是有所异同。如果我们需要自己基于SQL Server
2008来做空间数据定义,就需要根据不同的数据在这两种空间数据类型中作出正确的决策了,这点在以后的博文中会进行介绍,这里飘过。此两种空间类型是完美符合空间参照系统标准制定的,包括测距计量单位、空间引用索引、授权标准以及WKT等规范,如下SQL可查看对于空间数据类型所对于的空间引用索引标准中制定的地理空间测距计量单位:<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->SELECT<br/>  unit_of_measure<br/>FROM<br/>  sys.spatial_reference_systems<br/>WHERE<br/>  authority_name = 'EPSG'<br/>  AND<br/>  authorized_spatial_reference_id = 4326<br/>------------------------------------------------------------<br/>执行结果:metre
 <br/>
 三、空间数据的存储方式<br/>
   SQL Server
2008中的两种空间数据:大地向量空间类型(geography)和几何平面向量空间类型(geometry)都是可变长度的数据类型,这意味着它们相对于比如int或者datetime等固定长度的数据类型,其存储的数据占用空间根据所存储数据的复杂程度、数据描述文字等不同可自适应数据类型的长度变化。<br/>
 <br/>
  空间数据类型字段的数据存储以8个字节的二进制格式存储,每条记录的数据的头部分就被定义好了空间数据的类型(点、线、面等类型),以及所使用的空间参考系统和地理坐标(经度、纬度)等值。通常情况下二进制数据内容越长所占用的空间数据存储空间就越大。<br/>
 <br/>
四、空间数据可视化<br/>
  在 SQL Server
2008 中Microsoft 引入具有两个新的内置数据类型、 几何图形和地理空间数据支持。 尽管您可能
“ 看到 ” 数据空间列的二进制数据存储但还是不能直观的反应出空间数据的预览效果, SQL Server 2008 的SQL Server Management
Studio 中提供了一个空间结果选项卡,专门用于可视化预览空间数据结果。<br/>
 <br/>
  比如当前执行查询重庆大区边界的空间数据,那么对应于重庆大区边界数据库表可以执行以下SQL:<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->SELECT [ID]<br/>      ,[CODE]<br/>      ,[ELEV]<br/>      ,[NAME]<br/>      ,[geom]<br/>  FROM [BingMapsDB].[dbo].[CQ_Area_region]
 <br/>
  得到相应的SQL查询记录结果和空间可视化结果为下图所示:<br/>
  <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SpdView.jpg" width="550" height="450"/>    <br/>
   <br/>
五、参考资料<br/>
  [1]、空间数据(百度百科):http://baike.baidu.com/view/125911.htm<br/>
  [2]、空间数据可视化:http://msdn.microsoft.com/zh-cn/magazine/ee335706.aspx<br/>
 <br/>
</font>
[此贴子已经被作者于2011-11-28 16:38:12编辑过]
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
3楼#
发布于:2011-11-28 16:40
 <br/>



SQL Server 2008中支持的7种基础空间对象实例,分别为:点(Point)、点集合(MultiPoint
)、线(LineString)、线集合(MultiLineString)、多边形(Polygon
)、多边形集合(MultiPolygon)和空间集合(GeometryCollection)。本篇意在为大家介绍SQL Server
2008空间数据库系统组成部分中的基础空间对象以及系统内置的相关函数API,并就这些开发API进行介绍基于SQL Server
2008空间数据库系统的开发与应用。<br/>
  <br/>
一、点(Point)<br/>
  在 SQL Server 空间数据中,Point 是表示单个位置的零维对象,可能包含 Z(仰角)和
M(度量)值。可以通过下面SQL创建一个点的示例,默认该点的SRID(空间引用标识)为0。<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->DECLARE @p geometry;<br/>SET @p = geometry::Parse('POINT(30.6666587469201 104.062021177233)');<br/>select @p.STX AS X;<br/>select @p.STY AS Y;
 <br/>
  如下SQL命令这创建了包含 Z(仰角)和 M(度量)值的点(Point)实例,其中 Z(仰角)和 M(度量)值可以显示的指定为“null”。<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->DECLARE @g geometry;<br/>SET @g = geometry::Parse('POINT(30.6666587469201 104.062021177233 15 3.5)');<br/>--SET @g = geometry::Parse('POINT(30.6666587469201 104.062021177233 null null)');<br/>select @g.STX AS X<br/>select @g.STY AS Y<br/>select @g.Z as Z<br/>select @g.M as M
<br/> <br/>
二、点集合(MultiPoint )<br/>
  MultiPoint 是零个点或更多个点的集合。MultiPoint
实例的边界为空。其实需要使用函数STGeomFromText()来格式化被定义的数据按照OGC标准输出WKT格式的空间数据结果,也可使用函数STMPointFromText()代替STGeomFromText()的使用,通过如下SQL命令可定义一个点集合对象实例,并使用函数STGeometryN()输出空间数据结果:<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->--创建点集合实例<br/>DECLARE @cd geometry;<br/>SET @cd = geometry::STGeomFromText('MULTIPOINT((30.6666587469201 104.062021177233),(29.5076372217973 106.489384971208))',4326);<br/>--SET @cd = geometry::STMPointFromText('MULTIPOINT((30.6666587469201 104.062021177233),(29.5076372217973 106.489384971208))',4326);<br/>select @cd.STGeometryN(1).STAsText() as 重庆;<br/>select @cd.STGeometryN(2).STAsText() as 成都;<br/>---------------------------------------------------------------------------------------<br/>执行输出结果:<br/>
重庆<br/>---------------------------------------------------------------------------------------<br/>POINT
(30.6666587469201 104.062021177233)<br/>
 <br/>
成都<br/>---------------------------------------------------------------------------------------<br/>
POINT (29.5076372217973 106.489384971208)<br/>
 <br/>
 三、线(LineString)<br/>
   LineString 是一个一维对象,表示一系列点和连接这些点的线段。一个 LineString
实例必须由至少两个非重复点组成,也可以为空。线条描述了空间上的两个或多个点之间的距离,必须有两个端点,分别为:起止点(StartPoint)和终止点(EndPoint)。如下SQL命令实现了定义重庆到成都两点之间的线条:<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->DECLARE @cdline geometry;<br/>SET @cdline = geometry::STGeomFromText('LINESTRING(30.6666 104.06202, 29.50763 106.48938)', 4326);<br/>select @cdline.STAsText() as 重庆_成都<br/>-------------------------------------------------------------------------------------------<br/>重庆_成都<br/>-------------------------------------------------------------------------------------------<br/>LINESTRING (30.6666 104.06202, 29.50763 106.48938)
 <br/>
  在SQL Server 2008的空间结果中所呈现的效果如下图所示:<br/>
        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/LineString.jpg" width="273" height="243"/>     <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/LineStringS.png" width="317" height="137"/><br/>
 <br/>
  注:线条有多种外观呈现方式,有非闭合线条、闭合线条以及图形复杂的线条等多种情况出现。如上(右)图示。<br/>
 <br/>
四、线集合(MultiLineString)<br/>
  MultiLineString 是零个或更多 geometry 或 geography LineString 实例的集合。为使 MultiLineString 实例有效,该实例必须满足以下条件:<br/>
  1、构成 MultiLineString 实例的所有实例必须都是有效的 LineString 实例。<br/>
  2、在构成 MultiLineString 实例的 LineString 实例中,不能有两个实例在某一段间隔上重叠。LineString 实例只能与自身相交或接触,或者在有限数目的点上与其他 LineString 实例相交或接触。<br/>
 <br/>
  通过如下SQL代码片段演示MultiLineString的具体使用:<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->DECLARE @ml geometry;<br/>--SET @ml = geometry::Parse('MULTILINESTRING((30.6666 104.06202, 29.50763 106.48938),(30.6666 104.06202,33.78142 105.97914))');<br/>SET @ml = geometry::STGeomFromText('MULTILINESTRING((30.6666 104.06202, 29.50763 106.48938),(30.6666 104.06202,33.78142 105.97914))',4326);<br/>--SET @ml.STSrid = 4326;<br/>select @ml;<br/>select @ml.STIsValid();  
--验证ml对象是否为正确的空间对象
 <br/>
        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/MulitiLineString.jpg" width="336" height="197"/><br/>
五、多边形(Polygon )<br/>
   Polygon 是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。可以从至少具有三个不同点的环中构建一个 Polygon
实例。以下SQL命令演示了如何创建多边形以及求多边形的面积函数的应用。<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->--创建多边形<br/>DECLARE @pg geometry;<br/>SET @pg = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);<br/>select @pg;<br/>select @pg.STArea(); --求得多边形的面积
 <br/>
 六、多边形集合(MultiPolygon)<br/>
   多边形集合(MultiPolygon )实例是零个或更多个 Polygon
实例的集合。下面的SQL命令演示了定义一个多边形集合对象并返回第一个对象的WKT。<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->--创建多边形集合,并返回第一个多边形的WKT<br/>DECLARE @mpg geometry;<br/>SET @mpg = geometry::Parse('MULTIPOLYGON(((1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))');<br/>SELECT @mpg.STGeometryN(1).STAsText();<br/>---------------------------------------------------------------------------------------------<br/>执行输出结果:<br/>POLYGON ((1 1, 1 2, 2 1, 1 1))<br/>
 <br/>
七、空间对象集合(GeometryCollection )<br/>
  GeometryCollection 是零个或更多个 geometry 或 geography 实例的集合。GeometryCollection
可以为空。以下SQL演示了定义一个带有一个点(Point)实例和一个多边形(Polygon)实例的空间对象集合对象。<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->--空间集合<br/>DECLARE @ggc geometry;<br/>SET @ggc= geometry::STGeomCollFromText('GEOMETRYCOLLECTION(POINT(3 3 1), POLYGON((0 0 2, 1 10 3, 1 0 4, 0 0 2)))', 1);<br/>select @ggc;<br/>select @ggc.STAsText();        --输出WKT文本(不带Z,M值)<br/>select @ggc.ToString();        --输出对象原字符串(带Z,M值)<br/>---------------------------------------------------------------------------------------------<br/>执行输出结果:<br/>---------------------------------------------------------------------------------------------
0x010000000105050000000000000000000840000000000000084000000000000000000000000000000000000000000000F03F0000000000002440000000000000F03F000000000000000000000000000000000000000000000000000000000000F03F0000000000000040000000000000084000000000000010400000000000<br/>---------------------------------------------------------------------------------------------
GEOMETRYCOLLECTION (POINT (3 3), POLYGON ((0 0, 1 10, 1 0, 0 0)))<br/>---------------------------------------------------------------------------------------------
GEOMETRYCOLLECTION (POINT (3 3 1), POLYGON ((0 0 2, 1 10 3, 1 0 4, 0 0 2)))
 <br/>
八、SQL Server 2008函数应用<br/>
   SQL Server
2008中针对地理空间数据、对象、实例提供了非常丰富的内置函数,使用这些函数可以快速的完成一系列的空间数据分析。关于这些函数的具体使用这里就不逐一介绍,本文中也相应的使用了几个常用的OGC静态几何图形方法,以后的博文使用中会根据使用情况再做介绍,详细请大家查阅MSDN,本文末也提供了相关参考资料的链接。下面代码演示了测距重庆到成都两点之间坐标的距离(单位:米)。<br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->DECLARE @chongqing geography = geography::Point(30.6666587469201,104.062021177233, 4326)<br/>DECLARE @chengdu geography = geography::Point(29.5076372217973, 106.489384971208, 4326)<br/>SELECT @chongqing.STDistance(@chengdu)<br/>-----------------------------------------------------------------------------------------<br/>执行结果为:266943.740244237
 <br/>
九、相关资料<br/>
  [1]、空间数据库(百度百科):http://baike.baidu.com/view/1194566.htm<br/>
  [2]、使用空间数据实现位置智能:http://tech.ddvip.com/2008-04/120816526343873.html<br/>
  [3]、基础空间对象(MSDN):http://msdn.microsoft.com/de-de/library/bb964711.aspx<br/>
  [4]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx<br/>
  [5]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx<br/>
  [6]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx<br/>
  [7]、扩展静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933805.aspx<br/>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
4楼#
发布于:2011-11-28 16:40
 <p>  通过前面几篇文章介绍了关于SQL Server
2008中空间数据类型相关的知识点,了解到了什么是空间数据,什么是空间数据类型,如何在SQL中变成定义基础的空间对象实例,这些知识点主要是为了后续学习空间数据应用和做地理空间分析做准备。本篇将继续介绍SQL
Server
2008中空间数据类型的应用知识点,主要介绍如何在数据表中使用空间数据类型列,如何存储空间数据到空间数据类型,以及如何查询、预览空间数据等相关知识点。</p>
<p> </p>
<p>  选择使用空间数据类型,意味着必须在SQL数据表中添加空间数据类型列以存储空间数据。通常有两种情况:</p>
<p>  1、创建一张带有空间数据类型的新表。</p>
<p>  2、向已有数据表中添加空间数据类型列字段。</p>
<p> </p>
<p><strong>一、创建空间数据类型新表</strong></p>
<p>  创建一个带有空间数据类型的新表和创建普通的表基本没有区别,唯一的不同就是使用了空间数据类型字段。以下SQL演示了创建带有空间数据类型的数据表:</p>
<div class="cnblogs_code">
<div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><span style="color: rgb(0, 0, 255);">CREATE</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">TABLE</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">Cities</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> (<br/>    </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">ID</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">int</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 255);">IDENTITY</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(128, 0, 0); font-weight: bold;">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">1</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(128, 128, 128);">NOT</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">NULL</span><span style="color: rgb(0, 0, 0);">,<br/>    </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">CityName</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">varchar</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(128, 0, 0); font-weight: bold;">255</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(128, 128, 128);">NOT</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">NULL</span><span style="color: rgb(0, 0, 0);">,<br/>    </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">CityLocation</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">geometry</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 128, 128);">NOT</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">NULL</span><span style="color: rgb(0, 0, 0);"><br/>)<br/></span><span style="color: rgb(0, 0, 255);">GO</span></div></div>
<p> </p>
<p><strong>二、添加空间数据类型到已有表</strong></p>
<p>  向已有表中添加空间数据类型列和普通表添加新的列是一样的,同样使用alter table  xxx  add  yyy
datatype命令完成。下面代码演示了向刚创建的新表添加一空间数据类型字段:</p>
<div class="cnblogs_code">
<div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><span style="color: rgb(0, 128, 128);">--</span><span style="color: rgb(0, 128, 128);">向已有表中添加空间数据类型字段</span><span style="color: rgb(0, 128, 128);"><br/></span><span style="color: rgb(0, 0, 255);">ALTER</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">TABLE</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">Cities</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"><br/>    </span><span style="color: rgb(0, 0, 255);">ADD</span><span style="color: rgb(0, 0, 0);"> geo geography<br/></span><span style="color: rgb(0, 0, 255);">GO</span></div></div>
<p> </p>
<p><strong>三、为空间数据类型列制定空间引用标识(SRID)</strong></p>
<p>  任何空间数据类型字段都可以向其指派相应的空间引用标识(SRID),部分空间数据类型字段还是必须制定SRID的。实现对空间数据类型列指派SRID也非常简单,SQL提供了指派命令来完成,下面的SQL命令演示了给上面新添加的空间数据类型指派SRID的实现。</p>
<div class="cnblogs_code">
<div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><span style="color: rgb(0, 128, 128);">--</span><span style="color: rgb(0, 128, 128);">指派空间数据类型列的SRID</span><span style="color: rgb(0, 128, 128);"><br/></span><span style="color: rgb(0, 0, 255);">ALTER</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">TABLE</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">Cities</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> <br/>    </span><span style="color: rgb(0, 0, 255);">ADD</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">CONSTRAINT</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 0);">[</span><span style="color: rgb(255, 0, 0);">enforce_srid_geographycolumn</span><span style="color: rgb(255, 0, 0);">]</span><span style="color: rgb(0, 0, 0);"> <br/>    </span><span style="color: rgb(0, 0, 255);">CHECK</span><span style="color: rgb(0, 0, 0);"> (geo.STSrid </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0); font-weight: bold;">4326</span><span style="color: rgb(0, 0, 0);">)<br/></span><span style="color: rgb(0, 0, 255);">GO</span></div></div>
<p> </p>
<p><strong>四、插入空间数据到空间数据类型字段</strong></p>
<p>  插入数据导表格中同样使用“insert into
table.....”语法实现,不同的是插入空间数据的时候需要对数据进行格式化处理才能被成功的插入到空间数据类型列。针对于两种(geography和geometry)空间数据类型,系统提供了专门的空间格式化语法来处理,比如通过将WKT文本插入到空间数据列,可以使用geometry::STGeomFromText()或者geography::STGeomFromText()函数来对WKT文本进行空间数据类型格式转化。</p>
<div class="cnblogs_code">
<div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><span style="color: rgb(0, 0, 255);">insert</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">into</span><span style="color: rgb(0, 0, 0);"> Cities <br/>    (CityName,CityLocation) <br/>        </span><span style="color: rgb(0, 0, 255);">values</span><span style="color: rgb(0, 0, 0);"> <br/>            (</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">chongqing</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,geometry::STGeomFromText(</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(255, 0, 0);">POLYGON ((107.04352 28.870554, 107.043891 28.873231......)</span><span style="color: rgb(255, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0); font-weight: bold;">4326</span><span style="color: rgb(0, 0, 0);">));</span></div></div>
<p> </p>
<p>  注:上面SQL代码块实现了将重庆市区区域WKT格式的空间数据插入到Cities表的CityLocation字段中,由于WKT内用太长,代码段中对其进行了截取。</p>
<p> </p>
<p><strong>四、查询空间数据类型数据</strong></p>
<p>  查询空间数据和普通的数据查询几乎没有区别,同样使用“select xxx from table where
x=y”的方式实现数据查询。下面SQL命令演示了查询刚刚插入的数据记录:</p>
<div class="cnblogs_code">
<div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 128, 128);">*</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> Cities;</span></div></div>
<p>      <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/Chongqing.jpg" width="528" height="417"/></p>
<p>  同样可以使用系统函数将查询出的空间结果转化为WKT文本格式输出,下面的SQL命令详细演示了改功能函数的使用:</p>
<div class="cnblogs_code">
<div><!--<br/><br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>--><span style="color: rgb(0, 128, 128);">--</span><span style="color: rgb(0, 128, 128);">转换空间数据为WKT文本</span><span style="color: rgb(0, 128, 128);"><br/></span><span style="color: rgb(0, 0, 255);">DECLARE</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">@chongqing</span><span style="color: rgb(0, 0, 0);"> geometry;<br/></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">@chongqing</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(0, 0, 0);"> CityLocation </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> Cities </span><span style="color: rgb(0, 0, 255);">where</span><span style="color: rgb(0, 0, 0);"> ID</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(128, 0, 0); font-weight: bold;">1</span><span style="color: rgb(0, 0, 0);">;<br/></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">@chongqing</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> 重庆市;<br/></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">@chongqing</span><span style="color: rgb(0, 0, 0);">.ToString() </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> 重庆市;<br/></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">@chongqing</span><span style="color: rgb(0, 0, 0);">.STAsText() </span><span style="color: rgb(0, 0, 255);">as</span><span style="color: rgb(0, 0, 0);"> 重庆市;   </span><span style="color: rgb(0, 128, 128);">--</span><span style="color: rgb(0, 128, 128);">WKT</span></div></div>
<p> </p>
<p>         <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/ChongqingWKT.jpg" width="480" height="320"/></p>
<p> </p>
<p><strong>五、相关资料</strong></p>
<p>  [1]、空间数据库(百度百科):<a href="http://baike.baidu.com/view/1194566.htm"><font color="#1a8bc8">http://baike.baidu.com/view/1194566.htm</font></a>
</p>
<p>  [2]、使用空间数据实现位置智能:<a href="http://tech.ddvip.com/2008-04/120816526343873.html"><font color="#1a8bc8">http://tech.ddvip.com/2008-04/120816526343873.html</font></a></p>
<p>  [3]、基础空间对象(MSDN):<a href="http://msdn.microsoft.com/de-de/library/bb964711.aspx"><font color="#1a8bc8">http://msdn.microsoft.com/de-de/library/bb964711.aspx</font></a></p>
<p>  [4]、几何实例上的OGC方法:<a href="http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx"><font color="#1a8bc8">http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx</font></a></p>
<p>  [5]、几何图形实例上的扩展方法:<a href="http://msdn.microsoft.com/zh-cn/library/bb933880.aspx"><font color="#1a8bc8">http://msdn.microsoft.com/zh-cn/library/bb933880.aspx</font></a></p>
<p>  [6]、OGC 静态几何图形方法:<a href="http://msdn.microsoft.com/zh-cn/library/bb933894.aspx"><font color="#1a8bc8">http://msdn.microsoft.com/zh-cn/library/bb933894.aspx</font></a></p>
<p>  [7]、扩展静态几何图形方法:<a href="http://msdn.microsoft.com/zh-cn/library/bb933805.aspx"><font color="#1a8bc8">http://msdn.microsoft.com/zh-cn/library/bb933805.aspx</font></a></p>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
5楼#
发布于: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的数据的可编程性支持。<br/>
 <br/>
一、SQLCLR ; .NET CLR互编程性<br/>
   可以在SQL Server 2008的安装目录下找到SQLCLR与.NET
CLR共享的空间数据类型共享库组件(Microsoft.SqlServer.Types.dll),该组件除了支持基于SQL Server
2008的空间数据类型数据库编程,同时也支持基于.NET
Framework的面向对象编程,包括对VB.NET、C#的多语言的支持,该组件位于如下安装目录中: <br/>

<br/>Code highlighting produced by Actipro CodeHighlighter (freeware)<br/>http://www.CodeHighlighter.com/<br/><br/>-->C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dll
 <br/>
  通过下面这个示例程序可以演示基于Microsoft.SqlServer.Types.dll在SQLCLR和.NET CLR之间的双向互支持性。<br/>

SQLCLR:定义一个地理坐标点<br/>declare @geom geometry;<br/>  set @geom = geometry::Point(107.04352,28.870554,4326);<br/>  select @geom;<br/>-----------------------------------------------------------------------------------<br/>.NET CLR:定义一个地理坐标点<br/>static void Main(string[] args)<br/>{<br/>    var point = SqlGeometry.Point(107.04352, 28.870554, 4326);<br/><br/>    Console.WriteLine(point.STX);<br/>    Console.WriteLine(point.STY);<br/>    Console.WriteLine(point.ToString());<br/>}
 <br/>
  在.NET CLR中可以使用所有SQLCLR编程中所提供的编程接口,也就是说在.NET
CLR中变成不仅仅只是局限于再空间对象的定义上,还包括对象的相关属性、方法的支持,如下代码块演示了SQLCLR和.NET
CLR编程实现地理测距函数的对比。<br/>

declare @geom geometry;<br/>set @geom = geometry::Point(107.04352,28.870554,4326);<br/><br/>declare @end geometry;<br/>set @end = geometry::Point(103.84041, 29.170240,4326);<br/>select @geom.STDistance(@end);<br/>------------------------------------------------------------------------<br/>var pointStart = SqlGeometry.Point(107.04352, 28.870554, 4326);<br/>var pointEnd = SqlGeometry.Point(103.84041, 29.170240, 4326);<br/>var result = pointStart.STDistance(pointEnd);<br/>Console.WriteLine("地理距离:" + result + "(米)");
 <br/>
   关于空间对象的属性、函数的具体使用这里就不做介绍了,详细请查阅:几何实例上的OGC方法。<br/>
 <br/>
二、创建空间对象到数据库<br/>
  Microsoft.SqlServer.Types.dll提供友好的.NET CLR编程性,同样我们可以将在.NET
CLR中创建的对象插入到空间数据库中进行查询,以便于做空间分析、计算。下面演示通过.NET CLR构造一个多边形空间对象并插入到SQL Server
2008数据库中。<br/>

static void Main(string[] args)<br/>{<br/>    //定义一个多边形<br/>    var polygon = SqlGeography.STGeomFromText(<br/>        new SqlChars(<br/>        new SqlString("POLYGON ((-114.01611328125 42.0003251483162, -114.0380859375 42.0003251483162,"<br/>            + "-113.994140625 37.0200982013681, -109.05029296875 37.0200982013681, -109.09423828125 41.0130657870063, "<br/>            + "-111.07177734375 41.0462168145206, -111.07177734375 42.0003251483162, -114.01611328125 42.0003251483162))",<br/>            111)),<br/>            4326);<br/><br/>    var sql = "insert Cities (CityName,CityLocation) values ('test','" + polygon.ToString() + "')";<br/><br/>    InsertToDB(sql);<br/>}<br/><br/>private static void InsertToDB(string sql)<br/>{<br/>    using (var conn = new SqlConnection(ConfigurationManager.AppSettings["SQL2008"]))<br/>    {<br/>        if (conn.State == ConnectionState.Closed) conn.Open();<br/>        using (var cmd = new SqlCommand(sql, conn))<br/>        {<br/>            int row = cmd.ExecuteNonQuery();<br/>        }<br/>    }<br/>}
 <br/>
三、查询数据库空间数据<br/>
  首先来看看基于SQL Server Management Studio 查询刚刚入库的记录,通过空间结果可以直接预览查询结果。<br/>

declare @city geometry;<br/>select @city = CityLocation from Cities where ID=5;<br/>select @city;<br/>select @city.STArea() as
面积;--求面积
 

---------------------------------------------------------------------------------------------------------------------------------------<br/>0x000000000104080000000000000008815CC035B18AA70A0045400000000070825CC035B18AA70A00454000000000A07F5CC0CECAEE93928242400000000038435BC0CECAEE93928242400000000008465BC0BCF1C323AC8144400000000098C45BC01572BD6EEA8544400000000098C45BC035B18AA70A0045400000000008<br/><br/>(1 行受影响)<br/><br/>面积<br/>----------------------<br/>22.6802255629445<br/><br/>(1 行受影响)
        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/PolygonTest.jpg"/><br/>
  同样可以使用.NET
CLR对其进行编程实现,这其实和查询普通数据是没有区别的,只是将查询结果转为为的是空间数据类型。可以通过如下代码实现查询空间数据到应用程序中。<br/>

static void Main(string[] args)<br/>{<br/>    var sql = "select CityLocation from Cities where ID = 5";<br/>    var result = QueryDB(sql);<br/><br/>    var polygon = SqlGeography.STGeomFromText(<br/>        new SqlChars(<br/>        new SqlString(result)), 4326);<br/><br/>    Console.WriteLine(polygon.ToString()); <br/>}<br/><br/>private static string QueryDB(string sql)<br/>{<br/>    using (var conn = new SqlConnection(ConfigurationManager.AppSettings["SQL2008"]))<br/>    {<br/>        if (conn.State == ConnectionState.Closed) conn.Open();<br/>        using (var cmd = new SqlCommand(sql, conn))<br/>        {<br/>            return cmd.ExecuteScalar().ToString();<br/>        }<br/>    }<br/>}
 <br/>
  本篇就大概介绍到这里,经常内容请关注后续系列博文,下一篇将介绍微软Bing Maps与空间数据的亲密接触,敬请期待~~~~<br/>
 <br/>
四、相关资料<br/>
  [1]、数据表中使用空间数据类型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html<br/>
  [2]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx
<br/>
  [3]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx<br/>
  [4]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx<br/>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
6楼#
发布于:2011-11-28 16:41
<font size="4">  SQL Server 2008中存储的空间数据,除了能够直接基于SQL
Server做空间查询、空间分析外,由于SQLCLR提供了非常丰富、完善的开发API,使得空间数据可以在不同的常用空间数据类型之间转换,同时还可以非常简单的和地图应用无缝集成使用。本篇博文以Bing
Maps Silverlight Control为地图应用客户端为基础,介绍如何实现在Bing Maps中呈现地理空间数据。
 <br/>
一、准备空间数据<br/>
  为了演示如何基于Bing Maps Silverlight Control来呈现SQL Server
2008中存储的空间数据,首先需要在数据库中模拟一些数据供数据查询使用,随意创建一个带有空间数据类型字段的表就可以,如下SQL脚本。<br/>

CREATE TABLE DrawnPolygons(<br/>    [ID] [int] IDENTITY(1,1) NOT NULL,<br/>    [Name] [varchar](50) NOT NULL,<br/>    [Polygon] [geography] NOT NULL)<br/>GO
  <br/>
  对于上面脚本所创建的表格,随意的构造几条数据,如下图SQL Server Management Studio的空间结果中所呈现的效果。<br/>
         <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/BMSL01.jpg"/><br/>
 <br/>
二、编写数据服务接口<br/>
  数据结构使用WebService或者WCF提供都可以,本篇选用WCF Service提供地图数据访问接口,实现将数据库的空间数据读取出来返回到Bing
Maps的地图客户端。由于目前的Linq To Sql和ASP.NET Entity Framewrok还不支持SQL Server
2008的空间数据类型,数据访问只能自己编写ADO.NET实现。如下代码块:<br/>

private DataTable Query(string sql)<br/>{<br/>    string cstring = ConfigurationManager.ConnectionStrings["BingMapsDB"].ConnectionString;<br/>    SqlConnection conn = new SqlConnection(cstring);<br/>    if (conn.State == ConnectionState.Closed) conn.Open();<br/>    SqlDataAdapter adapter = new SqlDataAdapter(sql, conn);<br/>    DataSet ds = new DataSet();<br/>    adapter.Fill(ds);<br/>    return ds.Tables[0];<br/>}
 <br/>
  直接在WCF中对外公布一个公共方法,并将其标记为操作契约(OperationContract)就完成了服务接口的提供,该接口实现数据库查询并将数据库数据数据组合为对象集合返回到客户端,详细实现如下代码块。<br/>

[OperationContract]<br/>public List<DrawnPolygons> QueryPolygons()<br/>{<br/>    var sql = "SELECT  * FROM [DrawnPolygons]";<br/><br/>    var result = Query(sql);<br/>    List<DrawnPolygons> areas = null;<br/>    if (result != null ;; result.Rows.Count > 0)<br/>    {<br/>        areas = new List<DrawnPolygons>();<br/>        foreach (DataRow row in result.Rows)<br/>        {<br/>            areas.Add(new DrawnPolygons<br/>            {<br/>                ID = int.Parse(row["ID"].ToString()),<br/>                Name = row["NAME"].ToString(),<br/>                Xaml = ToXaml(row["Polygon"], row["ID"].ToString())<br/>            });<br/>        }<br/>    }<br/>    return areas;<br/>}
 <br/>
   接口使用了数据传输对象DrawnPolygons,其他结构如下定义:<br/>

[DataContract]<br/>public class DrawnPolygons<br/>{<br/>    [DataMember]<br/>    public int ID { get; set; }<br/>    [DataMember]<br/>    public string Name { get; set; }<br/>    [DataMember]<br/>    public string Xaml { get; set; }<br/>}
 <br/>
三、构造空间数据客户端对象<br/>
  在这里请大家讲视眼转移到本篇前面代码片段的中加粗大红字体处,会发现使用了一个名为“ToXaml()”的方法,此方法的主要功能就是实现将空间数据转换为客户端Silverlight能够识别的xaml语言标记。该方法的详细实现如下代码块所示:<br/>

private string ToXaml(object polygon,string id)<br/>{<br/>    StringBuilder sb = new StringBuilder();<br/>    //将数据库查询出的空间数据构造为SQL Server空间数据类型对象<br/>    var geo = SqlGeography.STGeomFromText(<br/>                                new SqlChars(<br/>                                new SqlString(polygon.ToString())), 4326);<br/>    //将空间数据构造为Bing Maps图形(多边形)对象的Xaml文本,以返回到客户端直接解析Xaml为Silverlight程序中的对象。<br/>    for (int j = 1; j <= geo.NumRings(); j++)<br/>    {<br/>        if (geo.RingN(j).STNumPoints() > 1)<br/>        {<br/>            sb.Append("<m:MapPolygon xmlns:m=\"clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl\"");<br/>            sb.Append(" Fill=\"Red\" Locations=\"");<br/>            for (int k = 1; k <= geo.RingN(j).STNumPoints(); k++)<br/>            {<br/>                if (k > 1) sb.Append(" ");<br/>                sb.Append(String.Format("{0:0.#####},{1:0.#####}", <br/>                    (double)geo.RingN(j).STPointN(k).Lat, <br/>                    (double)geo.RingN(j).STPointN(k).Long));<br/>            }<br/>            sb.AppendLine("\"/>");<br/>        }<br/>    }<br/>           <br/>    return sb.ToString();<br/>}
 <br/>
 <br/>
  实际上,在服务端将空间数据转化为Xaml并非实现传递空间数据到客户端并解析呈现到GIS界面的唯一选择,还可以将数据库空间数据处理为KML、GML等常用的其它能够表示存储地图数据的任意格式返回到客户端使用。这里为何选择将空间数据解析为Xaml语言标记的目的是为了Silverlight能够直接将Xaml语言标记解析为对应的对象,并能够直接使用。如果选择将空间数据解析为别的地图数据格式,还需要额外的解析算法去实现空间数据的解析。<br/>
 <br/>
四、Bing Maps客户端的实现<br/>
  Bing Maps Silverlight客户端只需要调用上面提供的WCF
Service接口,将空间数据查询到客户端,然后通过XamlReader的接口解析Xaml为对应的对象即可,可以在应用程序加载时就发起对接口的调用。如下代码块所示:<br/>

public MainPage()<br/>{<br/>    InitializeComponent();<br/>    <br/>    //调用WCF服务接口查询空间数据到客户端<br/>    DataServiceClient service = new DataServiceClient();<br/>    service.QueryPolygonsCompleted += new EventHandler<QueryPolygonsCompletedEventArgs>(service_QueryPolygonsCompleted);<br/>    service.QueryPolygonsAsync();<br/>}


private void service_QueryPolygonsCompleted(object sender, QueryPolygonsCompletedEventArgs e)<br/>{<br/>    if (e.Error != null) return;<br/><br/>    for (int i = 0; i < e.Result.Count; i++)<br/>    {<br/>        //将空间数据所构造的Xaml语言标记解析为Bing Maps Silverlight Control中的多边形(MapPolygon)对象。<br/>        MapPolygon polygon = (MapPolygon)XamlReader.Load(e.Result.Xaml);<br/>        //将多边形对象添加到地图中呈现。<br/>        map.Children.Add(polygon);<br/><br/>    }<br/>}
 <br/>
       <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/BMSL02.jpg"/><br/>
 <br/>
四、相关资料<br/>
  [1]、数据表中使用空间数据类型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html<br/>
  [2]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx
<br/>
  [3]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx<br/>
  [4]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx<br/>
  [5]、Bing Maps开发系列博文:http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html<br/></font>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
7楼#
发布于:2011-11-28 16:41
<font size="4"> 对于标准的地理空间数据可以通过数据导入的方式将其存放到数据库中(后续文章将详细介绍),对于一些非标准的空间数据或者说是一个软件产品中的业务空间数据,则需要通过人为或其他方式将其存储进数据库,本篇将以如何在Bing
Maps(Silverlight)中动态绘制多边图形然后将其存储到SQL Server
2008的空间数据列中为例,详细介绍如何实现自定义图形存储入库的实现方式和原理。
 <br/>
一、创建空间数据表<br/>
  首先创建空间数据类型字段表,以存储在Bing Maps(Silverlight)中动态绘制的多边形图形数据到空间数据列。<br/>

CREATE TABLE [dbo].[DrawnPolygons](<br/>    [ID] [int] IDENTITY(1,1) NOT NULL,<br/>    [Name] [varchar](50) NOT NULL,<br/>    [Polygon] [geography] NOT NULL)<br/>GO
 <br/>
二、编写入库存储过程<br/>
  目前Linq To Sql和ASP.NET Entity Framework都不支持SQL Server
2008的空间数据类型,前台只能通过字符串或者对象的形式将数据传递到后台服务端,然后通过调用存储过程,在存储过程中对空间数据的字符串进行空间数据对象转换,然后入库。针对上面所创建的空间数据表可以创建如下存储过程来实现多边形空间数据的入库存储。<br/>

SET ANSI_NULLS ON<br/>GO<br/>SET QUOTED_IDENTIFIER ON<br/>GO<br/>CREATE PROCEDURE [dbo].[SavePolygon]<br/>    (<br/>    @name varchar(50),<br/>    @polytext varchar(max),<br/>    @identity int OUTPUT<br/>    )<br/>AS<br/>    INSERT INTO    dbo.DrawnPolygons<br/>                (Name,Polygon) <br/>    VALUES        (@name, geography::STPolyFromText(@polytext, 4326))<br/>    SET @identity = @@Identity<br/>    <br/>    RETURN
 <br/>
三、编写服务接口<br/>
  入库接口可以采用WebService或者WCF技术提供,本篇采用WCF作为数据操作接口技术,Linq To
Sql做数据访问,自定义方法调用存储过程实现数据库入库操作。<br/>
 <br/>
  在项目中添加Linq To Sql文件,然后打开对于的代码隐藏文件,在Linq To
Sql自动生产的创建数据库连接的代码下面添加如下自定义方法实现数据库存储过程的调用。<br/>

[Function(Name = "dbo.SavePolygon")]<br/>public int SavePolygon([Parameter(DbType = "VarChar(50)")] string name, <br/>                    [Parameter(DbType = "VarChar(MAX)")] string polygontext, <br/>                    [Parameter(DbType = "Int")] ref System.Nullable<int> identity)<br/>{<br/>    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), name, polygontext, identity);<br/>    identity = ((System.Nullable<int>)(result.GetParameterValue(2)));<br/>    return ((int)(result.ReturnValue));<br/>}
 <br/>
  如上实现了Linq To Sql对存储过程的调用,接下来就是创建WCF服务提供给Silverlight调用。<br/>

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

public class DrawService : IDrawService<br/>{<br/>    public int? SavePolygon(string name, List<MapPoint> arrayOfLatLong)<br/>    {<br/>        var sb = new StringBuilder();<br/>        sb.Append("POLYGON ((");<br/><br/>        for (var i = arrayOfLatLong.Count; i >= 1; i--)<br/>        {<br/>            var j = i - 1;<br/>            sb.Append(arrayOfLatLong[j].Longitude.ToString());<br/>            sb.Append(" ");<br/>            sb.Append(arrayOfLatLong[j].Latitude.ToString());<br/>            sb.Append(",");<br/>        }<br/><br/>        sb.Remove(sb.Length - 1, 1);<br/>        sb.Append("))");<br/><br/>        int? identity = 0;<br/><br/>        var connectionString = ConfigurationManager.ConnectionStrings["Sql08ConnectionString"].ConnectionString;<br/>        BMPTSDataContext ctx = new BMPTSDataContext(connectionString);<br/>        ctx.SavePolygon("西南大区", sb.ToString(), ref identity);<br/><br/>        return identity;<br/>    }<br/>}
 <br/>
  接口中使用的数据传输对象MapPoint的详细定义如下代码块:<br/>

/// <summary><br/>/// 地图坐标点(经度,纬度)<br/>/// </summary><br/>[DataContract]<br/>public class MapPoint<br/>{<br/>    [DataMember]<br/>    public double Latitude { get; set; }<br/>    [DataMember]<br/>    public double Longitude { get; set; }<br/><br/>    public MapPoint() { }<br/>    public MapPoint(double lat, double lng)<br/>    {<br/>        this.Latitude = lat;<br/>        this.Longitude = lng;<br/>    }<br/>}
 <br/>
四、Bing Maps客户端的实现<br/>
  客户端的实现非常简单,首先创建Silverlight应用程序并添加Bing Maps Silverlight
Control开发组件的引用,其次在界面中添加Map对象以显示Bing
Maps原型界面,最后可以设计一个小的工具面板,以按钮的方式驱动触发绘制多边形的行为,以及保存图形到数据库的命令请求。如下界面效果:  <br/>
        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/DrawPolygon.jpg" width="828" height="456"/><br/>
 <br/>
  对于绘制多边形的算法这里鉴于篇幅限制就不一一贴出来了,详细可通过文末提供的代码下载链接下载本文的示例代码。比如限制绘制一个【成都-重庆-贵阳-昆明】这四个城市组成的西南大区多变型图形,并将其图形数据以空间数据的形式存储到SQL
Server 2008中。图形如下图所示:<br/>
        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/DrawPolygon_Show.jpg" width="825" height="460"/><br/>
 <br/>
  通过点击“保存数据”按钮则将地图界面绘制的图形数据取出来构造为数组传递到WCF服务接口,调用数据库存储过程实现数据入库操作,下面是保存按钮的代码实现。<br/>

private void btnSave_Click(object sender, RoutedEventArgs e)<br/>{<br/>    LocationCollection lc = this._drawLine.Locations;<br/><br/>    ObservableCollection<MapPoint> polygon = new ObservableCollection<MapPoint>();<br/>    for (int i = 0; i < lc.Count; i++)<br/>    {<br/>        polygon.Add(new MapPoint { Longitude = lc.Longitude, Latitude = lc.Latitude });<br/>    }<br/><br/>    //调用WCF接口实现数据入库<br/>    DrawServiceClient client = new DrawServiceClient();<br/>    client.SavePolygonAsync(this.tbName.Text.Trim(), polygon);<br/>    client.SavePolygonCompleted += client_SavePolygonCompleted;<br/>}<br/><br/>private void client_SavePolygonCompleted(object sender, SavePolygonCompletedEventArgs e)<br/>{<br/>    if (e.Error != null)<br/>    {<br/>        this.tbResult.Text = e.Result.Value > 0 ? "保存成功!" : "保存失败";<br/>    }<br/>}
 <br/>
五、数据库中的空间数据<br/>
  当通过Bing Maps中动态绘制多边形图形对象,然后将图形数据通过WCF服务接口入库保存后,可以通过SQL Server Management
Studio查询并在空间数据结果中直接预览结果。<br/>

SELECT [ID],[Name],[Polygon] FROM [dbo].[DrawnPolygons]
 <br/>
        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/xndq.jpg" width="355" height="372"/><br/>
 <br/>
六、相关资料<br/>
  [1]、Geography数据类型:http://msdn.microsoft.com/zh-cn/library/cc280766.aspx<br/>
  [2]、地域实例上的OGC方法:http://msdn.microsoft.com/zh-cn/library/bb933917.aspx<br/>
  [3]、地理实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933968.aspx<br/>
  [4]、OGC静态地理方法:http://msdn.microsoft.com/zh-cn/library/bb933988.aspx<br/>
  [5]、扩展静态地理方法:http://msdn.microsoft.com/zh-cn/library/bb933921.aspx<br/></font>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
8楼#
发布于:2011-11-28 16:42
<font size="4"> geography 和geometry数据类型包括以用于在OGC中所定义的地理数据的已知文本(Well Known Text,WKT)和已知二进制(Well
Known Binary,WKB)格式导入和导出数据的方法,还包括普遍使用的地理标示语言(Geographic Markup
Language,GML)格式,这使得很容易从支持这些格式的数据源导入地理数据。地理数据很容易从一些政府和商业数据源获得,并且可以相对容易地从许多现有的GIS应用程序和GPS系统中导出。Microsoft保持与一些第三方GIS供应商和地理数据解决方案供应商的紧密关系,这帮助确保SQL
server 2008和广泛的行业标准工具间的强大兼容能力,以用于导入、导出和操纵空间数据。
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  通常我们开发一个GIS应用,基于GIS做数据分布呈现、统计汇总、搜索等等的功能,几乎都离不开地图数据的支持,一方面是作为地图呈现需要,其次是为了方便做空间分析等诸多功能。而对于空间数据的需求,通常不需要自己去建立空间数据,市面上有许多非常成熟的地图数据可以直接被采购使用,并以此为基础直接建立基于地图空间数据的GIS应用。另外网上也提供了比较多的空间数据免费下载资源,可以轻松的获取到空间数据。本篇将使用</font><a href="http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx"><font color="#1a8bc8" size="4">SQL空间工具(SqlSpatialTools)</font></a><font size="4"> 介绍ESRI地图空间数据(shpfile)导入到SQL
Server 2008的实现。</font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">一、SQL空间数据导入工具(Shape2SQL)</font></strong></p><font size="4">
</font><p><font size="4">  SharpGIS发布了一个专门用来导入ESRI地图空间数据(shpfile)的工具,可以非常简单的实现将shpfile的地图数据文件中的空间数据导入到SQL
Server 2008中,可以通过如下地址下载该工具。</font></p><font size="4">
</font><p><font size="4">  SQL空间工具下载地址:</font><a href="http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx"><font color="#1a8bc8" size="4">http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx</font></a></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SptailToSQL.jpg" width="464" height="384"/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><font size="4">  该工具的运行环境需要微软.NET Framewrok 3.5和</font><a href="http://www.microsoft.com/downloads/details.aspx?familyid=c6c3e9ef-ba29-4a43-8d69-a2bed18fe73c;displaylang=en;tm" target="_blank"><font color="#1a8bc8" size="4">Microsoft SQL Server System CLR Types</font></a><font size="4">。使用该工具通过简单的可视化界面即可连接上SQL
Server 2008的数据库服务器,目前该工具仅仅只支持几种常用的主流空间类型数据,包括:Point 、MultiPoint、(Multi)Polygon 和
(Multi)LineStrings 。详细可访问:</font><a href="http://www.sharpgis.net/page/Shape2SQL.aspx"><font color="#1a8bc8" size="4">http://www.sharpgis.net/page/Shape2SQL.aspx</font></a></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">二、SQL空间数据查询工具(SqlSpatial-Query-Tool)</font></strong></p><font size="4">
</font><p><font size="4">   SQL Server 2008空间数据查询工具可以直接连接到SQL Server
2008数据库服务器,实现空间数据的查询,可视化界面呈现。详细可访问:</font><a href="http://www.sharpgis.net/page/SqlSpatial-Query-Tool.aspx"><font color="#1a8bc8" size="4">http://www.sharpgis.net/page/SqlSpatial-Query-Tool.aspx</font></a></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SptailQueryTool.jpg" width="588" height="517"/></font></p><font size="4">
</font><p><font size="4">  </font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">三、导入Shpfile地图空间数据</font></strong></p><font size="4">
</font><p><font size="4">   如本文篇前的截图,使用SQL空间导入工具实现将ESRI的shpfile地图空间数据导入SQL Server
2008其实非常简单,在导入的时候注意表名和SRID就可以了,其他的可以不用管。如下图演示了将重庆市的大区边界地图数据导入到SQL Server
2008中。</font></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SptailToSQL.jpg" width="451" height="372"/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">四、查询空间数据</font></strong></p><font size="4">
</font><p><font size="4">  实现可以查询可以在SQL Server Management
Studio中执行对表(CQ_Region)的的全表查询,于空间结果选项中可以看到如下图所示的空间呈现效果。  </font></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/CQ_Region_Spatial_Result.jpg"/></font></p><font size="4">
</font><p><font size="4">  另外还可以使用</font><a href="http://www.sharpgis.net/page/SqlSpatial-Query-Tool.aspx"><font color="#1a8bc8" size="4">空间查询工具</font></a><font size="4">实现SQL
Server 2008中的空间数据查询,Spatial Query Tools查询出的空间输入结果如下所示。</font></p><font size="4">
</font><p><font size="4">        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SptailQueryTool.jpg" width="588" height="517"/></font></p><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">五、空间计算支持</font></strong></p><font size="4">
</font><p><font size="4">   数据库里面有了空间数据,就可以给予数据展开空间计算、统计、分析等给力的功能实现,与GIS客户端结合来完成各种简单、负责的空间计算、分析。如下SQL演示了计算上面导入的重庆大界区的地图的地理面积计算。</font></p><font size="4">
</font><div class="cnblogs_code"><font size="4">
</font><div><font size="4"><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> geom.STArea() </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> CQ_Region </span><span style="color: rgb(0, 0, 255);">WHERE</span><span style="color: rgb(0, 0, 0);"> ID</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(128, 0, 0); font-weight: bold;">1</span></font><font size="4"><span style="color: rgb(0, 0, 0);">;<br/></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> geom.STArea() </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> CQ_Region </span><span style="color: rgb(0, 0, 255);">WHERE</span><span style="color: rgb(0, 0, 0);"> ID</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(128, 0, 0); font-weight: bold;">2</span></font><span style="color: rgb(0, 0, 0);"><br/></span><font size="4"><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> geom.STArea() </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> CQ_Region </span><span style="color: rgb(0, 0, 255);">WHERE</span><span style="color: rgb(0, 0, 0);"> ID</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(128, 0, 0); font-weight: bold;">3</span></font><font size="4"><span style="color: rgb(0, 0, 0);">;<br/></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> geom.STArea() </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> CQ_Region </span><span style="color: rgb(0, 0, 255);">WHERE</span><span style="color: rgb(0, 0, 0);"> ID</span><span style="color: rgb(128, 128, 128);">=</span><span style="color: rgb(128, 0, 0); font-weight: bold;">4</span></font><font size="4"><span style="color: rgb(0, 0, 0);">;<br/></span><span style="color: rgb(0, 0, 255);">select</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(255, 0, 255);">SUM</span><span style="color: rgb(0, 0, 0);">(geom.STArea()) </span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> CQ_Region;</span></font></div></div><font size="4">
</font><p><font size="4"> </font></p><font size="4">
</font><p><strong><font size="4">六、相关资料</font></strong></p><font size="4">
</font><p><font size="4">  [1]、KML规范:</font><a href="http://www.opengeospatial.org/standards/kml/"><font color="#1a8bc8" size="4">http://www.opengeospatial.org/standards/kml/</font></a></p><font size="4">
</font><p><font size="4">  [2]、Google KML文档简介:</font><a href="http://code.google.com/intl/zh-CN/apis/kml/documentation/"><font color="#1a8bc8" size="4">http://code.google.com/intl/zh-CN/apis/kml/documentation/</font></a></p><font size="4">
</font><p><font size="4">  [3]、空间工具(Spatial Tools): </font><a href="http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx"><font color="#1a8bc8" size="4">http://www.sharpgis.net/page/SQL-Server-2008-Spatial-Tools.aspx</font></a><font size="4">
</font></p>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15945
  • QQ554730525
  • 铜币25337枚
  • 威望15352点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
9楼#
发布于:2011-11-28 16:43
<font size="4"> 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中。
 <br/>
一、GeoRSS聚合格式<br/>
  相信很多朋友多玩过RSS订阅的,其聚合数据的格式以XML方式承载,主要包括头信息和体信息,体信息可能是一项或多项的数据组成。以下为RSS的聚合格式:<br/>

<?xml version=“1.0” en coding=“gb2312”?> <br/><rss version=“2.0”> <br/>   <channel> <br/>      <title>网站或栏目的名称</title> <br/>      <link>网站或栏目的URL地址</link> <br/>      <description>网站或栏目的简要介绍</description> <br/>      <item> <br/>         <title>新闻标题</title> <br/>         <link>新闻的链接地址</link> <br/>         <description>新闻简要介绍</description> <br/>         <pubDate>新闻发布时间</pubDate> <br/>         <author>新闻作者名称</author> <br/>      </item> <br/>      <item> <br/>        …… <br/>       </item> <br/>   </channel> <br/></rss>
 <br/>
  而GeoRSS的XML数据格式和RSS几乎相同,只是在RSS的基础上使用GML扩展了对于地理空间数据的描述信息,如下GeoRSS数据。<br/>

<feed<br/>  xmlns="http://www.w3.org/2005/Atom"<br/>  xmlns:georss="http://www.georss.org/georss"<br/>  xmlns:gml="http://www.opengis.net/gml"<br/>  ><br/>  <entry><br/>    <id>urn:uuid:7e8ee974-9181-4eae-ad65-55d29175d942</id><br/>    <link href="http://example.org/entries/1"/><br/>    <title>Cedarburg Trip</title><br/>    <summary>We went to visit downtown Cedarburg before the<br/>    conference. Had some great sandwiches at Joe's. If you<br/>    haven't been to Cedarburg, Wisconsin, then you haven't<br/>    really experienced the MidWest...</summary><br/>    <content type="html" src="http://example.org/entries/1"/><br/>  </entry><br/>  <entry><br/>    <id>urn:uuid:53664db3-4598-45d4-a727-022c6203322e</id><br/>    <link rel="related" href="http://example.org/entries/1"/><br/>    <title>Downtown Cedarburg, Wis.</title><br/>    <summary>Went to visit downtown Cedarburg...</summary><br/>    <georss:where><br/>      <gml:Point><br/>        <gml:pos>43.296700 -87.98750</gml:pos><br/>      </gml:Point><br/>    </georss:where><br/>  </entry><br/>  <entry><br/>    <id>urn:uuid:2528d1b4-b5a9-415c-be69-f83974e3e6af</id><br/>    <link rel="related" href="http://example.org/entries/1"/><br/>    <title>Convention Center</title><br/>    <georss:where><br/>      <gml:LineString><br/>        <gml:posList>43.296700 -87.987500 43.3 -88 -44 -89</gml:posList><br/>      </gml:LineString><br/>    </georss:where><br/>  </entry><br/></feed>
        <img border="0" alt="" src="http://www.georss.org/images/5/5c/Georss-model.png" width="587" height="346"/><br/>
二、GeoRSS空间编码<br/>
  通常有三种GeoRSS编码,既简单编码、GML编码和W3C编码。详细请查阅:http://www.georss.org/Encodings。<br/>
 <br/>
  简单编码通常用于定义点、线、多边形等规则的空间数据,GML则通常适用于定义不规则的空间数据,如地市区域。<br/>
 <br/>
三、定义GeoRSS数据<br/>
  定义GeoRSS数据其实主要就是在玩GeoRSS空间编码,知道如何定义点、线、多边形以及不规则的空间图形。如下GeoRSS定义了一个点(重庆)坐标。<br/>

<?xml version="1.0" encoding="utf-8"?><br/><feed xmlns="http://www.w3.org/2005/Atom" <br/>  xmlns:georss="http://www.georss.org/georss"><br/>  <title>重庆</title><br/>  <subtitle>重庆坐标</subtitle><br/>  <link href="http://example.org/"/><br/>  <updated>2011-3-25 23:34:26</updated><br/>  <author><br/>    <name>Beniao</name><br/>    <email>beniao@live.cn</email><br/>  </author><br/>  <id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id><br/>  <entry><br/>    <title>ChongQing</title><br/>    <link href="http://example.org/2005/09/09/atom01"/><br/>    <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id><br/>    <updated>2011-3-25 23:35:00</updated><br/>    <summary>summary><br/>    <georss:point>29.5076372217973 106.489384971208</georss:point><br/>  </entry><br/></feed>
 <br/>
  同样的定义一条空间线段,只是使用的GeoRSS编码不同,如下定义了【成都--重庆】的空间线段示例。<br/>

<georss:line>30.6666587469201 104.062021177233 29.5076372217973 106.489384971208</georss:line>
 <br/>
四、创建GeoRSS聚合存储过程<br/>
  创建GeoRSS聚合存储过程的作用就是将空间数据格式化为GeoRSS的数据格式,存储过程中实现查询空间数据,转换空间数据为GML后并构造为GeoRSS的数据输出。《SQL Server 2008空间数据应用系列九:使用空间工具(Spatial
Tools)导入ESRI格式地图数据》一文中实现了将shp数据导入到SQL Server
2008中,本篇以此数据为例创建存储过程发布GeoRSS。<br/>
        <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/SptailQueryTool.jpg" width="588" height="517"/><br/>
 <br/>

USE [BingMapsDB]<br/>GO<br/><br/>SET ANSI_NULLS ON<br/>GO<br/>SET QUOTED_IDENTIFIER ON<br/>GO<br/>CREATE PROCEDURE [dbo].[CQGeoRSSFeeder]<br/>AS<br/>BEGIN<br/><br/>SET NOCOUNT ON;<br/><br/>-- 定义XML类型变量用于存储GeoRSS内容<br/>DECLARE @GeoRSS xml;<br/><br/>WITH XMLNAMESPACES (<br/>  'http://www.opengis.net/gml' AS gml,<br/>  'http://www.georss.org/georss' AS georss<br/>)<br/>SELECT @GeoRSS =<br/>  (SELECT<br/>    [NAME] AS title,<br/>    [NAME] AS description,<br/>    'http://www.beginningspatial.com/' + CAST([ID] AS varchar(8)) AS link,<br/>    geom.AsGml() AS [georss:where]<br/>  FROM<br/>    CQ_Region<br/>  FOR XML PATH('item'), ROOT('channel')<br/>)<br/><br/>/**<br/> * 使用XQuery格式化XML结果 <br/> **/<br/>SELECT @GeoRSS.query('<br/><rss version="2.0"<br/>  xmlns:georss="http://www.georss.org/georss"<br/>  xmlns:gml="http://www.opengis.net/gml"><br/><channel><br/>  <title>SQL Server 2008 GeoRSS</title><br/>  <description>GeoRSS数据描述</description><br/>  <link>http://www.beginningspatial.com</link><br/>  {<br/>    for $e in channel/item<br/>    return<br/>    <item><br/>    <title> { $e/title/text() }</title><br/>    <description> { $e/description/text() }</description><br/>    <link> { $e/link/text() }</link><br/>    <pubDate>  { $e/pubDate/text() }</pubDate><br/>    <georss:where><br/>      {<br/>        for $child in $e/georss:where/*<br/>        return<br/>        if (fn:local-name($child) = "Point") then  <gml:Point> { $child/* } </gml:Point><br/>        else  if (fn:local-name($child) = "LineString") then  <gml:LineString> { $child/* } </gml:LineString><br/>        else  if (fn:local-name($child) = "Polygon") then  <gml:Polygon> { $child/* } </gml:Polygon><br/>        else  if (fn:local-name($child) = "MultiPoint") then  <gml:MultiPoint> { $child/* } </gml:MultiPoint><br/>        else  if (fn:local-name($child) = "MultiCurve") then  <gml:MultiCurve> { $child/* } </gml:MultiCurve><br/>        else  if (fn:local-name($child) = "MultiSurface") then  <gml:MultiSurface> { $child/* } </gml:MultiSurface><br/>        else  if (fn:local-name($child) = "MultiGeometry") then  <gml:MultiGeometry> { $child/* } </gml:MultiGeometry><br/>        else  ()<br/>      }<br/>    </georss:where><br/>  </item><br/>  }<br/></channel><br/></rss><br/>') AS GeoRSSFeed;<br/>end
 <br/>
  注:执行该存储过程后的就可以将表中所有的空间数据建立GeoRSS输出,输出内容比较大,这里就不贴XML结果了,随本文末的示例代码一起提供给大家下载。<br/>
 <br/>
五、.NET发布GeoRSS订阅<br/>
  .NET服务端可以通过ASPX、ASHX等方式来发布GeoRSS订阅服务,这一步其实非常简单,就是直接调用上面的存储过程,见数据库中的空间数据以GeoRSS的数据格式输出到客户端呈现即可。以下为详细的代码实现:<br/>

using System;<br/>using System.Collections.Generic;<br/>using System.Linq;<br/>using System.Web;<br/>using System.Data.SqlClient;<br/><br/>namespace GeoRSSService<br/>{<br/>    /// <summary><br/>    /// 发布SQL Server 2008中的空间数据为GeoRSS。<br/>    /// </summary><br/>    public class GeoRSSHandler : IHttpHandler<br/>    {<br/>        public void ProcessRequest(HttpContext context)<br/>        {<br/>            context.Response.C;<br/>            context.Response.Charset = "iso-8859-1";<br/>            context.Response.CacheC;<br/>            context.Response.Expires = 0;<br/><br/>            SqlConnection myConn = new SqlConnection(<br/>                @"server=.;database=BingMapsDB;uid=sa;pwd=beniao;");<br/>            myConn.Open();<br/><br/>            string myQuery = "exec dbo.CQGeoRSSFeeder";<br/>            SqlCommand myCMD = new SqlCommand(myQuery, myConn);<br/>            SqlDataReader myReader = myCMD.ExecuteReader();<br/><br/>            while (myReader.Read())<br/>            {<br/>                //输出GeoRSS到客户端<br/>                context.Response.Write(myReader["GeoRSSFeed"].ToString());<br/>            }<br/><br/>            myReader.Close();<br/>            myConn.Close();<br/>        }<br/><br/>        public bool IsReusable<br/>        {<br/>            get<br/>            {<br/>                return false;<br/>            }<br/>        }<br/>    }<br/>}
    <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/SpaitalData/GeoRSS.png"/><br/>
 <br/>
六、相关资料<br/>
  [1]、RSS官网:http://www.georss.org/georss<br/>
  [2]、RSS简介:http://baike.baidu.com/view/1644.htm<br/>
  [3]、GML简介:http://baike.baidu.com/view/609279.htm<br/></font>
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部