CurvePolygon

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Un CurvePolygon es una superficie cerrada topológicamente definida por un anillo de límite exterior y cero o más anillos interiores

Importante

Para obtener una descripción detallada y ejemplos de las características espaciales de SQL Server 2012 (11.x), incluido el subtipo CurvePolygon, descargue las notas del producto Nuevas características espaciales de SQL Server 2012.

Los siguientes criterios definen atributos de una instancia de CurvePolygon :

  • El límite de la instancia de CurvePolygon se define mediante el anillo exterior y todos los anillos interiores.

  • El interior de la instancia de CurvePolygon es el espacio entre el anillo exterior y todos los anillos interiores.

Una instancia de CurvePolygon difiere de una instancia de Polygon en que una instancia de CurvePolygon puede contener los siguientes segmentos de arco circular: CircularString y CompoundCurve.

Instancias de CompoundCurve

La ilustración siguiente muestra figuras CurvePolygon válidas:

Instancias aceptadas

Para que una instancia de CurvePolygon se acepte, tiene que estar vacía o solo contener anillos de arco circulares aceptados. Un anillo de arco circular aceptado cumple los siguientes requisitos.

  1. Es una instancia de LineString, CircularStringo CompoundCurve aceptada. Para obtener más información sobre instancias aceptadas, vea LineString, CircularStringy CompoundCurve.

  2. Tiene cuatro puntos como mínimo.

  3. Los puntos inicial y final tienen las mismas coordenadas X e Y.

    Nota:

    Se omiten los valores Z y M.

El siguiente ejemplo muestra instancias aceptadas de CurvePolygon .

DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';  
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'  
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';  

@g3 aunque los puntos inicial y final tengan distintos valores Z porque se omiten los valores Z. @g5 se acepta aunque la instancia del tipo geography no sea válida.

Los ejemplos siguientes inician System.FormatException.

DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';  
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';  

@g1 no se acepta porque los puntos inicial y final no tienen el mismo valor Y. @g2 no se acepta porque el anillo no tiene suficientes puntos.

Instancias válidas

Para que una instancia de CurvePolygon sea válida los anillos exterior e interior deben cumplir los siguientes criterios:

  1. Solo pueden tocar en puntos de tangencia únicos.
  2. No pueden cruzarse entre sí.
  3. Cada anillo debe contener cuatro puntos como mínimo.
  4. Cada anillo debe ser un tipo de curva aceptable.

Las instancias deCurvePolygon tienen también que cumplir criterios concretos en función de que sean tipos de datos geometry o geography .

Tipo de datos geometry

Una instancia de geometryCurvePolygon válida debe tener los siguientes atributos:

  1. Todos los anillos interiores deben estar contenidos en el anillo exterior.
  2. Puede tener varios anillos interiores, pero un anillo interior no puede contener otro anillo interior.
  3. Ningún anillo puede cruzarse consigo mismo ni con otros.
  4. Los anillos solo pueden tocar en puntos de tangencia únicos (el número de puntos donde el contacto de los anillos debe ser finito).
  5. El interior del polígono debe estar conectado.

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

DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';  
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';  
SELECT @g1.STIsValid(), @g2.STIsValid();  

Las instancias de CurvePolygon tienen las mismas reglas de validez que las de Poligon con la excepción de que las instancias de CurvePolygon pueden aceptar los nuevos tipos de segmento de arco circular. Para obtener más ejemplos de instancias que son válidas o que no lo son, vea Polygon.

Tipo de datos geography

Una instancia de geographyCurvePolygon válida debe tener los siguientes atributos:

  1. El interior del polígono está conectado siguiendo la regla de la izquierda.
  2. Ningún anillo puede cruzarse consigo mismo ni con otros.
  3. Los anillos solo pueden tocar en puntos de tangencia únicos (el número de puntos donde el contacto de los anillos debe ser finito).
  4. El interior del polígono debe estar conectado.

En el siguiente ejemplo se muestra una instancia de CurvePolygon geography válida.

DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';  
SELECT @g.STIsValid();  

Ejemplos

A Crear una instancia de una instancia de geometry con un CurvePolygon vacío

En este ejemplo se muestra cómo crear una instancia de CurvePolygon vacía:

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON EMPTY');  

B. Declarar y crear instancias de una instancia geometry con un CurvePolygon en la misma instrucción

Este fragmento de código muestra cómo declarar e inicializar una instancia de geometry con un CurvePolygon en la misma instrucción:

DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'  

C. Crear instancias de una instancia de geography con un CurvePolygon

Este fragmento de código muestra cómo declarar e inicializar una instancia de geography con un CurvePolygon:

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

D. Almacenar un CurvePolygon con solo un anillo de límite exterior

En este ejemplo se muestra cómo almacenar un círculo simple en una instancia de CurvePolygon (solo se usa un anillo de límite exterior para definir el círculo):

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  

E. Almacenar un CurvePolygon que contiene anillos interiores

En este ejemplo se crea un anillo en una instancia de CurvePolygon (se usa un anillo de límite exterior y un anillo interior para definir el anillo):

DECLARE @g geometry;  
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');  
SELECT @g.STArea() AS Area;  

Este ejemplo muestra una instancia de CurvePolygon válida y una instancia no válida al usar los anillos interiores:

DECLARE @g1 geometry, @g2 geometry;  
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');  
IF @g1.STIsValid() = 1  
  BEGIN  
     SELECT @g1.STArea();  
  END  
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');  
IF @g2.STIsValid() = 1  
  BEGIN  
     SELECT @g2.STArea();  
  END  
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;  

@g1 y @g2 usan el mismo anillo de límite exterior: un círculo con un radio de 5 y los dos usan un cuadrado para un anillo interior. Sin embargo, la instancia de @g1 es válida, pero la instancia de @g2 no lo es. La razón de que @g2 no sea válida es que el anillo interior divide el espacio interior limitado por el anillo exterior en cuatro regiones independientes. El siguiente dibujo muestra lo que ha sucedido:

Consulte también

Polygon
CircularString
CompoundCurve
Referencia de los métodos del tipo de datos geometry
Referencia de los métodos del tipo de datos geography
Información general de los tipos de datos espaciales