CurvePolygon
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance SQL analytics endpoint in Microsoft Fabric Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス
CurvePolygon は、SQL データベース エンジン空間データの外部境界リングと 0 個以上の内部リングによって定義されるトポロジ的に閉じたサーフェスです。
重要
CurvePolygon サブタイプを含む、SQL Server 2012 (11.x) で導入された空間機能の詳細な説明とサンプルについては、 SQL Server 2012 の新しい空間機能に関するホワイト ペーパーをダウンロードして参照してください。
CurvePolygon インスタンスの属性を定義する条件を次に示します。
CurvePolygon インスタンスの境界は、外部リングとすべての内部リングによって定義されます。
CurvePolygon インスタンスの内部は、外部リングとすべての内部リングとの間にある空間です。
CurvePolygon インスタンスは、Polygon インスタンスとは異なります。CurvePolygon インスタンスには、CircularString および CompoundCurve の円弧セグメントを含めることができます。
CompoundCurve インスタンス
有効な CurvePolygon の図を次に示します。
許容されるインスタンス
CurvePolygon インスタンスが許容されるためには、空であるか、または許容される円弧リングのみを含んでいる必要があります。 許容される円弧リングは、次の要件を満たしています。
許容される LineString、 CircularStringまたは CompoundCurve インスタンスです。 許容されるインスタンスの詳細については、「 LineString」、「 CircularString」、および「 CompoundCurve」を参照してください。
4 つ以上の点があること。
始点と終点の X 座標と Y 座標は同じです。
Note
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 インスタンスを有効にするためには、外部リングと内部リングの両方が次の条件を満たす必要があります。
- これらは、単一の接線点でのみ接触できます。
- 互いに交差していないこと。
- それぞれのリングに 4 つ以上の点が含まれていること。
- それぞれのリングは許容される curve 型であること。
さらに、CurvePolygon インスタンスは、 geometry データ型であるかまたは geography データ型であるかに応じて、特定の条件を満たす必要があります。
geometry データ型
有効な geometryCurvePolygon インスタンスは、次の属性を持つ必要があります。
- すべての内部リングが外部リング内に含まれていること。
- 複数の内部リングを含むことはできますが、内部リング内に別の内部リングを含めることはできません。
- リングがそれ自体または別のリングと交差していないこと。
- リングどうしは、1 つの接点でのみ接することができます (リングが接する点の数は有限であることが必要です)。
- 多角形の内部が接続されていること。
次の例は、有効な geometryCurvePolygon インスタンスを示しています。
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 データ型
有効な geographyCurvePolygon インスタンスは、次の属性を持つ必要があります。
- 多角形の内部が左辺ルールを使用して接続されている必要があります。
- リングがそれ自体または別のリングと交差していないこと。
- リングどうしは、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 インスタンスをインスタンス化する
このコード スニペットは、 geography を使用して CurvePolygonインスタンスを宣言およびインスタンス化する方法を示しています。
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 つの別個の領域に分割されているためです。 この状況を次の図に示します。