Compartir a través de


Polígono

Un Polygon es una superficie bidimensional almacenada como una secuencia de puntos que definen un anillo delimitador exterior y cero o más anillos interiores.

Instancias de polígono

Una Polygon instancia se puede formar a partir de un anillo que tenga al menos tres puntos distintos. Una Polygon instancia también puede estar vacía.

El exterior y los anillos interiores de un Polygon definen su límite. El espacio dentro de los anillos define el interior del Polygon.

En la ilustración siguiente se muestran ejemplos de Polygon instancias.

Ejemplos de instancias de Polígono de geometría

Como se muestra en la ilustración:

  1. La figura 1 es una Polygon instancia cuyo límite está definido por un anillo exterior.

  2. La figura 2 es una Polygon instancia cuyo límite está definido por un anillo exterior y dos anillos interiores. El área dentro de los anillos interiores forma parte del exterior de la Polygon instancia.

  3. La figura 3 es una instancia válida Polygon porque sus anillos interiores se intersecan en un único punto tangente.

Instancias aceptadas

Las instancias aceptadas Polygon son instancias que se pueden almacenar en una geometry variable o geography sin producir una excepción. Las siguientes instancias Polygon son aceptadas.

  • Una instancia vacía Polygon

  • Instancia Polygon que tiene un anillo exterior aceptable y cero o más anillos interiores aceptables

Se necesitan los siguientes criterios para que un anillo sea aceptable.

  • La LineString instancia debe aceptarse.

  • La LineString instancia debe tener al menos cuatro puntos.

  • Los puntos inicial y final de la LineString instancia deben ser los mismos.

En el ejemplo siguiente se muestran instancias aceptadas 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))';

Como muestran @g4 y @g5, una instancia Polygon aceptada puede no ser una instancia válida Polygon. @g5 también muestra que una instancia de Polygon solo debe contener un anillo con los cuatro puntos que se van a aceptar.

En los ejemplos siguientes se produce una System.FormatException excepción porque no se aceptan las Polygon instancias.

DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';

@g1 no se acepta porque la LineString instancia del anillo exterior no contiene suficientes puntos. @g2 no se acepta porque el punto inicial de la instancia del anillo LineString exterior no es el mismo que el punto final. El siguiente ejemplo tiene un anillo exterior aceptable, pero el anillo interior no es aceptable. Esto también lanza una excepción System.FormatException.

DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';

Instancias válidas

Los anillos interiores de una Polygon pueden tocarse entre sí y unos a otros en un único punto tangente, pero si los anillos interiores de una Polygon se cruzan, la instancia no es válida.

En el ejemplo siguiente se muestran instancias válidas 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 es válido porque los dos anillos interiores tocan en un único punto y no se cruzan entre sí. En el ejemplo siguiente se muestran Polygon instancias que no son válidas.

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 no es válido porque el anillo interior toca el anillo exterior en dos lugares. @g2 no es válido porque el segundo anillo interno está dentro del primer anillo interno. @g3 no es válido porque los dos anillos internos se tocan en múltiples puntos consecutivos. @g4 no es válido porque los interiores de los dos anillos internos se superponen. @g5 no es válido porque el anillo exterior no es el primer anillo. @g6 no es válido porque el anillo no tiene al menos tres puntos distintos.

Ejemplos

En el ejemplo siguiente se crea una instancia simple geometry``Polygon con un agujero y SRID 10.

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);

Una instancia no válida puede ser introducida y convertida en una instancia válida geometry. En el ejemplo siguiente de , Polygonlos anillos interiores y exteriores se superponen y la instancia no es válida.

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))');

En el ejemplo siguiente, la instancia no válida se hace válida con MakeValid().

SET @g = @g.MakeValid();
SELECT @g.ToString();

La instancia geometry devuelta del ejemplo anterior es una 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)))

Este es otro ejemplo de la conversión de una instancia no válida en una instancia de geometría válida. En el ejemplo siguiente, la Polygon instancia se ha creado con tres puntos que son exactamente iguales:

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

La instancia de geometría devuelta anteriormente es un Point(1 3). Si el Polygon especificado es POLYGON((1 3, 1 5, 1 3, 1 3)), entonces MakeValid() devolvería LINESTRING(1 3, 1 5).

Véase también

STArea (tipo de datos geometry)STExteriorRing (tipo de datos geometry)STNumInteriorRing (tipo de datos geometry)STInteriorRingN (tipo de datos geometry)STCentroid (tipo de datos geometry)STPointOnSurface (tipo de datos geometry)MultiPolygonDatos espaciales (SQL Server)STIsValid (tipo de datos geography)STIsValid (tipo de datos geometry)