CompoundCurve

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

CompoundCurve は、geometry 型または geography 型の 0 個以上の連続する CircularString インスタンスあるいは LineString インスタンスのコレクションです。

空の CompoundCurve インスタンスをインスタンス化することはできますが、 CompoundCurve を有効にするには、次の条件を満たす必要があります。

  1. 少なくとも 1 つの CircularString インスタンスまたは LineString インスタンスを含める必要があります。

  2. 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 インスタンスは、空のインスタンスであるかまたは次の条件を満たす場合に許容されます。

  1. CompoundCurve インスタンスに含まれるすべてのインスタンスが、許容される円弧セグメントのインスタンスである。 許容される円弧セグメントのインスタンスの詳細については、「 LineString 」および「 CircularString」を参照してください。

  2. CompoundCurve インスタンス内のすべての円弧セグメントが接続されている。 後続のそれぞれの円弧の始点が、前の円弧の終点と同じである必要があります。

    Note

    これには、Z 座標および M 座標が含まれます。 したがって、4 つの座標 (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();  

@g3CircularString インスタンスが有効であるため、有効です。 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 インスタンスではないため、無効です。 @g2LineString インスタンスが有効ではないため、無効です。 @g3CircularString インスタンスが有効ではないため、無効です。 有効な 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. 複数の CircularString を含む CompoundCurve を使用して geometry インスタンスをインスタンス化する

次の例は、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? と等しい 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...  

Circle Two の境界は約 4? で、これは境界の実際の値です。 ただし、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インスタンスを明示的に宣言する必要があります。

参照

STIsValid (geometry データ型)
STLength (geometry データ型)
STStartPoint (geometry データ型)
STEndpoint (geometry データ型)
LineString
CircularString
空間データ型の概要
Point