CompoundCurve

CompoundCurve 是几何图形或地域类型的零个或多个连续 CircularStringLineString 实例的集合。

重要

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

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

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

  2. CircularStringLineString 实例的序列必须是连续的。

CompoundCurve如果 包含多个 CircularStringLineString 实例的序列,则每个实例(最后一个实例除外)的结束终结点必须是序列中下一个实例的起始终结点。 这意味着,如果在序列中前一个实例的结束点是 (4 3 7 2),则该序列中的下一个实例的起始点必须是 (4 3 7 2)。 请注意,该点的 Z(标高)和 M(度量)值也必须相同。 如果这两个点之间存在差异,则将引发 System.FormatExceptionCircularString 中的点不一定必须有 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();

@g3 有效,因为 CircularString 实例有效。 有关实例有效性 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 实例无效。 有关 valid CircularStringLineString 实例的详细信息,请参阅 CircularStringLineString

示例

A. 使用空的 CompoundCurve 实例化一个几何图形实例

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

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

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

下面的示例演示如何在同一语句中使用 geometry 声明和初始化 CompoundCurve实例:

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 实例化一个几何图形实例

下面的示例演示如何使用两个不同的 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. 将多个 CircularString 和 LineString 实例存储在一个 CompoundCurve 中

下面的示例演示如何使用 CircularString 存储多个 LineStringCompoundCurve实例。

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))');

I. 说明为什么必须显式声明 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) ,这是外围的实际值。 但是,圆形 1 的周长很不准确。 圆形 1 的 CompoundCurve 实例存储一个圆弧线段 (ABC) 和两条直线段(CD、DA)。 CompoundCurve 实例必须存储两个圆弧线段(ABC、CDA)才可以定义一个圆形。 LineString 实例定义圆形 1 的 CompoundCurve 实例中的第二组点(4 2、2 4、0 2)。 必须在 CircularString 内部显式声明 CompoundCurve实例。

另请参阅

STIsValid (geometry 数据类型) STLength (geometry 数据类型) STStartPoint (geometry 数据类型) STEndpoint (geometry 数据类型) LineStringCircularString空间数据类型概述