次の方法で共有


CompoundCurve

CompoundCurveは、0 個以上の連続するCircularStringまたはジオメトリ型またはジオグラフィ型のLineStringインスタンスのコレクションです。

重要

CompoundCurve サブタイプなど、このリリースの新しい空間機能の詳細な説明と例については、ホワイト ペーパー「SQL Server 2012 の新しい空間機能」をダウンロードしてください。

空の 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 インスタンスは、空のインスタンスであるか、次の条件を満たしている場合に受け入れられます。

  1. CompoundCurveインスタンスに含まれるすべてのインスタンスは、円弧セグメント インスタンスとして受け入れられます。 許容される円弧セグメント インスタンスの詳細については、「 LineString 」と 「CircularString」を参照してください。

  2. CompoundCurve インスタンス内のすべての円弧セグメントが接続されます。 次の円弧セグメントの最初の点は、前の円弧セグメントの最後の点と同じです。

    これには、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();

@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」を参照してください。

例示

ある。 空の CompooundCurve を使用して geometry インスタンスをインスタンス化する

次の例は、空の CompoundCurve インスタンスを作成する方法を示しています。

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');

B. 同じステートメントで CompoundCurve を使用してジオメトリ インスタンスを宣言およびインスタンス化する

次の例は、同じステートメント内の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 インスタンスに四角形を格納する

次の例では、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 インスタンスが LineString の 1 つ以上のインスタンスを格納できることに注意してください。

E. 複数の CircularString を含む CompoundCurve を使用してジオメトリ インスタンスをインスタンス化する

次の例は、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();

これにより、次の出力が生成されます: 12.566370...これは 4π (4 * pi) に相当します。 この例の 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 インスタンスを格納する

次の例は、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...

円 2 の境界は約 4π (4 * pi) であり、これは境界の実際の値です。 ただし、円 1 の境界は非常に不正確です。 Circle One の CompoundCurve インスタンスには、1 つの円弧セグメント (ABC) と 2 つの線分 (CD、DA) が格納されます。 CompoundCurve インスタンスは、円を定義するために 2 つの円弧セグメント (ABC、CDA) を格納する必要があります。 LineString インスタンスは、Circle One の CompoundCurve インスタンスの 2 番目のポイント セット (4 2、2 4、0 2) を定義します。 CompoundCurve内でCircularStringインスタンスを明示的に宣言する必要があります。

こちらもご覧ください

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