CompoundCurve
CompoundCurve
是几何图形或地域类型的零个或多个连续 CircularString
或 LineString
实例的集合。
重要
有关此版本中新空间功能(包括CompoundCurve
子类型)的详细说明和示例,请下载白皮书“SQL Server 2012 中的新空间功能”。
可以实例化空的 CompoundCurve
实例,但要使 CompoundCurve
有效,它必须满足以下条件:
它必须至少包含一个
CircularString
或LineString
实例。CircularString
或LineString
实例的序列必须是连续的。
CompoundCurve
如果 包含多个 CircularString
和 LineString
实例的序列,则每个实例(最后一个实例除外)的结束终结点必须是序列中下一个实例的起始终结点。 这意味着,如果在序列中前一个实例的结束点是 (4 3 7 2),则该序列中的下一个实例的起始点必须是 (4 3 7 2)。 请注意,该点的 Z(标高)和 M(度量)值也必须相同。 如果这两个点之间存在差异,则将引发 System.FormatException
。 CircularString
中的点不一定必须有 Z 值或 M 值。 如果未向前一个实例的结束点提供 Z 值或 M 值,下一个实例的起始点就不能包含 Z 值或 M 值。 如果前一个序列的结束点是 (4 3),则后一个序列的起始点必须是 (4 3);它不能是 (4 3 7 2)。 CompoundCurve
实例中的所有点要么不得有 Z 值,要么其 Z 值必须相同。
CompoundCurve 实例
下图显示了有效的 CompoundCurve
类型。
接受的实例
如果 CompoundCurve
实例是空实例或者它满足以下条件,则接受该实例。
CompoundCurve
实例包含的所有实例都是接受的圆弧线段实例。 有关接受的圆弧线段实例的详细信息,请参阅 LineString 和 CircularString。CompoundCurve
实例中的所有圆弧线段都连接在一起。 每个后续圆弧线段上的第一个点与前一个圆弧线段上的最后一个点相同。注意
Z 和 M 坐标也要相同。 因此,所有四个坐标 X、Y、Z 和 M 必须相同。
所有包含的实例都不是空实例。
下面的示例显示接受的 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
实例有效。
CompoundCurve
实例是接受的实例。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 CircularString
和 LineString
实例的详细信息,请参阅 CircularString 和 LineString。
示例
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
存储多个 LineString
和 CompoundCurve
实例。
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 值的 CircularString
和 LineString
实例的序列。
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空间数据类型概述点