在SQL Server 2008之空间数据应用(一)中概略的介绍了SQL Server 2008中支持的两种空间数据类型:Geometry和Geography。
SQL Server 2008中的空间数据类型遵循Open Geospatial Consortium, Inc.(OGC)的《Simple Feature Access》规范标准,你可以在其网站上下载到该标准的详细文件。
空间数据的具体类型
在SQL Server 2008中,Geometry和Geography支持十一种空间数据对象或实例类型。下图所示是可实例化类型(以蓝色背景显示)和其抽象基类(以黄色背景显示)的继承关系图。可实例化类型以蓝色背景显示,共7个,它们分别是Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon 和 GeometryCollection。
在SQL Server 2008之空间数据应用(一)中也看到了,在定义数据字段的类型时,只提供Geometry和Geography两种,那又是如何来表示上述7中具体的可实例化类呢?这是SQL Server内部机制实现的。表中的一列,它可以混杂多种不同的地理空间信息。某一行可能表示湖北省国土区域,某一行表示从我老家至华中师范大学的行车路线,某一行表示大别山区的一处名胜古迹......
Point:用X、Y坐标来表示一个确切的位置,作为可选的,可以包含Z值和M值,它是一个零维对象。Point实例没有长度、面积等信息,它是构成其它复杂对象的基础。
LineString:线段是两点间的最短路径。LineString表示一系列的点和连接这些点的线段。它是一个一维对象,具备长度信息,但没有面积信息。
Polygon:Polygon是由一个环(Ring)所定义的闭合的二维图形。具备长度和面积信息。Polygon是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。可以从至少具有三个不同点的环中构建一个Polygon实例。Polygon实例也可以为空。Polygon的外部环和任意内部环定义了其边界。环内部的空间定义了Polygon的内部。Polygon的内部环在单个切点处既可与自身接触也可彼此接触,但如果Polygon的内部环交叉,则该实例无效。
GeomCollection:除了单实例类型(上述Point、LineString、Polygon三种)之外,还有一种可以表示实例集合的类型。表示这种集合类型的基类是GeomCollection,其实例对象可以是多种单实例类型实例的集合。
Multipoint:继承自GeomCollection,是零个点或多个点的集合。
MultiLineString:继承自GeomCollection,是零个或多个geometry或geography LineString实例的集合。
MultiPolygon:继承自GeomCollection,是零个或多Polygon实例的集合。
用T-SQL表达空间数据
任何变量、参数、或者表中的某一列都可以声明为Geometry类型,类型名称是不区分大小写的。Geometry本身是一个抽象类型,必须实例化Geometry的一个可创建的子类来实现空间数据的功能。根据OGC标准,可使用STGeomFromText()静态方法来解析WKT所提供的数据,并根据数据识别出对应的类型。请注意在SQL语法中,CLR方法都是大小写敏感的。
在.NET下用C#或者VB.NET进行编码时候,通常使用一个圆点符号(.)来请求一个方法,然而在T-SQL中并非如此。在T-SQL中,请求从属于某类型的静态方法是用双冒号(::)。
示例1——使用Parse()创建Point
DECLARE @g geometry; SET @g = geometry::Parse('POINT(3 4 7 2.5)'); SELECT @g; PRINT @g.STX; PRINT @g.STY; PRINT @g.Z; PRINT @g.M;
定义了一个点,X和Y坐标分别是3和4,Z为7,M为2.5。
示例2——使用STGeomFromText()创建LineString
DECLARE @g geometry; SET @g = Geometry::STLineFromText('LINESTRING(0 8, 6 8, 0 0,6 0)',0) SELECT @g PRINT @g.STLength() -- Result: 22
执行结果如下图所示。结果选项卡中显示的是LineString对象在SQL Server中的二进制表示;空间结果选项卡是该对象的实际图形;消息窗口中是执行该语句所返回的消息,该语句中使用STLength()获取该LineString的长度,结果为22。