创建、构造和查询几何图形实例

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

平面空间数据类型 geometry 表示欧几里得(平面)坐标系中的数据。 此类型在 SQL Server 中作为公共语言运行时 (CLR) 数据类型实现。

geometry 类型已进行预定义,可在每个数据库中使用。 你可以创建 geometry 类型的表列并对 geometry 数据进行操作,就像使用其他 CLR 类型一样。

SQL Server 支持的 geometry 数据类型(平面)符合开放地理空间信息联盟 (OGC) 的 SQL 简单特征规范 1.1.0 版。

有关 OGC 规范的详细信息,请参阅以下内容:

SQL Server 支持现有 GML 3.1 标准的子集,该标准在下面的架构中定义:https://schemas.microsoft.com/sqlserver/profiles/gml/SpatialGML.xsd

创建或构建新的几何图形实例

从现有实例创建新的几何图形实例

geometry 数据类型提供了许多内置方法,你可以使用这些方法基于现有实例创建新的 geometry 实例。

在几何图形周围创建缓冲区
STBuffer(geometry 数据类型)

BufferWithTolerance(geometry 数据类型)

创建简化版的几何图形
Reduce(geometry 数据类型)

创建几何图形的凸包
STConvexHull(geometry 数据类型)

从两个几何图形的交集创建几何图形
STIntersection(geometry 数据类型)

从两个几何图形的并集创建几何图形
STUnion(geometry 数据类型)

从一个几何图形中与另一个几何图形不重叠的点创建几何图形
STDifference(geometry 数据类型)

从两个几何图形不重叠的点创建几何图形
STSymDifference(geometry 数据类型)

创建位于现有几何图形上的任意 Point 实例
STPointOnSurface(geometry 数据类型)

从熟知文本输入构造几何图形实例

geometry 数据类型提供了若干种用开放地理空间联盟 (OGC) WKT 表示形式生成几何图形的内置方法。 WKT 标准是一种允许几何图形数据以文本形式交换的文本字符串。

用 WKT 输入构造任意类型的几何图形实例
STGeomFromText(geometry 数据类型)

Parse(geometry 数据类型)

用 WKT 输入构造几何图形 Point 实例
STPointFromText(geometry 数据类型)

用 WKT 输入构造几何图形 MultiPoint 实例
STMPointFromText(geometry 数据类型)

用 WKT 输入构造几何图形 LineString 实例
STLineFromText(geometry 数据类型)

用 WKT 输入构造几何图形 MultiLineString 实例
STMLineFromText(geometry 数据类型)

用 WKT 输入构造几何图形 Polygon 实例
STPolyFromText(geometry 数据类型)

用 WKT 输入构造几何图形 MultiPolygon 实例
STMPolyFromText(geometry 数据类型)

用 WKT 输入构造几何图形 GeometryCollection 实例
STGeomCollFromText(geometry 数据类型)

从熟知二进制输入构造几何图形实例

WKB 是由 Open Geospatial Consortium (OGC) 指定的二进制格式,允许 在客户端应用程序和 SQL 数据库之间交换几何图形 数据。 以下函数接受用于构造几何图形的 WKB 输入:

用 WKB 输入构造任意类型的几何图形实例
STGeomFromWKB(geometry 数据类型)

用 WKB 输入构造几何图形 Point 实例
STPointFromWKB(geometry 数据类型)

用 WKB 输入构造几何图形 MultiPoint 实例
STMPointFromWKB(geometry 数据类型)

用 WKB 输入构造几何图形 LineString 实例
STLineFromWKB(geometry 数据类型)

用 WKB 输入构造几何图形 MultiLineString 实例
STMLineFromWKB(geometry 数据类型)

用 WKB 输入构造几何图形 Polygon 实例
STPolyFromWKB(geometry 数据类型)

用 WKB 输入构造几何图形 MultiPolygon 实例
STMPolyFromWKB(geometry 数据类型)

用 WKB 输入构造几何图形 GeometryCollection 实例
STGeomCollFromWKB(geometry 数据类型)

用 GML 文本输入构造几何图形实例

geometry 数据类型提供了一种用 GML(几何对象的 XML 表示形式)生成 geometry 实例的方法。 SQL Server 支持 GML 的子集。

用 GML 输入构造任意类型的几何图形实例
GeomFromGml(geometry 数据类型)

从几何图形实例返回熟知文本和熟知二进制

可以使用以下方法返回 WKT 或 WKB 格式的 geometry 实例:

返回几何图形实例的 WKT 表示形式
STAsText(geometry 数据类型)

ToString(geometry 数据类型)

返回包括任何 Z 值和 M 值的几何图形的 WKT 表示形式
AsTextZM(geometry 数据类型)

返回几何图形实例的 WKB 表示形式
STAsBinary(geometry 数据类型)

返回几何图形实例的 GML 表示形式
AsGml(geometry 数据类型)

查询几何图形实例的属性和行为

所有 geometry 实例都有很多可以通过 SQL Server 提供的方法进行检索的属性。 下列主题定义了几何图形类型的属性和行为,并为查询每种图形定义了方法。

有效性、实例类型和 GeometryCollection 信息

构造 geometry 实例后,就可以使用以下方法确定其格式是否正确、返回实例类型,或者,如果它是集合实例,则返回特定的 geometry 实例。

返回几何图形的实例类型
STGeometryType(geometry 数据类型)

确定几何图形是否为给定的实例类型
InstanceOf(geometry 数据类型)

确定几何图形实例对其实例类型而言格式是否正确
STIsValid(geometry 数据类型)

将几何图形实例转换成具有实例类型的格式正确的几何图形实例
MakeValid(geometry 数据类型)

返回几何图形集合实例中的几何图形数目
STNumGeometries(geometry 数据类型)

返回几何图形集合实例中的特定几何图形
STGeometryN(geometry 数据类型)STGeometryN(geometry 数据类型)

点数

所有非空 geometry 实例都由“点” 组成。 这些点表示在其上绘制几何图形的面的 X 和 Y 坐标。 geometry 提供许多用于查询实例的点的内置方法。

返回构成实例的点数。
STNumPoints(geometry 数据类型)

返回实例中的特定点
STPointN

返回位于实例上的某个任意点
STPointOnSurface

返回实例的起始点
STStartPoint

返回实例的终点
STEndpoint

返回点实例的 X 坐标
STX(geometry 数据类型)

返回点实例的 Y 坐标
STY

返回 Polygon、CurvePolygon 或 MultiPolygon 实例的几何中心点
STCentroid

维度

非空 geometry 实例可以为零维、一维或二维。 零维 geometry(如 PointMultiPoint)没有长度或面积。 一维对象(如 LineString、CircularString、CompoundCurveMultiLineString)有长度。 二维实例(如 PolygonCurvePolygonMultiPolygon)有面积和长度。 空实例将报告为 -1 维,并且 GeometryCollection 将根据其内容类型报告一个面积。

返回实例的维度
STDimension

返回实例的长度
STLength

返回实例的面积
STArea

geometry 实例不包含任何点。 空的 LineString, CircularStringCompoundCurveMultiLineString 实例的长度为零。 空的 PolygonCurvePolygonMultiPolygon 实例的面积为 0。

确定实例是否为空
STIsEmpty

简单

为了使实例的 geometry 变得“简单” ,必须符合以下全部两个要求:

  • 实例的每个图形不能与自身相交,但其终点除外。

  • 实例的任何两个图形可在某个点上相交,但两个边界上的点除外。

注意

空几何图形总是简单的。

确定实例是否是简单的
STIsSimple

边界、内部和外部

geometry 实例的“内部”是指由实例占用的空间,而“外部”是指未占用的空间。

“边界” 由 OGC 定义,如下所示:

  • PointMultiPoint 实例没有边界。

  • LineStringMultiLineString 边界由起始点和终点形成,并删除那些出现次数为偶数的点。

DECLARE @g geometry;  
SET @g = geometry::Parse('MULTILINESTRING((0 1, 0 0, 1 0, 0 1), (1 1, 1 0))');  
SELECT @g.STBoundary().ToString();  

PolygonMultiPolygon 实例的边界是其环的集合。

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

包络线

geometry 实例的“包络线”又称为“边界框”,它是一个由实例的最小和最大坐标 (X,Y) 形成的轴对齐矩形。

返回实例的包络线
STEnvelope

结尾

闭合的 geometry 实例是指起始点和终点相同的图形。 Polygon 实例被视为闭合的。 Point 实例不是闭合的。

环是一个简单、闭合的 LineString 实例。

确定实例是否闭合
STIsClosed

确定实例是否为环
STIsRing

返回多边形实例的外环
STExteriorRing

返回多边形的内环数
STNumInteriorRing

返回多边形的指定内环
STInteriorRingN

空间引用标识符 (SRID)

空间引用标识符 (SRID) 是指定 geometry 实例所在的坐标系的标识符。 两个拥有不同 SRID 的实例是不可比的。

设置或返回实例的 SRID
STSrid

注意

此属性可以进行修改。

确定几何图形实例之间的关系

geometry 数据类型提供了许多内置方法,你可以使用这些方法确定两个 geometry 实例之间的关系。

确定两个实例是否包含相同的点集
STEquals

确定两个实例是否不相接
STDisjoint

确定两个实例是否相交
STIntersects

确定两个实例是否接触
STTouches

确定两个实例是否重叠
STOverlaps

确定两个实例是否交叉
STCrosses

确定某个实例是否在另一个实例内部
STWithin

确定某个实例是否包含另一个实例
STContains

确定某个实例是否与另一个实例重叠
STOverlaps

确定两个实例是否存在空间关系
STRelate

确定两个几何图形中的点之间的最短距离
STDistance

几何图形实例默认 SRID 为零

SQL Server 中 geometry 实例的默认 SRID 为 0。 利用 geometry 空间数据,执行计算是不需要空间实例的指定 SRID 的;因此,实例可驻留在未定义的平面空间。 要在 geometry 数据类型方法的计算中指明未定义的平面空间,SQL Server 数据库引擎使用 SRID 0。

示例

以下两个示例显示了如何添加和查询几何图形数据。

示例 A。

此示例创建了一个带有标识列和 geometryGeomCol1 的表。 第三列将 geometry 列呈现为其开放地理空间信息联盟 (OGC) 熟知文本 (WKT) 表示形式,并使用 STAsText() 方法。 接下来将插入两行:一行包含 LineString 类型的 geometry实例,一行包含 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  

示例 B。

此示例使用 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();  

另请参阅

空间数据 (SQL Server)