CurvePolygon
CurvePolygon は、1 つの外部境界リングと 0 個以上の内部リングによって定義された、位相的に閉じた表面です。
重要 |
---|
CurvePolygon サブタイプを含め、このリリースの新しい空間機能の詳細な説明とサンプルについては、ホワイト ペーパー「SQL Server 2012 の新しい空間機能」をダウンロードして参照してください。 |
CurvePolygon インスタンスの属性を定義する条件を次に示します。
CurvePolygon インスタンスの境界は、外部リングとすべての内部リングによって定義されます。
CurvePolygon インスタンスの内部は、外部リングとすべての内部リングとの間にある空間です。
CurvePolygon インスタンスが Polygon インスタンスと異なるのは、CurvePolygon インスタンスは円弧 (CircularString および CompoundCurve) を含む場合があるという点です。
CompoundCurve インスタンス
有効な CurvePolygon の図を次に示します。
許容されるインスタンス
CurvePolygon インスタンスが許容されるためには、空であるか、または許容される円弧リングのみを含んでいる必要があります。 許容される円弧リングは、次の要件を満たしています。
許容される LineString インスタンス、CircularString インスタンス、または CompoundCurve インスタンスであること。 許容されるインスタンスの詳細については、「LineString」、「CircularString」、および「CompoundCurve」を参照してください。
4 つ以上の点があること。
始点および終点の X 座標と Y 座標が同じであること。
注 Z 値および M 値は無視されます。
次の例は、許容される CurvePolygon インスタンスを示しています。
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';
@g3 は、始点と終点の Z 値が異なりますが Z 値は無視されるため、許容されます。 @g5 は、geography 型インスタンスは無効ですが、許容されます。
次の例では、System.FormatException がスローされます。
DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';
@g1 は、始点と終点の Y 値が同じでないため、許容されません。 @g2 は、リングに十分な数の点が含まれていないため、許容されません。
有効なインスタンス
CurvePolygon インスタンスを有効にするためには、外部リングと内部リングの両方が次の条件を満たす必要があります。
1 つの接点でのみ接していること。
互いに交差していないこと。
それぞれのリングに 4 つ以上の点が含まれていること。
それぞれのリングは許容される curve 型であること。
さらに、CurvePolygon インスタンスは、geometry データ型であるかまたは geography データ型であるかに応じて、特定の条件を満たす必要があります。
geometry データ型
有効な geometry CurvePolygon インスタンスは、次の属性を持つ必要があります。
すべての内部リングが外部リング内に含まれていること。
複数の内部リングを含むことはできますが、内部リング内に別の内部リングを含めることはできません。
リングがそれ自体または別のリングと交差していないこと。
リングどうしは、1 つの接点でのみ接することができます (リングが接する点の数は有限であることが必要です)。
多角形の内部が接続されていること。
次の例は、有効な geometry CurvePolygon インスタンスを示しています。
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
SELECT @g1.STIsValid(), @g2.STIsValid();
CurvePolygon インスタンスには Polygon インスタンスと同じ妥当性規則が適用されますが、例外として、CurvePolygon インスタンスでは新しい円弧型が許容されます。 他の有効または無効なインスタンスの例については、「Polygon」を参照してください。
geography データ型
有効な geography CurvePolygon インスタンスは、次の属性を持つ必要があります。
多角形の内部が左辺ルールを使用して接続されている必要があります。
リングがそれ自体または別のリングと交差していないこと。
リングどうしは、1 つの接点でのみ接することができます (リングが接する点の数は有限であることが必要です)。
多角形の内部が接続されていること。
次の例は、有効な geography CurvePolygon インスタンスを示しています。
DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';
SELECT @g.STIsValid();
使用例
A. 空の CurvePolygon を使用して geometry インスタンスをインスタンス化する
次の例は、空の CurvePolygon インスタンスを作成する方法を示しています。
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON EMPTY');
B. CurvePolygon を同じステートメント内で使用して geometry インスタンスを宣言およびインスタンス化する
このコード スニペットは、CurvePolygon を同じステートメント内で使用して geometry インスタンスを宣言およびインスタンス化する方法を示しています。
DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'
C. CurvePolygon を使用して geography インスタンスをインスタンス化する
このコード スニペットは、CurvePolygon を使用して geography インスタンスを宣言およびインスタンス化する方法を示しています。
DECLARE @g geography = 'CURVEPOLYGON(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';
D. 外部境界リングのみを含む CurvePolygon を格納する
この例は、単純な円を CurvePolygon インスタンスに格納する方法を示しています (外部境界リングのみを使用して円が定義されています)。
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
E. 内部リングを含む CurvePolygon を格納する
この例では、CurvePolygon インスタンス内にドーナツを作成しています (ドーナツは外部境界リングと内部リングの両方を使用して定義されています)。
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
次の例は、内部リングを使用した場合の有効な CurvePolygon インスタンスと無効なインスタンスの両方を示しています。
DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');
IF @g1.STIsValid() = 1
BEGIN
SELECT @g1.STArea();
END
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');
IF @g2.STIsValid() = 1
BEGIN
SELECT @g2.STArea();
END
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;
@g1 と @g2 はどちらも同じ外部境界リング (半径 5 の円) を使用し、内部リングに正方形を使用しています。 しかし、インスタンス @g1 は有効ですが、インスタンス @g2 は無効です。 @g2 が無効な理由は、外部リングによって範囲指定された内部空間が内部リングによって 4 つの別個の領域に分割されているためです。 この状況を次の図に示します。