SQL Servr 2008空间数据应用系列四:基础空间对象与函数应用
来源:Asp之家 发布时间:2011-02-23 15:01:00
友情提示,您阅读本篇博文的先决条件如下:
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的空间结果中所呈现的效果如下图所示:
图1
图2
注:线条有多种外观呈现方式,有非闭合线条、闭合线条以及图形复杂的线条等多种情况出现。如上(图2)所示。
四、线集合(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对象是否为正确的空间对象
五、多边形(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.cnblogs.com/ )


猜你喜欢
- 这次我们拿小龙猫来做演示这里就不必多说了,也就导入几个用到的包:SOURCE_PATH:这个是GIF的路径OUTPUT_PATH:这个是每一
- 概述介绍触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当
- View in Browser功能不生效问题安装玩view in browser插件后,在文档中点击邮件的view in browser 不
- 如何让页面超时并指定一个超时时间?下面就是利用缓冲的程序页面事例: <%@ OutputCache Du
- 任务:基于线程池来操作MySQL,测试单台机器读写MySQL单表的效率。思路:创建一个大小合适的线程池,让每个线程分别连接到数据库并进行读取
- 循环语句(有两种):while 语句for 语句while 语句:问题:输入一个整数n,让程序输出n行的:hello
- 简单计数器代码如下所示:<% Set fs = CreateObject("Scri
- 前言前面两篇文章介绍了数据结构和算法的一些前置内容,这篇文章开始正式学习常见的数据结构,首先学习的就是栈(Stack)。什么是栈?栈全称为堆
- SQL Server连接中三个常见的错误分析 一、"SQL Server 不存在或访问被拒绝&quo
- 一个什么都不懂的家伙非跟我要个sql查询器 随便写了一个,当然为了数据安全,要过滤掉一个sql关键词和系统中的一些表了 哦,对了,里面的一些
- 运行环境:win10 64位 py 3.6 pycharm 2018.1.1导入对应的包和数据import matplotlib.pyplo
- golang的单引号转义如题,golang中有时候需要将一个字符串中的单引号再转义一次,比如在两个单引号之间包含一个含有单引号的字符串的情形
- raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件)import numpy as npim
- 下面就先定义一个函数: def foo(): print('function') foo() 在上述代码中,定义了一个名为f
- 读取nc数据相关信息#导入库import netCDF4from netCDF4 import Dataset#读取数据文件nc
- 将时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果如:{‘year':2018,‘month
- eval()函数eval() 函数用来执行一个字符串表达式,并返回表达式的值。语法eval(expression[, globals[, l
- 一、前言:mysql8之后想比起之前常用的版本改动还是挺大的,因为刚从安装接触,就先从基本的说起。现在的mysql8安装只能采用解压配置版,
- 原理形态学是图像处理中常见的名词,图像处理的形态学基本属于数学形态学的范畴,是一门建立在格论和拓扑学基础上的图像分析学科。黑帽运算是结合了腐
- 如下所示:原因1:版本不对,如用环境变量设置的python3.7路径,那么用的就是3.7的pip.exe安装了包。却用的是2.7的pytho