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
Polygon
instancia cuyo límite está definido por un anillo exterior.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 laPolygon
instancia.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 , Polygon
los 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)