適用於:SQL Server
Azure 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 實例可包含下列圓弧區段:CircularString 和 CompoundCurve。
CompoundCurve 執行個體
下圖顯示了有效的 CurvePolygon 圖形:
已接受的執行個體
若要讓系統接受 CurvePolygon 執行個體,其必須為空的,或僅包含已接受的圓弧環形。 已接受的圓弧環形符合下列需求。
是可接受的 LineString、CircularString 或 CompoundCurve 執行個體。 如需有關已接受之執行個體的詳細資訊,請參閱 LineString、 CircularString,和 CompoundCurve。
至少有四個點。
開始和端點具有相同的 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 實例要視為有效,其外環和內環都必須符合下列準則:
- 它們只能在單一相切點接觸。
- 它們不能彼此交叉。
- 每個環形至少必須包含四個點。
- 每個環形都必須是可接受的曲線類型。
CurvePolygon 執行個體也必須符合特定準則,這些準則視其屬於 geometry 或 geography 資料類型而定。
幾何資料類型
有效的 geometryCurvePolygon 執行個體必須具有下列屬性:
- 所有內部環形都必須包含在外部環形中。
- 可以具有多個內部環形,但是某個內部環形不得包含另一個內部環形。
- 任何環都不得與自身或其他環交叉。
- 環形只能在單一正切點接觸 (環形接觸的點數必須是有限的)。
- 多邊形的內部必須連接在一起。
下列範例顯示有效的 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 執行個體必須具有下列屬性:
- 多邊形的內部依據左手定則連通。
- 任何環都不能與自身或其他環交叉。
- 環形只能在單一正切點接觸 (環形接觸的點數必須是有限的)。
- 多邊形的內部必須連接在一起。
下列範例示範一個有效的 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 無效的原因是,內部環形會將外部環形所限定的內部空間分割成四個不同的區域。 下圖將顯示所發生的情況: