CompoundCurve
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス Microsoft Fabric のSQL データベース
CompoundCurve は、0 個以上の連続CircularStringまたは LineString geometry または geography 型のインスタンスのコレクションです。
空の CompoundCurve インスタンスをインスタンス化することはできますが、 CompoundCurve を有効にするには、次の条件を満たす必要があります。
少なくとも 1 つの CircularString インスタンスまたは LineString インスタンスを含める必要があります。
CircularString インスタンスまたは LineString インスタンスのシーケンスは連続している必要があります。
CompoundCurve に複数の CircularString インスタンスおよび LineString インスタンスのシーケンスが含まれている場合、最後のインスタンスを除くすべてのインスタンスのエンドポイントは、シーケンス内の次のインスタンスの開始エンドポイントであることが必要です。 これは、シーケンス内の前のインスタンスの終点が (4 3 7 2) である場合は、シーケンス内の次のインスタンスの始点が (4 3 7 2) になる必要があることを意味します。 ポイントの Z (標高) と M (メジャー) の値も同じである必要があります。 これら 2 つの点が異なる場合は、 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 インスタンス内のすべての円弧セグメントが接続されている。 後続のそれぞれの円弧の始点が、前の円弧の終点と同じである必要があります。
Note
これには、Z 座標および M 座標が含まれます。 したがって、4 つの座標 (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
2 番目のインスタンスが有効な 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 インスタンスを宣言してインスタンス化する
次の例は、 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 を使用して geography インスタンスをインスタンス化する
次の例は、 を使用して geography CompoundCurve
インスタンスを宣言および初期化する方法を示しています。
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 インスタンスに四角形を格納する
次の例では、2 つの異なる方法で 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 インスタンスは、1 つ以上の LineString
インスタンスを格納できます。
E. CompoundCurve と複数の CircularString を使用してジオメトリ インスタンスをインスタンス化する
次の例は、2 つの異なる 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();
これにより、4 pi に相当する出力12.5663706143592
が生成されます。 この例の CompoundCurve
インスタンスは、半径が 2 の円を格納します。 前のコード例のどちらの場合も、 CompoundCurve
を使用する必要はありません。 最初の例では LineString
インスタンスを、2 番目の例では 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 インスタンスを格納する
次の例は、 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...
円 2 の境界は約 4pi で、これは境界の実際の値です。 ただし、Circle One の境界はきわめて不正確です。 Circle One の CompoundCurve
インスタンスには、1 つの円弧セグメント (ABC
) と 2 つの線分 (CD
、 DA
) が格納されます。 CompoundCurve
インスタンスは、円を定義するために 2 つの円弧セグメント (ABC
、CDA
) を格納する必要があります。 LineString
インスタンスは、2 番目の点のセット (4 2, 2 4, 0 2) を Circle One の CompoundCurve
インスタンスに定義します。 ここで、 CircularString
内の CompoundCurve
インスタンスを明示的に宣言する必要があります。