共用方式為


Polygon

Polygon 是儲存為一連串點的二維度介面,這些點可定義一個外部週框環形以及零個或多個內部環形。

Polygon 執行個體

Polygon 執行個體可以從環形組成 (此環形至少有三個相異點)。 Polygon 執行個體也可以是空的。

Polygon 的外部和任何內部環形定義了它的界限。 此環形內的空間定義了 Polygon 的內部。

下圖顯示 Polygon 執行個體的範例。

幾何 Polygon 執行個體的範例

如本圖所示:

  1. 圖 1 是 Polygon 執行個體,其界限是由外部環形所定義。

  2. 圖 2 是 Polygon 執行個體,其界限是由一個外部環形和兩個內部環形所定義。 內部環形內的區域是 Polygon 執行個體外部的一部分。

  3. 圖 3 是有效的 Polygon 執行個體,因為它的內部環形會在單一正切點上相交。

已接受的執行個體

已接受的 Polygon 執行個體是指可儲存在 geometry 或 geography 變數中而不會擲回例外狀況的執行個體。 已接受的 Polygon 執行個體如下:

  • 空的 Polygon 執行個體。

  • 具有可接受之外部環形以及零或多個可接受之內部環形的 Polygon 執行個體。

要讓環形成為可接受環形所需的準則如下。

  • 系統必須接受 LineString 執行個體。

  • LineString 執行個體至少必須具有四個點。

  • 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 執行個體必須只包含具有任何四個點的環形才能被接受。

下列範例會擲回 System.FormatException,因為系統不接受 Polygon 執行個體。

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 有效,因為這兩個內部環形在單一點接觸,而且沒有彼此相交。 下列範例會顯示無效的 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 無效,因為內部環形與外部環形有兩個接觸點。 @g2 無效,因為第二個內部環形位於第一個內部環形的內部。 @g3 無效,因為兩個內部環形有多個連續接觸點。 @g4 無效,因為兩個內部環形的內部互相重疊。 @g5 無效,因為內部環形不是第一個環形。 @g6 無效,因為環形並未包含至少三個不同的點。

範例

下列範例會建立包含一個洞及 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);

可輸入無效的 執行個體,並將它轉換成有效的 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)))

下面是另一個將無效執行個體轉換成有效 geometry 執行個體的範例。 在下列範例中,我們已經使用三個完全相同的點來建立 Polygon 執行個體:

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

上述傳回的 geometry 執行個體是 Point(1 3)。 如果給定的 Polygon 為 POLYGON((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 資料類型)

STIsValid (geography 資料類型)

STIsValid (geometry 資料類型)

概念

MultiPolygon

空間資料 (SQL Server)