Polygon

Polygon は、1 つの外部境界リングとゼロ個以上の内部リングを定義する一連の点として格納される 2 次元表面です。

Polygon インスタンス

Polygon インスタンスは、3 つ以上の異なる点を持つリングで形成され、空にすることもできます。

Polygon の外部および内部のリングは、その境界を定義します。リング内の空間は Polygon の内部を定義します。

次の図は、Polygon インスタンスの例です。

geometry Polygon インスタンスの例

この図は次のことを示しています。

  1. 図 1 は、外部リングによって境界が定義されている Polygon インスタンスです。

  2. 図 2 は、1 つの外部リングと 2 つの内部リングによって境界が定義されている Polygon インスタンスです。内部リングの内側の領域は、Polygon インスタンスの外部の一部です。

  3. 図 3 の Polygon インスタンスは、内部リングが 1 つの接点で交差しているため有効です。

許容されるインスタンス

許容される Polygon インスタンスとは、例外がスローされることなく、geometry または geography 変数に格納できるインスタンスです。以下は、geometry 型で許容される Polygon インスタンスです。

  • 空の Polygon インスタンス

  • 1 つの許容可能な外部リングと 0 個以上の許容可能な内部リングを持つ Polygon インスタンス

リングが許容可能になるには、次の条件が必要です。

  • LineString インスタンスが許容される必要があります。

  • LineString インスタンスは、3 つの異なる点を含む 4 つ以上の点を持っている必要があります。

  • LineString インスタンスの始点と終点が同じ X 値と Y 値を持っている必要があります。

    注意注意

    Z 値と M 値は無視されます。

geography 型の Polygon インスタンスが許容されるのは、インスタンスが有効な場合のみです。詳細については、「Valid Geography Polygon Instances」を参照してください。

次の例は、geometry 型の許容される Polygon インスタンスを示しています。

DECLARE @g1 geometry = 'POLYGON EMPTY';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 1))';
DECLARE @g3 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 3 3, 0 3, 0 0))';
DECLARE @g4 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(3 0, 6 0, 6 3, 3 3, 3 0))';

@g4 が示すように、許容される Polygon インスタンスが有効な Polygon インスタンスではない場合があります。次の例では、Polygon インスタンスが許容されないため、System.FormatException がスローされます。

DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';

@g1 は、外部リングの LineString インスタンスに十分な点が含まれていないため、許容されません。@g2 は、外部リングの LineString インスタンスの始点が終点と同じでないため、許容されません。次の例では、外部リングは許容可能ですが、内部リングは許容可能ではありません。この場合も System.FormatException がスローされます。

DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';

有効なインスタンス

Polygon インスタンスの有効性は、その変数の型に依存します。

geometry データ型

geometry 型の Polygon インスタンスが有効となるには、次の条件を満たす必要があります。

  1. 1 つ目のリングが外部リングであること。

  2. すべての内部リングが外部リング内にあること。

  3. 内部リングが別の内部リング内にないこと。

  4. リングがそれ自体または別のリングと交差していないこと。

  5. 2 つのリングで同じエッジを共有することはできません。

  6. ある内部リングの内部と別の内部リングの内部を重ねることはできません。

  7. すべてのリングは、それ自体または別のリングと、0 または有限数の接点でのみ接することができます。

  8. Polygon インスタンスの内部が接続されていること。完全にインスタンスの内部にあるインスタンスの 2 つの内部の点の間に少なくとも 1 つのパスが存在する必要があります。

次の例は、有効な Polygon インスタンスを示しています。

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g3 は、2 つの内部リングが 1 つの点で接しており、互いに交差していないため有効です。次の例は、有効ではない Polygon インスタンスを示しています。

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';
DECLARE @g5 geometry = 'POLYGON((10 0, 0 10, 0 -10, 10 0), (-20 -20, -20 20, 20 20, 20 -20, -20 -20) )';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid();

@g1 は、内部リングが外部リングに 2 か所で接しているため有効ではありません。@g2 は、2 つ目の内部リングが 1 つ目の内部リングの内部にあるため有効ではありません。@g3 は、2 つの内部リングが複数の連続する点で接しているため有効ではありません。@g4 は、2 つの内部リングの内部が重なっているため有効ではありません。@g5 は、1 つ目のリングが内部リングで、2 つ目のリングが外部リングであるため有効ではありません。

geography データ型

geography 型の Polygon インスタンスが有効となるには、次の条件を満たす必要があります。

  1. インスタンスが、geometry 型の許容される Polygon インスタンスとなるために必要なすべてのルールを満たしている必要があります。

  2. 左辺ルールを使用してインスタンスの内部が接続されていること。

  3. インスタンスが 1 つの半球に収まること。

  4. リングがそれ自体または別のリングと交差していないこと。

  5. すべてのリングは、それ自体または別のリングと、0 または有限数の接点でのみ接することができます。

次の例では、Polygon インスタンスが半球に収まらないため、Microsoft.SqlServer.Types.GLArgumentException がスローされます。

DECLARE @g geography = 'POLYGON((-122.358 47.653, 122.348 47.649, 122.348 47.658, 122.358 47.658, -122.358 47.653))';

次の例は、geography 型の有効な Polygon インスタンスを示しています。

DECLARE @g geography = 'POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';

次の例では、1 つの穴を持つ単純な geometryPolygon インスタンスを作成しています。このインスタンスの SRID は 10 です。

DECLARE @g geometry;
SET @g = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);

無効なインスタンスを入力して、有効な geometry インスタンスに変換することもできます。次の例の Polygon は、内部と外部のリングが重なっているため無効です。

DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))');

次の例では、MakeValid() を使用して、無効なインスタンスを有効なインスタンスにしています。

SET @g = @g.MakeValid();
SELECT @g.ToString();

前の例で返される geometry インスタンスは MultiPolygon です。

MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)), ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))