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 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.
La ilustración siguiente muestra ejemplos de instancias de Polygon.
Como se muestra en la ilustración:
La figura 1 es una instancia de Polygon cuyo límite está definido mediante un anillo exterior.
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.
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 y cero o más anillos interiores aceptables.
Deben cumplirse necesariamente los criterios siguientes para que un anillo 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.
Ejemplos
El ejemplo siguiente crea una instancia sencilla de geometry Polygon 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);
Es posible especificar una instancia de no válida y convertirla 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 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)))
A continuación se muestra otro ejemplo de convertir una instancia no válida a una instancia de geometry 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).
Vea también
Referencia
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)
STIsValid (tipo de datos geography)
STIsValid (tipo de datos geometry)