Polygon

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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 Polygon

Una instancia de Polygon se puede formar a partir de un anillo que tenga al menos tres puntos distintos. 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 de la instancia de Polygon.

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

Examples of geometry Polygon instances

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 aceptadas de Polygon son las instancias que pueden almacenarse en una variable de tipo geometry o geography sin generar una excepción. Se aceptan las siguientes instancias de Polygon :

  • Una instancia vacía de Polygon .
  • Una instancia de Polygon que tiene un anillo exterior aceptable ring (LineString) y cero o más anillos interiores aceptables (LineStrings).

Deben cumplirse necesariamente los criterios siguientes para que un anillo (LineString) sea aceptable.

  • La instancia de LineString debe ser aceptada.
  • La instancia de LineString debe tener al menos cuatro puntos.
  • Los puntos inicial y final de la instancia de LineString deben ser el mismo.

El siguiente ejemplo muestra instancias aceptadas de 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 aceptada de Polygon puede no ser una instancia de Polygon válida. @g5 también muestra que una instancia de Polygon solo necesita contener un anillo con cuatro puntos cualquiera para que se acepte.

Los ejemplos siguientes generan una excepción System.FormatException, porque las instancias de Polygon no se aceptan.

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 instancia de LineString para el anillo exterior no contiene suficientes puntos. @g2 no se acepta porque el punto inicial de la instancia de LineString del anillo exterior no es igual que el punto final. En el ejemplo siguiente hay un anillo exterior aceptable, pero el anillo interior no lo es. También en este caso se genera 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 instancia de Polygon pueden tocarse a sí mismos y unos con otros en puntos tangentes únicos, pero si dichos anillos se cruzan, la instancia de Polygon no es válida.

En el siguiente ejemplo se muestran instancias válidas de 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 se tocan en un mismo punto y no se cruzan. El siguiente ejemplo muestra instancias de Polygon no 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 interior está dentro del interior del primer anillo interior. @g3 no es válido porque los dos anillos interiores se tocan en varios puntos consecutivos. @g4 no es válido porque los interiores de los dos anillos interiores 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.

Orientación de datos espaciales

La orientación de anillo de un polígono no es un factor importante en el sistema plano. Las características simples de OGC para la especificación de SQL no dictan una ordenación de anillos y SQL Server no exige la ordenación de anillos.

En un sistema elipsoidal, un polígono sin una orientación no tiene ningún significado, o es ambiguo. Por ejemplo, ¿un anillo alrededor del ecuador describe el hemisferio norte o el hemisferio sur? Si usamos el tipo de datos geography para almacenar la instancia espacial, debemos especificar la orientación del anillo y describir con precisión la ubicación de la instancia.

El interior del polígono de un sistema elipsoidal se define a partir de la "regla del lado izquierdo": si recorriéramos el anillo de un polígono de tipo geography siguiendo los puntos en el orden en que aparecen, el área de la izquierda se considera el interior del polígono y el área de la derecha, el exterior.

Sentido contrario a las agujas del reloj

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;

Visualization of 'left-hand rule' counter-clockwise orientation

Derecha

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;

Visualization of 'left-hand rule' clockwise orientation

Cuando el nivel de compatibilidad es 100 o menor en SQL Server, el tipo de datos geography tiene las siguientes restricciones:

  • Cada instancia de geography debe ajustarse en un hemisferio único. No se puede almacenar ningún objeto espacial mayor que un hemisferio.

  • Cualquier instancia de geography de una representación Well-Known Text (WKT) o Well-Known Binary (WKB) de Open Geospatial Consortium (OGC) que genera un objeto mayor que un hemisferio inicia una ArgumentException.

  • Los métodos del tipo de datos geography que requieren la entrada de dos instancias de geography, (como STIntersection(), STUnion(), STDifference() y STSymDifference()), devolverán NULL si los resultados de los métodos no se ajustan en un hemisferio único. STBuffer() también devolverá NULL si la salida supera un único hemisferio.

La orientación se puede invertir aprovechando el método extendido ReorientObject.

Ejemplos

Ejemplo A.

En el siguiente ejemplo se crea una instancia sencilla de geometryPolygon con un hueco 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);

Ejemplo B.

Una instancia que no es válida se puede especificar y convertir 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))'
    );  

Ejemplo C.

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

Ejemplo D.

Este es otro ejemplo de conversión de una instancia no válida en una instancia de geometría válida. En el siguiente ejemplo la instancia de Polygon 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 geometry devuelta es Point(1 3). Si el objeto Polygon proporcionado es POLYGON((1 3, 1 5, 1 3, 1 3)) , entonces MakeValid() devolverá LINESTRING(1 3, 1 5).

Consulte 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)
MultiPolígono
Datos espaciales (SQL Server)
STIsValid (tipo de datos geography)
STIsValid (tipo de datos geometry)