Sql Server 2008 空间存储入门
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Sql Server 2008 空间存储入门
(一)空间数据类型
有两种类型的空间数据。
geometry 数据类型支持平面或欧几里得(平面球)数据。
geometry 数据类型符合适用于 SQL 规范的开放地理空间联盟 (OGC) 简单特征 1.1.0 版。
另外,SQL Server 支持 geography 数据类型,该数据类型可存储诸如 GPS 纬度和经度坐标之类的椭圆体(圆球)数据。
geometry 和 geography 数据类型支持十一种空间数据对象或实例类型。
但是,这些实例类型中只有七种“可实例化”;可以在数据库中创建并使用这些实例(或可对其进行实例化)。
这些实例的某些属性由其父级数据类型派生而来,使其在 GeometryCollection 中区分为 Points、 LineStrings、Polygons 或多个 geometry 或 geography 实例。
下图描述了 geometry 和 geography 数据类型所基于的 geometry 层次结构。
geometry 和 geography 的可实例化类型以蓝色表示。
如图所示,geometry 和 geography 数据类型的七种可实例化类型为 Point、MultiPoint、LineString、MultiLineString、Polygon、MultiPolygon 和 GeometryCollection。
只要特定实例的格式正确,即使未显式定义该实例,geometry 和 geography 类型也可识别该实例。
例如,如果您使用 STPointFromText() 方法显式定义了一个 Point 实例,只要方法输入的格式正确,geometry 和 geography 便将该实例识别为 Point。
如果您使用 STGeomFromText() 方法定义了相同的实例,则 geometry 和 geography 数据类型都将该实例识别为 Point。
SRID (空间引用标识符)
每个空间实例都有一个空间引用标识符 (SRID)。
SRID 对应于基于特定椭圆体的空间引用系统,可用于平面球体映射或圆球映射。
空间列可包含具有不同 SRID 的对象。
然而,在使用 SQL Server 空间数据方法对数据执行操作时,仅可使用具有相同 SRID 的空间实例。
从两个空间数据实例派生的任何空间方法的结果仅在这两个实例具有相同的 SRID(该 SRID 基于相同的用于确定实例坐标的度量单位、数据和投影)时才有效。
SRID 最常见的度量单位为米或平方米。
如果两个空间实例的 SRID 不相同,则对这两个实例使用 geometry 或 geography 数据类型方法后的结果将返回 NULL。
例如,若要以下谓词返回非 NULL 结果,两个 geometry 实例(geometry1 和 geometry2)必须具有相同的 SRID:
geometry1.STIntersects(geometry2) = 1
空间引用标识系统是由 European Petroleum Survey Group (EPSG) standard(欧洲石油测绘组 (EPSG) 标准)定义的,它是为绘图、测绘以及大地测量数据存储而开发的一组标准。
该标准归石油天然气生产商 (OGP) 测绘和定位委员会所有。
几何图形实例默认 SRID 为零
SQL Server 中 geometry 实例的默认 SRID 为 0。
利用 geometry 空间数据,执行计算是不需要空间实例的指定 SRID 的;因此,实例可驻留在未定义的平面空间。
若要在 geometry 数据类型方法的计算中指明未定义的平面空间,SQL Server 数据库引擎 使用 SRID 0。
地域实例必须使用支持的 SRID
SQL Server 支持基于 EPSG 标准的 SRID。
必须使用 geography 实例的支持,SQL Server 的 SRID 执行计算或将方法用于地域空间数据。
SRID 必须与 sys.spatial_reference_systems 目录视图中显示的 SRID 中的一个匹配。
如前所述,在使用 geography 数据类型对空间数据执行计算时,结果将取决于在创建数据时使用的是哪个椭圆体,因为为每个椭圆体都分配了一个特定空间引用标识符 (SRID)。
对 geography 实例使用方法时,SQL Server 使用等于 4326 的默认 SRID,它将映射到 WGS 84 空间引用系统。
如果要使用 WGS 84(或 SRID 4326)之外的某个空间引用系统中的数据,您需要确定地域空间数据的特定 SRID。
有关这些实例的详细信息,请参阅以下主题:
点
在 SQL Server 空间数据中,Point 是表示单个位置的零维对象,可能包含 Z(仰角)和 M(度量)值。
示例
1、下面的示例创建一个表示点 (3, 4) 的 geometry Point 实例,该实例的 SRID 为 0。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT (3 4)', 0);//STGeomFromText()方法名大写,且该方法有两个参数;Point中的数据是空格隔开
2、下一个示例创建一个表示点 (3, 4) 的 geometry Point实例,该实例的 Z(仰角)值为 7,M(度量)值为 2.5,默认 SRID 为 0。
DECLARE @g geometry;
SET @g = geometry::Parse('POINT(3 4 7 2.5)');
最后一个示例返回 geometry Point 实例的 X、Y、Z 和 M 值。
SELECT @g.STX;//这些属性要大写
SELECT @g.STY;
SELECT @g.Z;
SELECT @g.M;
3、Z 和 M 值可以显式指定为 NULL,如下例所示。
DECLARE @g geometry;
SET @g = geometry::Parse('POINT(3 4 NULL NULL)');
C#
SqlGeometry centPoint = (SqlGeometry)dr.GetValue(1); // 中心点或点SQlGeometry类型
//实际上下面的代码执行一次就跳出了
// 随机取了第一个点为中心点
for (int j = 1; j <= centPoint.STNumPoints(); j++ )
{
GeoPoint geoPoint = new GeoPoint(centPoint.STPointN(j).STX.Value, centPoint.STPointN(j).STY.Value);
//面积中心点
spatialRes.GeoPolygon.CentPoint = geoPoint;
//点
spatialRes.GeoPoint = geoPoint;
break;
}
MultiPoint
MultiPoint 是零个点或更多个点的集合。
MultiPoint 实例的边界为空。
示例
下面的示例创建一个 geometry MultiPoint 实例,该实例的 SRID 为 23 且包含两个点:一个点的坐标为 (2, 3),另一个点的坐标为 (7, 8),Z 值为 9.5。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('MULTIPOINT((2 3), (7 8 9.5))', 23);
该 MultiPoint 实例也可使用 STMPointFromText() 表示,如下所示。
DECLARE @g geometry;
SET @g = geometry::STMPointFromText('MULTIPOINT((2 3), (7 8 9.5))', 23);
下面的示例使用方法 STGeometryN()来检索有关集合中第一个点的说明。
SELECT @g.STGeometryN(1).STAsText();//集合的计数是从1开始的
LineString
LineString 是一个一维对象,表示一系列点和连接这些点的线段。
一个 LineString 实例必须由至少两个非重复点组成,也可以为空。
如图中所示:
图 1 显示的是一个简单、非闭合的 LineString 实例。
图 2 显示的是一个不简单、非闭合的 LineString 实例。
图 3 显示的是一个闭合、简单的 LineString 实例,因此是一个环。
图 4 显示的是一个闭合、不简单的 LineString 实例,因此不是一个环。
下面的示例说明如何创建一个包含三个点且 SRID 为 0 的 geometry LineString 实例:
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(1 1, 2 4, 3 9)', 0);
此 LineString 实例中的每个点都可以包含 Z(仰角)和 M(度量)值。
下面这个示例向上例中创建的 LineString 实例添加了 M 值。
M 和 Z 可以为 Null 值。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(1 1 NULL 0, 2 4 NULL 12.3, 3 9 NULL 24.5)', 0);
MultiLineString
MultiLineString 是零个或更多 geometry 或 geography LineString 实例的集合。
如图中所示:
图 1 显示的是一个简单的 MultiLineString 实例,其边界是其两个 LineString 元素的四个端点。
图 2 显示的是一个简单的 MultiLineString 实例,因为只有 LineString 元素的端点相交。
边界是两个不重叠的端点。
图 3 显示的是一个不简单的 MultiLineString 实例,因为它的其中一个 LineString 元素的内部出现了相交。
此 MultiLineString 实例的边界是四个端点。
图 4 显示的是一个不简单、非闭合的 MultiLineString 实例。
图 5 显示的是一个简单、非闭合的 MultiLineString。
它没有闭合是因为它的 LineStrings 元素没有闭合。
而其简单的原因在于,其任何 LineStrings 实例的内部都没有出现相交。
图 6 显示的是一个简单、闭合的 MultiLineString 实例。
它为闭合的是因为它的所有元素都是闭合的。
而其简单的原因在于,其所有元素都没有出现内部相交现象。
下面的示例创建了一个包含两个 LineString 元素且 SRID 为 0 的简单 geometry MultiLineString 实例。
DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((0 2, 1 1), (1 0, 1 1))');
若要使用不同的 SRID 实例化此实例,请使用 STGeomFromText() 或 STMLineStringFromText()。
也可以使用 Parse(),然后修改 SRID,如下例所示。
DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((0 2, 1 1), (1 0, 1 1))');
SET @g.STSrid = 13;
多边形
Polygon 是存储为一系列点的二维表面,这些点定义一个外部边界环和零个或多个内部环。
可以从至少具有三个不同点的环中构建一个 Polygon 实例。
Polygon 实例也可以为空。
Polygon 的外部环和任意内部环定义了其边界。
环内部的空间定义了 Polygon 的内部。
Polygon 的内部环在单个切点处既可与自身接触也可彼此接触,但如果 Polygon 的内部环交叉,则该实例无效。
如图中所示:
图 1 是由外部环定义其边界的 Polygon 实例。
图 2 是由外部环和两个内部环定义其边界的 Polygon 实例。
内部环内的面积是 Polygon 实例的外部环的一部分。
图 3 是一个有效的 Polygon 实例,因为其内部环在单个切点处相交。
下例创建了一个带有孔和 SRID 为 10 的简单 geometry Polygon 实例。
DECLARE @g geometry;
SET @g = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);
可能输入无效的实例并转换为有效的 geometry 实例。
在下列 Polygon 示例中,内部环和外部环重叠且该实例无效。
DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))');
在下例中,无效实例通过 MakeValid() 成为有效实例。
SET @g = @g.MakeValid();
SELECT @g.ToString();
以上示例中返回的 geometry 实例为 MultiPolygon。
MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)), ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0))) MultiPolygon
MultiPolygon 实例是零个或更多个 Polygon 实例的集合。
如图中所示:
图 1 是一个包含两个 Polygon 元素的 MultiPolygon 实例。
边界由两个外环和三个内环界定。
图 2 是一个包含两个 Polygon 元素的 MultiPolygon 实例。
边界由两个外环和三个内环界定。
这两个 Polygon 元素在切点处相交。
下面的示例演示如何创建 geometry MultiPolygon 实例,并返回第二个组件的熟知文本 (WKT)。
DECLARE @g geometry;
SET @g = geometry::Parse('MULTIPOLYGON(((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))');//括号要注意,一个()代表LineString,(())代表面,((()))代表多面
SELECT @g.STGeometryN(2).STAsText();
该示例实例化一个空的 MultiPolygon 实例。
DECLARE @g geometry;
SET @g = geometry::Parse('MULTIPOLYGON EMPTY');
GeometryCollection
GeometryCollection 是零个或更多个 geometry 或 geography 实例的集合。
GeometryCollection 可以为空。
下面的示例实例化一个包含 Point 实例和 Polygon 实例的 geometry GeometryCollection,它具有 Z 值,且 SRID 为 1。
DECLARE @g geometry;
SET @g = geometry::STGeomCollFromText('GEOMETRYCOLLECTION(POINT(3 3 1), POLYGON((0 0 2, 1 10 3, 1 0 4, 0 0 2)))', 1);
两种数据类型之间的差别
两种空间数据类型的行为经常非常相似,但在数据存储方式和操作方式上存在某些重要的差别。
空间数据类型中的度量
在平面(或平面球)系统中,均以相同的度量单位为坐标测量距离和面积。
如果使用 geometry 数据类型,(2, 2) 和 (5, 6) 之间的距离为 5 个单位,与所用的单位无关。
在椭圆体(或圆球)系统中,坐标以经度和纬度的度数给定。
但是,即使测量可能依据的是 geography 实例的空间引用标识符 (SRID),长度和面积的测量单位也通常为米或平方米。
geography 数据类型最常见的度量单位为米。
空间数据的方向
在平面系统中,多边形的环方向并非重要因素。
例如,((0, 0), (10, 0), (0, 20), (0, 0)) 描述的多边形与 ((0, 0), (0, 20), (10, 0), (0, 0)) 描述的多边形相同。
SQL 规范的 OGC 简单特征未规定环顺序,并且 SQL Server 不会强制环的顺序。
在椭圆体系统中,多边形无意义,或者模糊不清,没有方向。
例如,赤道周围的环是否描述了北半球或南半球?如果我们使用 geography 数据类型存储空间实例,必须指定环的方向并准确地描述实例的位置。
SQL Server 2008 在使用 geography 数据类型时具有以下限制:
每个 geography 实例必须能够容纳在单个半球的内部。
任何大于半球的对象都无法存储。
使用开放地理空间联盟 (OGC) 熟知文本 (Well-Known Text, WKT) 或熟知二进制 (Well-Known Binary, WKB) 表示形式并且会产生大于一个半球的对象的任何 geography 实例都会引发一个 ArgumentException 异常。
如果方法的结果不能容纳在单个半球内部,则需要输入两个 geography 实例的 geography 数据类型方法(如 STIntersection()、STUnion()、STDifference() 和 STSymDifference())将返回 Null。
如果输出超过单个半球,STBuffer() 也将返回 Null。
在地理数据类型中外环和内环并不重要
SQL 规范的 OGC 简单特征讨论了外环和内环,但此差别对 SQL Server geography 数据类型来说几乎毫无意义:多边形的任何环都可以作为外环。
(二)Geometry 数据类型入门
平面空间数据类型 geometry 是作为 SQL Server 中的 .NET 公共语言运行时 (CLR) 数据类型实现的。
此类型表示欧几里得(平面)坐标系中的数据。
注册 geometry 类型
geometry 类型已进行预定义,并可在每个数据库中使用。
您可以创建 geometry 类型的表列并对 geometry 数据进行操作,就像使用其他 CLR 类型一样。
示例
以下两个示例显示了如何添加和查询几何图形数据。
第一个示例创建了带有标识列和 geometry列 GeomCol1的表。
第三列将geometry列呈现为其开放地理空间联盟 (OGC) 熟知文本 (WKT) 表示形式,并使用 STAsText()方法。
接下来将插入两行:一行包含 geometry类型的 LineString实例,一行包含 Polygon实例。
IF OBJECT_ID ( 'dbo.SpatialTable', 'U' ) IS NOT NULL
DROP TABLE dbo.SpatialTable;
GO
CREATE TABLE SpatialTable
( id int IDENTITY (1,1),
GeomCol1 geometry,
GeomCol2 AS GeomCol1.STAsText() );
GO
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));
INSERT INTO SpatialTable (GeomCol1)
VALUES (geometry::STGeomFromText('POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))', 0));
GO
第二个示例使用 STIntersection()方法返回两个以前插入的 geometry 实例相交的点。
DECLARE @geom1 geometry;
DECLARE @geom2 geometry;
DECLARE @result geometry;
SELECT @geom1 = GeomCol1 FROM SpatialTable WHERE id = 1;
SELECT @geom2 = GeomCol1 FROM SpatialTable WHERE id = 2;
SELECT @result = @geom1.STIntersection(@geom2);
SELECT @result.STAsText();
(三)几个常用的方法
从实例返回熟知文本和熟知二进制
1、STAsText
返回 geometry 实例的开放地理空间联盟 (OGC) 熟知文本 (WKT) 表示形式。
此文本将不包含该实例传递的任何 Z(标高)或 M(度量)值。
语法:.STAsText()
返回类型:SQL Server 返回类型:nvarchar(max)
CLR 返回类型:SqlChars
示例:下面的示例使用 STAsText() 根据文本创建一个从 (0,0) 到 (2,3) 的 LineString几何图形实例。
然后,它以文本的形式返回结果。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0 0 1, 2 3 1 2)', 0);
SELECT @g.STAsText();
将返回 LINESTRING (0 0, 2 3)
2、ToString
返回几何图形实例的开放地理空间联盟 (OGC) 熟知文本 (WKT) 表示形式,增加了该实例传递的任何 Z(标高)和 M(度量)值。
语法:.ToString()
返回类型:SQL Server 返回类型:nvarchar(max)
CLR 返回类型:SqlString
备注:在针对 Null 实例调用时,此方法将返回字符串“Null”。
对于非 Null 实例,此方法与使用 AsTextZM() 等效。
示例:下面的示例创建一个 LineString 实例,并使用 AsGML() 提取该实例的文本说明。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0 1 1, 0 1 2 3, 1 0 4 5)', 0);
SELECT @g.ToString();
将返回 LINESTRING (0 0 1 1, 0 1 2 3, 1 0 4 5)
3、STAsTextZM
关于此方法,SQL Server 联机丛书上没有介绍,不过根据上文ToString()方法,提到了一点
4、STAsBinary
返回几何图形实例的开放地理空间联盟 (OGC) 熟知二进制 (WKB) 表示形式。
此值不包含该实例传递的任何 Z 或 M 值。
语法:.STAsBinary()
返回类型:SQL Server 返回类型:varbinary(max)
CLR 返回类型:SqlBytes
示例:下面的示例使用 STAsBinary() 根据文本创建一个从 (0,0) 到 (2,3) 的 LineString 几何图形实例。
然后,它以 WKB 的形式返回结果。
DECLARE @g geometry;
查询有效性、实例类型和几何图形集合信息
1、STGeometryType
返回由 geometry 实例表示的开放地理空间联盟 (OGC) 类型名称。
返回类型:SQL Server 返回类型:nvarchar(4000)
CLR 返回类型:SqlString
备注:可以由 STGeometryType() 返回的 OGC 类型包括 Point、LineString、Polygon、GeometryCollection、MultiPoint、MultiLineString 和 MultiPolygon。
示例:下面的示例使用 STGeometryType() 创建一个 Polygon 实例并确认该实例是多边形。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0))', 0);
SELECT @g.STGeometryType();
将返回 Polygon
2、InstanceOf
一个用于测试 geometry 实例是否与指定的类型相同的方法。
如果 geometry 实例的类型与指定的类型相同,或者指定的类型是该实例类型的祖先,则返回 1;否则,返回 0。
语法:.InstanceOf(geometry_type)
参数:geometry_type 一个 nvarchar(4000) 字符串,用于指定 geometry 类型层次结构中公开的 12 个类型之一。
返回类型:SQL Server 返回类型:bit
CLR 返回类型:SqlBoolean
备注:输入的方法必须为以下之一:Geometry、Point、Curve、LineString、Surface、Polygon、GeometryCollection、MultiSurface、MultiPolygon、MultiCurve、MultiLineString 和 MultiPoint。
如果将任何其他字符串用于输入,此方法将引发 ArgumentException。
示例:下面的示例创建一个 MultiPoint 实例,并使用 InstanceOf() 查看该实例是否为 GeometryCollection。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('MULTIPOINT(0 0, 13.5 2, 7 19)', 0);
根据 geometry 实例的开放地理空间联盟 (OGC) 类型,如果可确定该实例的格式正确,则返回 true。
如果 geometry 实例格式不正确,则返回 false。
语法:.STIsValid()
返回值:SQL Server 返回类型:bit
CLR 返回类型:SqlBoolean
备注:geometry 实例的 OGC 类型可通过调用 STGeometryType() 来确定。
SQL Server 只生成有效的 geometry 实例,但允许存储和检索无效的实例。
可使用 MakeValid()方法检索表示任何无效实例的相同点集的有效实例。
示例:下面的示例创建一个空的 geometry 实例并使用 STIsValid() 来测试该实例是否有效。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STIsValid();
4、MakeValid
将无效 geometry 实例转换为具有有效开放地理空间联盟 (OGC) 类型的 geometry 实例。
语法:.MakeValid ()
返回类型:SQL Server 返回类型:geometry
CLR 返回类型:SqlGeometry
备注:此方法可能会导致 geometry 实例的类型有所变化,还会导致 geometry 实例的点略微移位。
示例:第一个示例创建一个与其自身重叠的无效 LineString 实例,并使用 STIsValid() 来确认该实例是无效实例。
STIsValid()
针对无效实例返回值 0。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 2, 1 1, 1 0, 1 1, 2 2)', 0);
SELECT @g.STIsValid();
第二个示例使用 MakeValid() 使该实例有效并测试该实例是否的确有效。
STIsValid() 针对有效实例返回值 1。
第三个示例验证是否已将该实例更改为有效实例。
SELECT @g.ToString();
在此示例中,在选择 LineString 实例时,值将作为有效的 MultiLineString 实例返回。
MULTILINESTRING ((0 2, 1 1, 2 2), (1 1, 1 0))
5、STNumGeometries
返回构成 geometry 实例的几何图形的数目。
语法:.STNumGeometries()
返回类型:SQL Server 返回类型:int
CLR 返回类型:SqlInt32
备注:如果 geometry 实例不是 MultiPoint、MultiLineString、MultiPolygon 或 GeometryCollection 实例,则此方法返回 1;如果 geometry 实例为空,则返回 0。
如果 GeometryCollection 嵌套了空元素,则 STNumGeometries()将不会返回 0。
虽然 GeometryCollection 实例中的元素为空,但实例自身不是空集。
示例:下面的示例创建一个 MultiPoint 实例,并使用 STNumGeometries() 确定该实例包含的几何图形数。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('MULTIPOINT(0 0, 13.5 2, 7 19)', 0);
SELECT @g.STNumGeometries();
6、STGeometryN
返回 geometry collection 中的指定几何图形。
语法:.STGeometryN(expression)
参数:expression 一个 int 表达式,其值介于 1 和 geometry collection 中的 geometry 实例数之间。
返回类型:SQL Server 返回类型:geometry
CLR 返回类型:SqlGeometry
备注:如果 expression 参数大于 STNumGeometries() 的结果,则此方法返回 null;如果该参数小于 1,则将引发 ArgumentOutOfRangeException。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('MULTIPOINT(0 0, 13.5 2, 7 19)', 0);
SELECT @g.STGeometryN(2).ToString();
(四)查询几何图形实例的属性和行为
所有 geometry 实例都有很多可以通过 SQL Server 提供的方法进行检索的属性。
下列主题定义了几何图形类型的属性和行为,并为查询每种图形定义了方法。
点数
所有非空 geometry 实例都由“点”组成。
这些点表示在其上绘制几何图形的面的 X 和 Y 坐标。
geometry 提供许多用于查询实例的点的内置方法。
1、STNumPoints
返回 geometry 实例的每个图形中的点数的总和。
语法:.STNumPoints()
返回类型:SQL Server 返回类型:int
CLR 返回类型:SqlInt32
备注:此方法对 geometry 实例说明中的点进行计数。
重复的点将计算在内。
如果此实例为 collection 类型,则此方法返回它的每个元素中的点数的总和。
示例:下面的示例创建一个 LineString 实例,并使用 STNumPoints() 确定该实例说明中使用的点数。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STNumPoints();
2、STPointN
返回 geometry 实例中的指定点。
语法:.STPointN(expression)
参数:expression 一个 int 表达式,其值介于 1 和 geometry 实例中的点数之间。
返回类型:SQL Server 返回类型:geometry
备注:如果 geometry 实例是用户创建的,则 STPointN()返回由 expression 通过按照点的原始输入顺序对点进行排序而指定的点。
如果 geometry 实例是系统构建的,则 STPointN()返回由 expression 通过按照点的输出顺序对所有点进行排序而指定的点,点的排序顺序为:首先按几何图形、然后按几何图形中的环(如果适用),最后按环中的点。
此顺序是确定的。
如果使用小于 1 的值来调用此方法,则会引发 ArgumentOutOfRangeException。
如果使用大于实例中点数的值来调用此方法,则返回 Null。
示例:下面的示例创建 LineString 实例,并使用 STPointN() 检索实例说明中的第二个点。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STPointN(2).ToString();
3、STPointOnSurface
返回一个位于 geometry 实例内部的任意点。
语法:.STPointOnSurface()
返回类型:SQL Server 返回类型:geometry
CLR 返回类型:SqlGeometry
开放地理空间联盟 (OGC) 类型:Point
返回类型:如果该实例不为空,则此方法返回 Null。
示例:下面的示例创建一个 Polygon 实例,并使用 STPointOnSurface() 查找该实例上的点。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @g.STPointOnSurface().ToString();
4、STStartPoint
返回 geometry 实例的起点。
语法:.STStartPoint()
返回类型:SQL Server 返回类型:geometry
备注:STStartPoint() 等效于 STPointN (1)。
示例:下面的示例创建一个 LineString 实例,并使用 STStartPoint() 检索该实例的起点。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0;
SELECT @g.STStartPoint().ToString();
5、STEndpoint
返回 geometry 实例的终点。
语法:.STEndPoint()
返回类型:SQL Server 返回类型:geometry
CLR 返回类型:SqlGeometry
开放地理空间联盟 (OGC) 类型:Point
备注:STEndPoint()等效于 STPointN (x.NumPoints())。
如果针对空 geometry 实例调用此方法,则此方法返回 Null。
示例:下面的示例使用 STGeomFromText()创建 LineString实例,并使用 STEndpoint()检索 LineString的终点。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STEndPoint().ToString();
6、STX
Point 实例的 X 坐标属性。
语法:.STX
返回类型:SQL Server 类型:float
CLR 类型:SqlDouble
备注:如果 geometry 实例不是一个点,此属性的值将为 Null。
此属性是只读的。
SET @g = geometry::STGeomFromText('POINT(3 8)', 0);
SELECT @g.STX;
7、STY
Point 实例的 Y 坐标属性。
语法:.STY
返回类型:SQL Server 类型:float
CLR 类型:SqlDouble
备注:如果 geometry 实例为一个点,此属性的值将为 Null。
此属性是只读的。
示例:下面的示例创建 Point 实例,并使用 STY 检索该实例的 Y 坐标。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT(3 8)', 0);
SELECT @g.STY;
8、STCentroid
返回由一个或多个多边形组成的 geometry 实例的几何中心。
语法:.STCentroid()
返回类型:SQL Server 返回类型:geometry
CLR 返回类型:SqlGeometry
开放地理空间联盟 (OGC) 类型:Point
备注:如果 geometry 实例不是 Polygon 或 MultiPolygon 类型,则 STCentroid() 返回 Null。
示例:下面的示例使用 STCentroid() 创建 polygon geometry 实例,并计算其中点。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
非空 geometry 实例可以为零维、一维或二维。
零维 geometries(例如 Point 和 MultiPoint)没有长度或面积。
一维对象(例如 LineString 和 MultiLineString)具有长度。
二维实例(例如 Polygon 和 MultiPolygon)具有面积和长度。
空实例将报告为 -1 维,并且GeometryCollection 将根据其内容类型报告一个面积。
1、STDimension
返回 geometry 实例的最大维度。
语法:.STDimension()
返回类型:SQL Server 返回类型:int
CLR 返回类型:SqlInt32
备注:如果 geometry 实例为空,则 STDimension() 返回 -1。
示例:下面的示例使用 STDimension() 创建一个存放 geometry 实例的表变量,并插入一个 Point、一个 LineString 和一个 Polygon。
DECLARE @temp table ([name] varchar(10), [geom] geometry);
INSERT INTO @temp values ('Point', geometry::STGeomFromText('POINT(3 3)', 0));
INSERT INTO @temp values ('LineString', geometry::STGeomFromText('LINESTRING(0 0, 3 3)', 0));
INSERT INTO @temp values ('Polygon', geometry::STGeomFromText('POLYGON((0 0, 3 0, 0 3, 0 0))', 0));
SELECT [name], [geom].STDimension() as [dim] FROM @temp;
2、STLength
返回 geometry 实例中的元素的总长度。
语法:.STLength()
返回类型:SQL Server 返回类型:float
CLR 返回类型:SqlDouble
备注:如果 geography 实例是闭合的,则其长度按围绕该实例的总长度进行计算;任何多边形的长度为其周界,点的长度为 0。
任何 geometry collection 类型的长度通过计算该集合内包含的 geometry 实例的长度和得到。
示例:下面的示例创建 LineString 实例并使用 STLength() 确定该实例的长度。
SELECT @g.STLength();
3、STArea
返回 geometry 实例的总面积。
语法:.STArea()
返回类型:SQL Server 返回类型:float
CLR 返回类型:SqlDouble
备注:如果 geometry 实例仅包含 0 维和 1 维图形,或者为空,则 STArea() 返回 0。
示例:下面的示例使用 STArea() 创建 Polygon geometry 实例,并计算该多边形的面积。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @g.STArea();
空
“空”geometry 实例不包含任何点。
空的 LineString 和 MultiLineString 实例的长度为零。
空的 Polygon 和 MultiPolygon 实例的面积为 0。
确定实例是否为空STIsEmpty()
如果 geometry 实例为空,则返回 1。
如果 geometry 实例不为空,则返回 0。
语法:.STIsEmpty()
返回类型:SQL Server 返回类型:bit
CLR 返回类型:SqlBoolean
示例:下面的示例创建一个空的 geometry 实例并使用 STIsEmpty() 来测试该实例是否为空。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON EMPTY', 0);
SELECT @g.STIsEmpty();
返回类型:SQL Server 返回类型:bit
CLR 返回类型:SqlBoolean
备注:简单而言,geometry 实例必须符合以下所有要求:
实例的每个图形不能与自身相交,但其终点除外。
实例的任何两个图形可在某个点上相交,但两个边界上的点除外。
示例:下面的示例创建一个非简单 LineString 实例,该实例与自身相交并使用 STIsSimple() 来测试 LineString 是否为简单类型。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 0 2, 2 0)', 0);
SELECT @g.STIsSimple();
边界、内部、外部
geometry 实例的“内部”是指由实例占用的空间,而“外部”是指未占用的空间。
“边界”由 OGC 定义,如下所示:
Point 和 MultiPoint 实例没有边界。
LineString 和 MultiLineString 边界由起始点和终点形成,并删除那些出现次数为偶数的点。
DECLARE @g geometry;
SET @g = geometry::Parse('MULTILINESTRING((0 1, 0 0, 1 0, 0 1), (1 1, 1 0))');
SELECT @g.STBoundary().ToString();
Polygon 或 MultiPolygon 实例的边界是其环的集合。
DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0), (1 1, 1 2, 2 2, 2 1, 1 1))');
SELECT @g.STBoundary().ToString();
返回实例的边界STBoundary
返回类型:SQL Server 返回类型:geometry
CLR 返回类型:SqlGeometry
示例:下面的示例使用 STBoundary() 创建 LineString geometry 实例。
然后,该示例返回 LineString 的边界。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 0 2, 2 0)', 0);
SELECT @g.STBoundary().ToString();
包络线
geometry 实例的“包络线”又称为“边界框”,它是一个由实例的最小和最大坐标 (X,Y) 形成的轴对齐矩形。
STEnvelope(geometry 数据类型)
返回实例的最小轴对齐边界矩形。
语法:.STEnvelope()
返回类型:SQL Server 返回类型:geometry
CLR 返回类型:SqlGeometry
下面的示例使用 STGeomFromText() 创建从 (0,0) 到 (2,3) 的 LineString 实例,并使用 STEnvelope() 返回 LineString 的边界框。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 3)', 0);
SELECT @g.STEnvelope().ToString();
闭合
“闭合的”geometry 实例是指起始点和终点相同的图形。
Polygon 实例是闭合的。
Point 实例不是闭合的。
环是一个简单、闭合的 LineString 实例。
确定实例是否闭合STIsClosed
如果给定的 geometry 实例的起点和终点相同,则返回 1。
对于 geometry collection 类型,如果所包含的每个 geometry 实例都是闭合的,则返回 1。
如果该实例不是闭合的,则返回 0。
返回类型:SQL Server 返回类型:bit
CLR 返回类型:SqlBoolean
备注:如果 geometry 实例的任何图形不是点,或者如果该实例为空,则此方法返回 0。
所有 Polygon 实例都被视为是闭合的。
示例:下面的示例创建一个 LineString 实例,并使用 STIsClosed() 来测试 LineString 是否为闭合的。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0)', 0);
SELECT @g.STIsClosed();
确定实例是否为环STIsRing
如果 geometry 实例符合下列要求,则返回 1:
该实例为 LineString 实例。
该实例为闭合类型。
该实例为简单类型。
如果 LineString 实例不符合这些要求,则返回 0。
为了使 geometry 实例成为闭合且简单类型,当调用该实例时 STIsClosed() 和 STIsSimple() 都必须返回 1。
若要确定 geometry 的实例类型,请使用 STGeometryType()。
确定 geometry 的实例类型STGeometryType()
语法:.STIsRing()
返回类型:SQL Server 返回类型:bit
CLR 返回类型:SqlBoolean
备注:如果该实例不是 LineString,则此方法返回 Null。
示例:下面的示例创建一个 LineString 实例并使用 STIsRing() 来测试该实例是否为一个环。
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 1 0, 0 0)', 0);。