Compartilhar via


CircularString

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureEndpoint de SQL Analytics no Microsoft FabricArmazém no Microsoft FabricBanco de Dados SQL no Microsoft Fabric

Um CircularString é uma coleção de zero ou mais segmentos de arco circulares contínuos. Um segmento de arco circular é um segmento curvado definido por três pontos em um plano bidimensional; o primeiro ponto não pode ser igual ao terceiro ponto. Se todos os três pontos de um segmento de arco circular forem colineares, o segmento de arco será tratado como um segmento de linha.

Instâncias de CircularString

O desenho seguinte mostra instâncias CircularString válidas:

Diagrama de medidas espaciais de exemplo de CircularString.

Instâncias aceitas

Uma instância CircularString será aceita se estiver vazia ou contiver um número ímpar de pontos, n, em que n > 1. As instâncias CircularString a seguir são aceitas.

DECLARE @g1 geometry = 'CIRCULARSTRING EMPTY';  
DECLARE @g2 geometry = 'CIRCULARSTRING(1 1, 2 0, -1 1)';  
DECLARE @g3 geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 2 0, 1 1)';  

@g3 mostra que a instância CircularString pode ser aceita, mas não válida. A declaração da instância CircularString a seguir não é aceita. Esta declaração lança uma System.FormatException.

DECLARE @g geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1)';  

Instâncias válidas

Uma instância CircularString válida deve estar vazia ou ter os seguintes atributos:

  • Deve conter, pelo menos, um segmento de arco circular (ou seja, que tenha um mínimo de três pontos).
  • O último ponto de extremidade para cada segmento de arco circular na sequência, com exceção do último segmento, deve ser o primeiro ponto de extremidade para o próximo segmento na sequência.
  • Deve ter um número ímpar de pontos.
  • Não pode se sobrepor a um intervalo.
  • Embora as instâncias de CircularString possam conter segmentos de linha, esses segmentos de linha devem ser definidos por três pontos colineares.

O exemplo a seguir mostra instâncias CircularString válidas.

DECLARE @g1 geometry = 'CIRCULARSTRING EMPTY';  
DECLARE @g2 geometry = 'CIRCULARSTRING(1 1, 2 0, -1 1)';  
DECLARE @g3 geometry = 'CIRCULARSTRING(1 1, 2 0, 2 0, 1 1, 0 1)';  
DECLARE @g4 geometry = 'CIRCULARSTRING(1 1, 2 2, 2 2)';  
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(),@g4.STIsValid();  

Uma instância CircularString deve conter, pelo menos, dois segmentos de arco circulares para definir um círculo completo. Uma instância CircularString não pode usar um único segmento de arco circular (como [1 1, 3 1, 1 1]) para definir um círculo completo. Use (1 1, 2 2, 3 1, 2 0, 1 1) para definir o círculo.

O exemplo a seguir mostra instâncias CircularString que não são válidas.

DECLARE @g1 geometry = 'CIRCULARSTRING(1 1, 2 0, 1 1)';  
DECLARE @g2 geometry = 'CIRCULARSTRING(0 0, 0 0, 0 0)';  
SELECT @g1.STIsValid(), @g2.STIsValid();  

Instâncias com pontos colineares

Nos casos a seguir, um segmento de arco circular será tratado como um segmento de linha:

  • Quando todos os três pontos são colineares (por exemplo, (1 3, 4 4, 7 5)).
  • Quando o primeiro ponto e o ponto mediano são os mesmos, mas o terceiro ponto é diferente (por exemplo, (1 3, 1 3, 7 5)).
  • Quando o primeiro e o último pontos são os mesmos, mas o primeiro ponto é diferente (por exemplo, (1 3, 4 4, 4 4)).

Examples

A. Instanciar uma instância de geometria com um CircularString vazio

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

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

B. Instanciar uma instância de geometria usando um CircularString com um segmento de arco circular

O seguinte exemplo mostra como criar uma instância CircularString com um único segmento de arco circular (meio-círculo):

DECLARE @g geometry;  
SET @g = geometry:: STGeomFromText('CIRCULARSTRING(2 0, 1 1, 0 0)', 0);  
SELECT @g.ToString();  

C. Instanciar uma instância de geometria usando um CircularString com vários segmentos de arco circular

O seguinte exemplo mostra como criar uma instância CircularString com mais de um segmento de arco circular (círculo cheio):

DECLARE @g geometry;  
SET @g = geometry::Parse('CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1)');  
SELECT 'Circumference = ' + CAST(@g.STLength() AS NVARCHAR(10));    

Veja a seguir o conjunto de resultados.

Circumference = 6.28319  

Compare a saída quando LineString é usada em vez de CircularString:

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('LINESTRING(2 1, 1 2, 0 1, 1 0, 2 1)', 0);  
SELECT 'Perimeter = ' + CAST(@g.STLength() AS NVARCHAR(10));  

Veja a seguir o conjunto de resultados.

Perimeter = 5.65685  

O valor do exemplo CircularString é próximo de 2∏, que é a circunferência real do círculo.

D. Declare e instancie uma instância de geometry com um CircularString na mesma instrução

Este snippet mostra como declarar e criar uma instância de geometry com uma CircularString na mesma instrução:

DECLARE @g geometry = 'CIRCULARSTRING(0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)';  

E. Instanciar uma instância de geografia com um CircularString

O exemplo a seguir mostra como declarar e criar uma instância de geography com uma CircularString:

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

F. Instanciar uma instância de Geometry com um CircularString que é uma linha reta

O exemplo a seguir mostra como criar uma instância CircularString que é uma linha reta:

DECLARE @g geometry;  
SET @g = geometry::STGeomFromText('CIRCULARSTRING(0 0, 1 2, 2 4)', 0);