Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
Como se muestra en la ilustración:
La figura 1 es una
Polygoninstancia cuyo límite está definido por un anillo exterior.La figura 2 es una
Polygoninstancia 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 laPolygoninstancia.La figura 3 es una instancia válida
Polygonporque 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
PolygonInstancia
Polygonque 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
LineStringinstancia debe aceptarse.La
LineStringinstancia debe tener al menos cuatro puntos.Los puntos inicial y final de la
LineStringinstancia 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)