A CurvePolygon
是由外部边界环和零个或多个内环定义的拓扑封闭表面
重要
有关 SQL Server 2012 中引入的空间功能的详细说明和示例,包括 CurvePolygon
子类型,请下载白皮书“ SQL Server 2012 中的新空间功能”。
以下条件定义实例的属性 CurvePolygon
:
实例的
CurvePolygon
边界由外部环和所有内部环定义。实例的内部
CurvePolygon
是外部环和所有内部环之间的空间。
实例 CurvePolygon
不同于 Polygon
实例,该 CurvePolygon
实例可能包含以下圆弧段: CircularString
和 CompoundCurve
。
CompoundCurve 实例
下图显示了有效 CurvePolygon
数字:
接受的实例
对于要接受的 CurvePolygon
实例,它必须是空的,或者只包含接受的圆弧环。 接受的圆弧环满足以下要求。
是
LineString
、CircularString
或CompoundCurve
的接受实例。 有关接受的实例的详细信息,请参阅 LineString、 CircularString 和 CompoundCurve。至少有四分。
起点和终点具有相同的 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
实例有效,外环和内环必须满足以下条件:
它们可能仅在一个切点处接触。
他们不能互相交叉。
每个环必须至少包含四点。
每个环必须是可接受的曲线类型。
CurvePolygon
实例还需要满足特定条件,具体取决于它们是 geometry
还是 geography
数据类型。
几何数据类型
有效的 geometryCurvePolygon 实例必须具有以下属性:
所有内部环都必须包含在外环内。
可能有多个内部环,但内部环不能包含另一个内部环。
没有环可以交叉自身或其他环。
环只能在单个切点接触(环接触点的数量必须是有限的)。
多边形的内部必须连接。
以下示例显示了有效的 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 实例必须具有以下属性:
多边形的内部使用左侧规则进行连接。
没有戒指可以交叉自身或其他环。
环只可以在单个切点接触(环的接触点数必须是有限的)。
多边形的内部必须是联通的。
以下示例演示了有效的 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 数据类型方法参考
空间数据类型概述