次の方法で共有


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. 少なくとも 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. 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 つの線分 (CDDA) が格納されます。 CompoundCurve インスタンスは、円を定義するために 2 つの円弧セグメント (ABCCDA) を格納する必要があります。 LineString インスタンスは、2 番目の点のセット (4 2, 2 4, 0 2) を Circle One の CompoundCurve インスタンスに定義します。 ここで、 CircularString 内の CompoundCurveインスタンスを明示的に宣言する必要があります。