CurvePolygon

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Microsoft Fabric 中的 SQL 分析端點Microsoft Fabric 中的倉儲Microsoft Fabric 中的 SQL 資料庫

在 SQL 資料庫引擎的空間資料中,CurvePolygon 是由一個外部邊界環以及零個或多個內部環所定義的拓撲封閉表面。

重要

如需 SQL Server 2012 (11.x) 中導入的空間功能的詳細描述和範例 (包括 CurvePolygon 子類型),請下載白皮書:SQL Server 2012 中的新空間功能

下列準則會定義 CurvePolygon 執行個體的屬性:

  • CurvePolygon 執行個體的界限是由外部環形和所有內部環形所定義。

  • CurvePolygon 執行個體的內部是外部環形與所有內部環形之間的空間。

CurvePolygon 實例與 Polygon 實例的不同之處在於,CurvePolygon 實例可包含下列圓弧區段:CircularStringCompoundCurve

CompoundCurve 執行個體

下圖顯示了有效的 CurvePolygon 圖形:

已接受的執行個體

若要讓系統接受 CurvePolygon 執行個體,其必須為空的,或僅包含已接受的圓弧環形。 已接受的圓弧環形符合下列需求。

  1. 是可接受的 LineStringCircularStringCompoundCurve 執行個體。 如需有關已接受之執行個體的詳細資訊,請參閱 LineStringCircularString,和 CompoundCurve

  2. 至少有四個點。

  3. 開始和端點具有相同的 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 值。 即使 geography 型別執行個體無效,@g5 仍會被接受。

下列範例會擲回 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. 它們只能在單一相切點接觸。
  2. 它們不能彼此交叉。
  3. 每個環形至少必須包含四個點。
  4. 每個環形都必須是可接受的曲線類型。

CurvePolygon 執行個體也必須符合特定準則,這些準則視其屬於 geometrygeography 資料類型而定。

幾何資料類型

有效的 geometryCurvePolygon 執行個體必須具有下列屬性:

  1. 所有內部環形都必須包含在外部環形中。
  2. 可以具有多個內部環形,但是某個內部環形不得包含另一個內部環形。
  3. 任何環都不得與自身或其他環交叉。
  4. 環形只能在單一正切點接觸 (環形接觸的點數必須是有限的)。
  5. 多邊形的內部必須連接在一起。

下列範例顯示有效的 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

地理資料類型

有效的 geographyCurvePolygon 執行個體必須具有下列屬性:

  1. 多邊形的內部依據左手定則連通。
  2. 任何環都不能與自身或其他環交叉。
  3. 環形只能在單一正切點接觸 (環形接觸的點數必須是有限的)。
  4. 多邊形的內部必須連接在一起。

下列範例示範一個有效的 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 宣告並初始化幾何執行個體:

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 無效的原因是,內部環形會將外部環形所限定的內部空間分割成四個不同的區域。 下圖將顯示所發生的情況: