A Polygon
是一个二维表面,存储为定义外部边界环和零个或多个内环的点序列。
多边形实例
可以通过具有至少三个不同点的环形成Polygon
实例。 实例 Polygon
也可以为空。
Polygon
的外部环和任何内部环定义其边界。 环中的空间定义了Polygon
的内部。
下图展示了Polygon
实例的例子。
如下图所示:
图 1 是一个
Polygon
实例,其边界由外部环定义。图 2 是一个
Polygon
实例,其边界由外部环和两个内部环定义。 内部环内的区域是实例外部的Polygon
一部分。图 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
此外,还显示多边形实例只需要包含一个环形,并且需要接受任何四个点。
以下示例引发一个 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)))
下面是将无效实例转换为有效几何图形实例的另一个示例。 在以下示例中, Polygon
实例是使用三个完全相同的点创建的:
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)
。 如果Polygon
给定为POLYGON((1 3, 1 5, 1 3, 1 3))
,那么MakeValid()
将返回LINESTRING(1 3, 1 5)
。
另请参阅
STArea (geometry Data Type)STExteriorRing (geometry Data Type)STNumInteriorRing (geometry Data Type)STInteriorRingN (geometry Data Type)STCentroid (geometry Data Type)STPointOnSurface (geometry Data Type)MultiPolygonSpatial Data (SQL Server)STIsValid (geography Data Type)STIsValid (geometry Data Type)