Polígono

Un elemento 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 Polygon

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

Los límites de una instancia de Polygon los define su anillo exterior junto con los anillos interiores que tenga. El espacio encerrado dentro de los anillos define el interior del elemento Polygon.

La ilustración siguiente muestra ejemplos de instancias de Polygon.

Ejemplos de instancias Polygon de geometry

Como se muestra en la ilustración:

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

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

  3. La figura 3 es una instancia de Polygon válida porque la intersección de sus anillos interiores se realiza en un solo punto tangente.

Instancias aceptadas

Las instancias de Polygon aceptadas son instancias que se pueden almacenar en una variable geometry o geography sin que se produzca una excepción. A continuación se muestran instancias de Polygon aceptadas para el tipo geometry:

  • Una instancia de Polygon vacía

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

Para que un anillo sea aceptable se necesitan los criterios siguientes.

  • La instancia de LineString debe ser aceptada.

  • La instancia de LineString debe tener al menos cuatro puntos que incluyan tres puntos distintivos.

  • Los puntos inicial y final de la instancia de LineString deben tener los mismos valores de X e Y.

    [!NOTA]

    Los valores de M y Z se omiten.

Una instancia de Polygon de un tipo geography solo es aceptada si la instancia es válida. Para obtener más información, vea Valid Geography Polygon Instances.

En el ejemplo siguiente se muestran instancias de Polygon aceptadas de tipos geometry.

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

Como @g4 muestra, una instancia de Polygon aceptada puede no ser una instancia de Polygon válida. En los ejemplos siguientes se produce una excepción System.FormatException porque las instancias de Polygon no son aceptadas.

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

@g1 no es aceptada porque la instancia de LineString para el anillo exterior no contiene suficientes puntos. @g2 no es aceptada porque el punto inicial de la instancia de LineString del anillo exterior no coincide con el punto final. En el ejemplo siguiente se incluye un anillo exterior aceptable, pero el anillo interior no es aceptable. Esto también produce 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

La validez de una instancia de Polygon depende de su tipo de variable.

Tipo de datos Geometry

Para que una instancia de Polygon de un tipo geometry sea válida, deben cumplirse los siguientes criterios:

  1. El primer anillo es el anillo exterior.

  2. Todos los anillos interiores están dentro del anillo exterior.

  3. Ningún anillo interior está dentro de otro anillo interior.

  4. Ningún anillo se toca con sí mismo o con otro anillo.

  5. Dos anillos no pueden compartir el mismo borde.

  6. El interior de un anillo interior no se puede superponer con el interior de otro anillo interior.

  7. Todos los anillos solo pueden tocarse entre sí o con otro anillo en cero o un número finito de puntos de tangencia.

  8. El interior de la instancia de Polygon está conectado. Debe haber al menos un trazado entre cualesquiera dos puntos interiores de la instancia que esté totalmente dentro de la instancia.

En el siguiente ejemplo se muestran instancias de Polygon válidas.

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álida porque los dos anillos interiores se tocan en un solo punto y no se cortan entre sí. En el siguiente ejemplo se muestran instancias de Polygon 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) )';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid();

@g1 no es válida porque el anillo interior toca al anillo exterior en dos puntos. @g2 no es válida porque el segundo anillo interior está dentro del primer anillo interior. @g3 no es válida porque los dos anillos interiores se tocan en varios puntos consecutivos. @g4 no es válida porque las partes interiores de los dos anillos interiores se superponen. @g5 no es válida porque el primer anillo es un anillo interior y el segundo anillo es un anillo exterior.

Tipo de datos Geography

Para que una instancia de Polygon de un tipo geography sea válida, deben cumplirse los siguientes criterios:

  1. La instancia debe cumplir todas las reglas necesarias para ser una instancia de Polygon aceptada de tipo geometry.

  2. El interior de la instancia está conectado utilizando la regla de la mano izquierda.

  3. La instancia puede caber en un hemisferio.

  4. Ningún anillo se cruza con sí mismo o con otro anillo.

  5. Todos los anillos solo pueden tocarse entre sí o con otro anillo en cero o un número finito de puntos de tangencia.

En el siguiente ejemplo se produce una excepción Microsoft.SqlServer.Types.GLArgumentException porque la instancia de Polygon supera un hemisferio.

DECLARE @g geography = 'POLYGON((-122.358 47.653, 122.348 47.649, 122.348 47.658, 122.358 47.658, -122.358 47.653))';

En el siguiente ejemplo se muestra una instancia de Polygon válida para el tipo geography.

DECLARE @g geography = 'POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';

Ejemplos

En el ejemplo siguiente se crea una instancia sencilla de geometryPolygon con un orificio y un SRID de 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 introducirse y convertirse en una instancia de geometry válida. En el ejemplo siguiente de Polygon, se superponen los anillos interiores y el exterior, 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 de geometry devuelta en el ejemplo anterior es de tipo 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)))