CompoundCurve

A CompoundCurve 是一个集合,包含几何类型或地理类型的零个或多个连续的CircularStringLineString实例。

重要

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

可以实例化空CompoundCurve实例,但要使CompoundCurve有效,它必须满足以下条件:

  1. 它必须至少包含一个 CircularStringLineString 实例。

  2. 段内实例CircularStringLineString的顺序必须是连续的。

如果CompoundCurve包含多个CircularStringLineString实例组成的序列,则除最后一个实例外,每个实例的结束终结点必须是序列中下一个实例的起始终结点。 这意味着,如果序列中上一个实例的终点为 (4 3 7 2),则序列中下一个实例的起点必须为 (4 3 7 2)。 请注意,点的 Z(高程)和 M(度量)值也必须相同。 如果两点存在差异,则会引发 a System.FormatException 。 中的 CircularString 点不必具有 Z 或 M 值。 如果没有为上一实例的终点提供 Z 或 M 值,则下一个实例的起点不能包含 Z 或 M 值。 如果上一序列的终点为 (4 3),则下一个序列的起点必须为 (4 3):不能是 (4 3 7 2)。 实例中的所有 CompoundCurve 点都必须没有 Z 值或相同的 Z 值。

CompoundCurve 实例

下图显示了有效 CompoundCurve 类型。

接受的实例

CompoundCurve 如果实例为空实例或满足以下条件,则接受实例。

  1. CompoundCurve 实例所包含的所有实例都是符合的圆弧线段实例。 有关接受的圆弧线段实例的详细信息,请参阅 LineStringCircularString

  2. 实例中的所有 CompoundCurve 圆弧线段都已连接。 后续圆弧线段的第一个点与前一圆弧线段的最后一个点相同。

    注释

    这包括 Z 和 M 坐标。 因此,所有四个坐标 X、Y、Z 和 M 都必须相同。

  3. 包含的实例都不是空实例。

以下示例显示了接受 CompoundCurve 的实例。

DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';

以下示例显示了 CompoundCurve 不接受的实例。 这些实例引发 System.FormatException

DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING EMPTY)';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (1 0, 2 0))';

有效实例

CompoundCurve如果实例满足以下条件,则实例有效。

  1. CompoundCurve 实例被接受。

  2. CompoundCurve 实例包含的所有圆弧段实例都是有效的实例。

以下示例演示了有效的 CompoundCurve 实例。

DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

因为 CircularString 实例有效,所以 @g3 有效。 要获得有关CircularString实例有效性的信息,请参阅CircularString

以下示例演示 CompoundCurve 无效的实例。

DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4, 3 5))';
DECLARE @g2 geometry = 'COMPOUNDCURVE((1 1, 1 1))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 2 3, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g1 无效,因为第二个实例不是有效的 LineString 实例。 @g2 无效,因为 LineString 实例无效。 @g3 无效是因为 CircularString 实例无效。 有关有效 CircularString 实例和 LineString 实例的详细信息,请参阅 CircularStringLineString

例子

答: 使用空的 CompoundCurve 实例化几何图形实例

以下示例演示如何创建空 CompoundCurve 实例:

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

B. 在同一语句中借助 CompoundCurve 声明并实例化几何实例

以下示例演示如何使用同一geometryCompoundCurve语句声明和初始化实例:

DECLARE @g geometry = 'COMPOUNDCURVE ((2 2, 0 0),CIRCULARSTRING (0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0))';

C. 使用 CompoundCurve 实例化地理实例

以下示例演示如何使用CompoundCurve声明和初始化一个geography实例:

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

D. 在 CompoundCurve 实例中存储正方形

以下示例使用两种不同的方法来使用 CompoundCurve 实例来存储正方形。

DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3), (1 3, 3 3),(3 3, 3 1), (3 1, 1 1))');
SET @g2 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3, 3 3, 3 1, 1 1))');
SELECT @g1.STLength(), @g2.STLength();

两者的长度 @g1@g2 相同。 请注意, CompoundCurve 实例可以存储一个或多个实例 LineString

E. 使用具有多个圆弧字符串的复合曲线实例化几何对象

以下示例演示如何使用两个不同的 CircularString 实例初始化一个 CompoundCurve

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT @g.STLength();

这会生成以下输出:12.566370...这相当于 4π (4 * pi)。 示例中 CompoundCurve 的实例存储一个半径为 2 的圆。 上述两个代码示例都不必使用 CompoundCurve。 对于第一个示例,实例 LineString 会更简单,第二个 CircularString 示例的实例会更简单。 但是,下一个示例显示了 CompoundCurve 如何提供一个更好的替代方案。

F. 使用 CompoundCurve 存储半圆形

以下示例使用 CompoundCurve 实例用于存储半圆。

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 0 2))');
SELECT @g.STLength();

G. 在 CompoundCurve 中存储多个 CircularString 和 LineString 实例

以下示例演示如何使用CompoundCurve来存储多个CircularStringLineString实例。

DECLARE @g geometry
SET @g = geometry::Parse('COMPOUNDCURVE((3 5, 3 3), CIRCULARSTRING(3 3, 5 1, 7 3), (7 3, 7 5), CIRCULARSTRING(7 5, 5 7, 3 5))');
SELECT @g.STLength();

H. 使用 Z 和 M 值存储实例

以下示例演示如何使用 CompoundCurve 实例来存储 Z 和 M 值的序列 CircularStringLineString 实例。

SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(7 5 4 2, 5 7 4 2, 3 5 4 2), (3 5 4 2, 8 7 4 2))');

一。 说明为何必须显式声明 CircularString 实例

以下示例显示必须显式声明实例的原因 CircularString 。 程序员正在尝试将圆存储在实例中 CompoundCurve

DECLARE @g1 geometry;  
DECLARE @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 2 4, 0 2))');
SELECT 'Circle One', @g1.STLength() AS Perimeter;  -- gives an inaccurate amount
SET @g2 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT 'Circle Two', @g2.STLength() AS Perimeter;  -- now we get an accurate amount

输出如下所示:

Circle One11.940039...
Circle Two12.566370...

圆二圈的外围约为 4π(4 * pi),这是外围的实际值。 但是,圆一的周长明显不准确。 Circle One 的CompoundCurve 实例存储一个圆弧段(ABC)和两个线段(CD、DA)。 实例 CompoundCurve 必须存储两个圆弧线段(ABC、CDA)来定义圆。 实例 LineString 定义圈一 CompoundCurve 实例中的第二组点(4 2、2 4、0 2)。 必须在CompoundCurve中显式声明一个CircularString实例。

另请参阅

STIsValid (geometry Data Type)STLength (geometry Data Type)STStartPoint (geometry Data Type)STEndpoint (geometry Data Type)LineStringCircularStringSpatial Data Types OverviewPoint