设为首页 收藏本站
查看: 737|回复: 0

[经验分享] SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

[复制链接]

尚未签到

发表于 2015-6-29 12:30:32 | 显示全部楼层 |阅读模式
    友情提示,您阅读本篇博文的先决条件如下:
  1、本文示例基于Microsoft SQL Server 2008 R2调测。
  2、具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。
  3、熟悉或了解Microsoft SQL Server 2008中的空间数据类型。
  4、具备相应(比如OGC)的GIS专业理论知识。
  5、其他相关知识。

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


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


DECLARE @g geometry;
SET @g = geometry::Parse('POINT(30.6666587469201 104.062021177233 15 3.5)');
--SET @g = geometry::Parse('POINT(30.6666587469201 104.062021177233 null null)');
select @g.STX AS X
select @g.STY AS Y
select @g.Z as Z
select @g.M as M  

  二、点集合(MultiPoint
  MultiPoint 是零个点或更多个点的集合。MultiPoint 实例的边界为空。其实需要使用函数STGeomFromText()来格式化被定义的数据按照OGC标准输出WKT格式的空间数据结果,也可使用函数STMPointFromText()代替STGeomFromText()的使用,通过如下SQL命令可定义一个点集合对象实例,并使用函数STGeometryN()输出空间数据结果:


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


DECLARE @cdline geometry;
SET @cdline = geometry::STGeomFromText('LINESTRING(30.6666 104.06202, 29.50763 106.48938)', 4326);
select @cdline.STAsText() as 重庆_成都
-------------------------------------------------------------------------------------------
重庆_成都
-------------------------------------------------------------------------------------------
LINESTRING (30.6666 104.06202, 29.50763 106.48938)  
  在SQL Server 2008的空间结果中所呈现的效果如下图所示:
DSC0000.jpg       DSC0001.png
  
  注:线条有多种外观呈现方式,有非闭合线条、闭合线条以及图形复杂的线条等多种情况出现。如上(右)图示。
  
  四、线集合(MultiLineString)
  MultiLineString 是零个或更多 geometry 或 geography LineString 实例的集合。为使 MultiLineString 实例有效,该实例必须满足以下条件:
  1、构成 MultiLineString 实例的所有实例必须都是有效的 LineString 实例。
  2、在构成 MultiLineString 实例的 LineString 实例中,不能有两个实例在某一段间隔上重叠。LineString 实例只能与自身相交或接触,或者在有限数目的点上与其他 LineString 实例相交或接触。
  
  通过如下SQL代码片段演示MultiLineString的具体使用:


DECLARE @ml geometry;
--SET @ml = geometry::Parse('MULTILINESTRING((30.6666 104.06202, 29.50763 106.48938),(30.6666 104.06202,33.78142 105.97914))');
SET @ml = geometry::STGeomFromText('MULTILINESTRING((30.6666 104.06202, 29.50763 106.48938),(30.6666 104.06202,33.78142 105.97914))',4326);
--SET @ml.STSrid = 4326;
select @ml;
select @ml.STIsValid();   --验证ml对象是否为正确的空间对象  
DSC0002.jpg
  五、多边形(Polygon
  Polygon 是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。可以从至少具有三个不同点的环中构建一个 Polygon 实例。以下SQL命令演示了如何创建多边形以及求多边形的面积函数的应用。


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


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


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


DECLARE @chongqing geography = geography::Point(30.6666587469201,104.062021177233, 4326)
DECLARE @chengdu geography = geography::Point(29.5076372217973, 106.489384971208, 4326)
SELECT @chongqing.STDistance(@chengdu)
-----------------------------------------------------------------------------------------
执行结果为:266943.740244237  
  九、相关资料
  [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
  
  版权说明
  本文属原创文章,欢迎转载且注明文章出处,其版权归作者和博客园共有。为了保存作者的创作热情,请在转载后的明显位置标记本文出处。   
  作      者:Beniao
  文章出处:http://beniao.iyunv.com/  或  http://www.iyunv.com/
DSC0003.jpg
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81491-1-1.html 上篇帖子: 浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色 下篇帖子: Sql Server 2005 ROW_NUMBER 函数实现分页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表