A 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(度量)值也必须相同。 如果两点存在差异,则会引发 a 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();
因为 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
实例的详细信息,请参阅 CircularString 和 LineString。
例子
答: 使用空的 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
。
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
来存储多个CircularString
和LineString
实例。
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))');
一。 说明为何必须显式声明 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