次の方法で共有


多角形

Polygonは、外部境界リングと 0 個以上の内部リングを定義するポイントのシーケンスとして格納される 2 次元サーフェスです。

多角形インスタンス

Polygon インスタンスは、少なくとも 3 つの異なる点を持つリングから形成できます。 Polygon インスタンスは空にすることもできます。

Polygonの外部リングと内部リングによって、その境界が定義されます。 リング内のスペースは、 Polygonの内部を定義します。

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

ジオメトリー ポリゴン インスタンスの例

図に示すように、

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

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

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

受け入れられたインスタンス

受け入れられる Polygon インスタンスは、例外をスローせずに geometry または geography 変数に格納できるインスタンスです。 次のインスタンス Polygon 受け入れられます。

  • 空の Polygon インスタンス

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

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

  • LineString インスタンスを受け入れる必要があります。

  • LineString インスタンスには、少なくとも 4 つのポイントが必要です。

  • LineString インスタンスの始点と終点は同じである必要があります。

次の例は、受け入れられた 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))';
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';

@g4@g5は、受け入れられたPolygonインスタンスが有効なPolygonインスタンスではない可能性があることを示しています。 @g5 また、Polygon インスタンスには、4 つのポイントを受け入れるリングのみを含める必要があることを示しています。

次の例では、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の内部リングは、単一の接線点で自身と互いに触れることがありますが、Polygonクロスの内部リングの場合、インスタンスは無効です。

有効な 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) )';
DECLARE @g6 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid(), @g6.STIsValid();

@g1 は、内部リングが 2 か所で外部リングに触れるので無効です。 @g2 は、2 番目の内部リングが最初の内部リングの内部にあるため無効です。 @g3 は、2 つの内側のリングが複数の連続するポイントで触れるので無効です。 @g4 は、2 つの内部リングの内部が重なっているため無効です。 @g5 は、外部リングが最初のリングではないため無効です。 @g6 は、リングに少なくとも 3 つの異なる点がないため、無効です。

例示

次の例では、穴と SRID 10 を持つ単純な geometry``Polygon インスタンスを作成します。

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);

無効な Aninstance を入力し、有効な 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)))

無効なインスタンスを有効なジオメトリ インスタンスに変換する別の例を次に示します。 次の例では、 Polygon インスタンスは、まったく同じ 3 つのポイントを使用して作成されています。

DECLARE @g geometry
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');
SET @g = @g.MakeValid();
SELECT @g.ToString()

上記で返されるジオメトリ インスタンスは Point(1 3)です。 指定された PolygonPOLYGON((1 3, 1 5, 1 3, 1 3)) 場合、 MakeValid()LINESTRING(1 3, 1 5)を返します。

こちらもご覧ください

STArea (geometry データ型)STExteriorRing (geometry データ型)STNumInteriorRing (geometry データ型)STInteriorRingN (geometry データ型)STCentroid (geometry データ型)STPointOnSurface (geometry データ型)MultiPolygon空間データ (SQL Server)STIsValid (geography データ型)STIsValid (geometry データ型)