Partilhar via


CircularString

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase 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 curvo definido por três pontos num plano bidimensional; O primeiro ponto não pode ser o mesmo que o terceiro. Se todos os três pontos de um segmento de arco circular forem colineares, o segmento de arco é tratado como um segmento de reta.

Instâncias CircularString

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

Diagrama de exemplo de medições espaciais CircularString.

Instâncias aceitadas

Uma ocorrência de CircularString é aceita se estiver vazia ou contiver um número ímpar de pontos, n, onde n > 1. As seguintes instâncias CircularString 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 seguinte declaração de ocorrência CircularString não é aceita. Esta declaração lança um 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, ter um mínimo de três pontos).
  • O último ponto final para cada segmento de arco circular na sequência, exceto para o último segmento, deve ser o primeiro ponto final para o próximo segmento na sequência.
  • Deve ter um número ímpar de pontos.
  • Não pode sobrepor-se ao longo de 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 ocorrência de CircularString deve conter pelo menos dois segmentos de arco circular para definir um círculo completo. Uma ocorrência de 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 seguintes casos, um segmento de arco circular será tratado como um segmento de linha:

  • Quando os três pontos são colineares (por exemplo, (1, 3, 4, 4, 7, 5)).
  • Quando o primeiro e o ponto médio são os mesmos, mas o terceiro ponto é diferente (por exemplo, (1 3, 1 3, 7 5)).
  • Quando o ponto médio e o último ponto 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

Este exemplo mostra como criar uma ocorrência vazia de CircularString :

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

B. Instanciar uma ocorrência de geometria usando um CircularString com um segmento de arco circular

O exemplo a seguir mostra como criar uma ocorrência de 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 ocorrência de geometria usando um CircularString com vários segmentos de arco circulares

O exemplo a seguir mostra como criar uma ocorrência de CircularString com mais de um segmento de arco circular (círculo completo):

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

Aqui está o conjunto de resultados.

Circumference = 6.28319  

Compare a saída quando LineString é usado 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));  

Aqui está o conjunto de resultados.

Perimeter = 5.65685  

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

D. Declarar e instanciar uma instância de geometria com um "CircularString" na mesma declaração

Este trecho mostra como declarar e instanciar uma instância de geometria com um CircularString na mesma declaraçã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 instanciar uma instância de geografia com um 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 geometria com um CircularString que é uma linha reta

O exemplo a seguir mostra como criar uma ocorrência de CircularString que é uma linha reta:

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