多边形

A Polygon 是一个二维表面,存储为定义外部边界环和零个或多个内环的点序列。

多边形实例

可以通过具有至少三个不同点的环形成Polygon实例。 实例 Polygon 也可以为空。

Polygon 的外部环和任何内部环定义其边界。 环中的空间定义了Polygon的内部。

下图展示了Polygon实例的例子。

几何多边形实例的示例

如下图所示:

  1. 图 1 是一个 Polygon 实例,其边界由外部环定义。

  2. 图 2 是一个 Polygon 实例,其边界由外部环和两个内部环定义。 内部环内的区域是实例外部的 Polygon 一部分。

  3. 图 3 是一个有效 Polygon 实例,因为它的内部环在单个正切点相交。

接受的实例

接受Polygon的实例是可以在不引发异常的情况下存储在变量geometrygeography中的实例。 以下是接受 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)