CurvePolygon

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Microsoft Fabric 中的 SQL 分析终结点 Microsoft Fabric 中的仓库

CurvePolygon 是由外部边界环和SQL 数据库引擎空间数据中的零个或多个内环定义的拓扑封闭表面。

重要

有关 SQL Server 2012 (11.x) 中引入的空间功能的详细说明和示例(包括 CurvePolygon 子类型),请下载白皮书 SQL Server 2012 中的新空间功能

下面的条件定义一个 CurvePolygon 实例的属性:

  • CurvePolygon 实例的边界由外环和所有内环界定。

  • CurvePolygon 实例的内部是外环和所有内环之间的空间。

CurvePolygon 实例不同于 Polygon 实例,该多边形实例可以包含以下圆弧线段:CircularStringCompoundCurve

CompoundCurve 实例

下图显示有效的 CurvePolygon 图形:

接受的实例

为使 CurvePolygon 实例可接受,它需要或者为空,或者仅包含接受的圆弧环。 接受的圆弧环满足以下要求。

  1. 是接受的 LineStringCircularStringCompoundCurve 实例。 有关接受的实例的详细信息,请参阅 LineStringCircularStringCompoundCurve

  2. 具有至少四个点。

  3. 开始和终结点具有相同的 X 和 Y 坐标。

    注意

    Z 和 M 值被忽略。

下面的示例显示接受的 CurvePolygon 实例。

DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';  
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'  
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';  

@g3 已被接受,即使在起点和终点具有不同的 Z 值时也是如此,因为 Z 值被忽略。 @g5 已被接受,即使 geography 类型实例无效时也是如此。

下面的示例引发 System.FormatException

DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';  

@g1 不被接受,因为起点和终点不具有相同的 Y 值。 @g2 不被接受,因为环没有足够的点。

有效实例

为使 CurvePolygon 实例有效,外环和内环都必须满足以下条件:

  1. 它们只能触摸单个切点。
  2. 它们不能彼此交叉。
  3. 每个环都必须至少包含四个点。
  4. 每个环都必须是可接受的曲线类型。

CurvePolygon 实例根据其是 geometry 还是 geography 数据类型,也需要满足特定的条件。

geometry 数据类型

一个有效的 geometryCurvePolygon 实例必须具有以下属性:

  1. 所有内环都必须包含在外环内。
  2. 可具有多个内环,但一个外环不能包含另一个内环。
  3. 环不能与自身或其他环交叉。
  4. 环只能在单个切点处接触(环接触的点数必须有限)。
  5. 多边形的内部必须连接。

下面的示例显示有效的 geometryCurvePolygon 实例。

DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
SELECT @g1.STIsValid(), @g2.STIsValid();  

CurvePolygon 实例与 Polygon 实例具有相同的有效性规则,但 CurvePolygon 实例可以接受新的圆弧线段类型除外。 有关有效实例或无效实例的更多示例,请参阅 Polygon

geography 数据类型

一个有效的 geographyCurvePolygon 实例必须具有以下属性:

  1. 多边形的内部使用左手定律进行连接。
  2. 环不能与自身或其他环交叉。
  3. 环只能在单个切点处接触(环接触的点数必须有限)。
  4. 多边形的内部必须连接。

下面的示例显示一个有效的地理 CurvePolygon 实例。

DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';  
SELECT @g.STIsValid();  

示例

A. 使用空 CurvePolygon 实例化几何图形实例

该示例说明如何创建一个空的 CurvePolygon 实例:

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON EMPTY');  

B. 在同一语句中使用 CurvePolygon 声明和实例化几何图形实例

此代码段说明如何在同一语句中声明和实例化一个具有 CurvePolygon 的几何图形实例:

DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'  

°C 使用 CurvePolygon 实例实例化地理实例

此代码段说明如何声明和实例化一个具有 geographyCurvePolygon 实例:

DECLARE @g geography = 'CURVEPOLYGON(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';  

D. 仅存储外部边界环的 CurvePolygon

此示例说明如何在一个 CurvePolygon 实例中存储一个简单的圆形(仅有一个外部边界环用于界定该圆形):

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  

E. 存储包含内环的 CurvePolygon

此示例在 CurvePolygon 实例中创建一个圆环图(使用一个外部边界环和一个内环来界定该圆环图):

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  

此示例说明在使用内环时的一个有效的 CurvePolygon 实例和一个无效的实例:

DECLARE @g1 geometry, @g2 geometry;  
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');  
IF @g1.STIsValid() = 1  
  BEGIN  
     SELECT @g1.STArea();  
  END  
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');  
IF @g2.STIsValid() = 1  
  BEGIN  
     SELECT @g2.STArea();  
  END  
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;  

@g1@g2 都使用相同的外部边界环:一个半径为 5 的圆形,并且它们都使用一个正方形作为内环。 不过,实例 @g1 有效,而实例 @g2 却无效。 @g2 无效的原因在于内环将外环界定的内部空间拆分为四个单独的区域。 下图显示所发生的情况: