CompoundCurve
CompoundCurve 是零或多個屬於 geometry 或 geography 類型之連續 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 執行個體無效。 如需有關有效 CircularString 和 LineString 執行個體的詳細資訊,請參閱<CircularString>和<LineString>。
範例
A.使用空的 CompooundCurve 來具現化 geometry 執行個體
下列範例會示範如何建立空的 CompoundCurve 執行個體:
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');
B.在相同的陳述式中使用 CompoundCurve 來宣告和具現化 geometry 執行個體
下列範例會示範如何在相同的陳述式中使用 CompoundCurve 來宣告和初始化 geometry 執行個體:
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 來具現化 geography 執行個體
下列範例會示範如何使用 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.使用 CompoundCurve 搭配多個 CircularString 來具現化 geometry 執行個體
下列範例會示範如何使用兩個不同的 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∏。 在此範例中,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 中
下列範例會示範如何使用 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))');
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…
Circle Two 的圓周約為 4∏,這是圓周的實際值。 不過,Circle One 的圓周則明顯不精確。 Circle One 的 CompoundCurve 執行個體會儲存一個圓弧線段 (ABC) 和兩個直線線段 (CD, DA)。 CompoundCurve 執行個體必須儲存兩個圓弧線段 (ABC, CDA) 才能定義圓形。 LineString 執行個體會在 Circle One 的 CompoundCurve 執行個體中定義第二組點 (4 2, 2 4, 0 2)。 您必須在 CompoundCurve 內部明確宣告 CircularString 執行個體。