Compartilhar via


CurvePolygon

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Banco de dados SQL no Microsoft Fabric

Um CurvePolygon é uma superfície topologicamente fechada definida por um anel delimitador externo e zero ou mais anéis internos nos dados espaciais do Mecanismo de Banco de Dados SQL.

Importante

Para obter uma descrição detalhada e exemplos de recursos espaciais introduzidos no SQL Server 2012 (11.x), incluindo o subtipo CurvePolygon, baixe o white paper, Novos recursos espaciais no SQL Server 2012.

Os critérios a seguir definem os atributos de uma instância CurvePolygon :

  • O limite da instância CurvePolygon é definido pelo anel exterior e por todos os anéis interiores.

  • O interior da instância CurvePolygon é o espaço entre o anel exterior e todos os anéis interiores.

Uma instância de CurvePolygon difere de uma instância de Polygon porque uma instância de CurvePolygon pode conter os seguintes segmentos de arco circular: CircularString e CompoundCurve.

Instâncias CompoundCurve

A ilustração a seguir mostra figuras de CurvePolygon válidas:

Instâncias aceitas

Para uma instância CurvePolygon ser aceita, ela precisa estar vazia ou conter apenas anéis de arco circular que sejam aceitos. Um anel de arco circular aceito atende aos requisitos a seguir.

  1. É uma instância LineString, CircularStringou CompoundCurve aceita. Para obter mais informações sobre instâncias aceitas, consulte LineString, CircularStringe CompoundCurve.

  2. Tem pelo menos quatro pontos.

  3. O início e o ponto de extremidade têm as mesmas coordenadas X e Y.

    Observação

    Os valores de Z e M são ignorados.

O exemplo a seguir mostra instâncias CurvePolygon aceitas.

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 é aceito, embora os pontos inicial e de extremidade tenham valores de Z diferentes, pois esses valores são ignorados. @g5 é aceito, embora a instância de tipo geography não seja válida.

Os exemplos a seguir geram um 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 não é aceito porque os pontos inicial e de extremidade não têm o mesmo valor de Y. @g2 não é aceito porque o anel não contém pontos suficientes.

Instâncias válidas

Para que uma instância CurvePolygon seja válida, os anéis exterior e interior devem atender aos seguintes critérios:

  1. Eles só podem tocar em pontos tangentes únicos.
  2. Eles não podem se cruzar.
  3. Cada anel deve conter pelo menos quatro pontos.
  4. Cada anel deve ser um tipo de curva aceitável.

As instânciasCurvePolygon também deverão atender a critérios específicos se fouem tipos de dados geometry ou geography .

Tipo de dados geometry

Uma instância geometryCurvePolygon válida deve ter os seguintes atributos:

  1. Todos os anéis interiores devem estar dentro do anel exterior.
  2. Pode ter vários anéis interiores, mas um anel interior não pode conter outro anel interior.
  3. Nenhum anel pode cruzar com outro anel ou com si próprio.
  4. Os anéis podem tocar apenas pontos tangentes únicos (o número de pontos onde os anéis tocam deve ser finito).
  5. O interior do polígono deve estar conectado.

O exemplo a seguir mostra uma instância geometryCurvePolygon válida.

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();  

As instâncias de CurvePolygon têm as mesmas regras de validade que as instâncias de Polygon, com a exceção de que as instâncias de CurvePolygon podem aceitar os novos tipos de segmento de arco circular. Para obter mais exemplos de instâncias válidas ou não válidas, consulte Polygon.

Tipo de dados geography

Uma instância geographyCurvePolygon válida deve ter os seguintes atributos:

  1. O interior do polígono é conectado usando a regra do lado esquerdo.
  2. Nenhum anel pode cruzar com outro anel ou com si próprio.
  3. Os anéis podem tocar apenas pontos tangentes únicos (o número de pontos onde os anéis tocam deve ser finito).
  4. O interior do polígono deve estar conectado.

O exemplo a seguir mostra uma instância CurvePolygon de geography válida.

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

Exemplos

R. Instanciar uma instância de geometria com um CurvePolygon vazio

Esse exemplo mostra como criar uma instância CurvePolygon vazia:

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

B. Declarar e instanciar uma instância de Geometry com um CurvePolygon na mesma instrução

Este snippet de código mostra como declarar e iniciar uma instância de geometry com um CurvePolygon na mesma instrução:

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

C. Instanciar uma instância de geografia com um CurvePolygon

Este snippet de código mostra como declarar e iniciar uma instância de geography com um 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. Armazenar um CurvePolygon com apenas um anel delimitador externo

Este exemplo mostra como armazenar um círculo simples em uma instância CurvePolygon (apenas um anel delimitador exterior é usado para definir o 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. Armazenar um CurvePolygon contendo anéis internos

Este exemplo cria uma rosca em uma instância CurvePolygon (um anel delimitador exterior e um anel interior são usados para definir a rosca):

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 exemplo mostra uma instância CurvePolygon válida e uma instância inválida ao usar anéis 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;  

Tanto o @g1 quanto o @g2 usam o mesmo anel delimitador exterior: um círculo com um raio de 5 e ambos usam um quadrado para um anel interior. Entretanto, a instância @g1 é válida, mas a instância @g2 é inválida. A razão pela qual @g2 é inválida é que o anel interior divide o espaço interno limitado pelo anel exterior em quatro regiões separadas. O desenho a seguir mostra o que ocorreu: