CurvePolygon

A CurvePolygon 是由外部边界环和零个或多个内环定义的拓扑封闭表面

重要

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

以下条件定义实例的属性 CurvePolygon

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

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

实例 CurvePolygon 不同于 Polygon 实例,该 CurvePolygon 实例可能包含以下圆弧段: 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 值。 即使 geography 类型实例无效,仍然接受 @g5

以下示例引发 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 数据类型。

几何数据类型

有效的 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

地理数据类型

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

  1. 多边形的内部使用左侧规则进行连接。

  2. 没有戒指可以交叉自身或其他环。

  3. 环只可以在单个切点接触(环的接触点数必须是有限的)。

  4. 多边形的内部必须是联通的。

以下示例演示了有效的 geography CurvePolygon 实例。

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

例子

答: 使用一个空的 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 实例化地理实例

此代码片段演示如何使用CurvePolygon来声明和初始化geography实例。

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 内环将外环边界的内部空间拆分为四个单独的区域。 下图显示了所发生的情况:

另请参阅

多边形
CircularString
CompoundCurve
geometry 数据类型方法参考
geography 数据类型方法参考
空间数据类型概述