Поделиться через


CircularString

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных SQL Microsoft Fabric в Microsoft Fabric

Объект CircularString — это коллекция, состоящая из нуля или большего количества непрерывных круговых сегментов дуги. Сегмент дуги — это сегмент кривой, определяемый тремя точками на двумерной плоскости; первая точка не может совпадать с третьей. Если все три точки сегмента дуги лежат на одной прямой, сегмент дуги считается линейным сегментом.

Экземпляры CircularString

На следующем рисунке показаны допустимые экземпляры CircularString .

Схема примеров пространственных измерений CircularString.

Правильные экземпляры

Экземпляр CircularString принимается, если он является пустым или содержит нечетное количество точек, n, где n > 1. Следующие экземпляры CircularString правильные.

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 показывает, что экземпляр CircularString может быть принят, но недопустим. Следующее объявление экземпляра CircularString неверно. Это объявление вызывает исключение System.FormatException.

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

Допустимые экземпляры

Допустимый экземпляр CircularString должен быть пуст или иметь следующие атрибуты:

  • Он должен содержать хотя бы один сегмент дуги (то есть не менее трех точек).
  • Последняя конечная точка каждого из отрезков дуги в последовательности, кроме последнего, должна совпадать с первой конечной точкой следующего сегмента в последовательности.
  • Количество точек должно быть нечетным.
  • Он не должен перекрываться собой.
  • Хотя экземпляры CircularString могут содержать сегменты линий, эти сегменты линий должны быть определены тремя кольцевой точками.

В следующем примере показаны допустимые экземпляры CircularString .

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

Для определения окружности экземпляр CircularString должен содержать как минимум два сегмента дуги. Для определения окружности экземпляр CircularString не может содержать один сегмент дуги (например, (1 1, 3 1, 1 1)). Для определения окружности используйте (1 1, 2 2, 3 1, 2 0, 1 1).

В следующем примере показаны недопустимые экземпляры CircularString.

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

Экземпляры с точками, лежащими на прямой

Сегмент дуги будет считаться линейным сегментом в следующих случаях.

  • Когда все три точки лежат на одной прямой (например, (1 3, 4 4, 7 5)).
  • Когда первая и средняя точки совпадают, а третья точка отличается от них (например, (1 3, 1 3, 7 5)).
  • Когда средняя и последняя точки совпадают, а первая точка отличается от них (например, (1 3, 4 4, 4 4)).

Примеры

А. Создание экземпляра геометрии с пустым циклическимstring

В этом примере показано, как создать пустой экземпляр CircularString :

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

B. Создание экземпляра геометрии с помощью циклическогоstring с одним сегментом круговой дуги

В следующем примере показывается создание экземпляра CircularString с одним сегментом дуги (полукруга):

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

В. Создание экземпляра геометрического экземпляра с помощью circularString с несколькими сегментами круговой дуги

В следующем примере показывается создание экземпляра CircularString более чем с одним сегментом дуги (круга):

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

Вот результирующий набор.

Circumference = 6.28319  

Сравните вывод, получаемый при использовании LineString вместо 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));  

Вот результирующий набор.

Perimeter = 5.65685  

Значение для примера CircularString близко к 2∏, что является фактической окружностью круга.

D. Объявление и создание экземпляра геометрического экземпляра с помощью CircularString в той же инструкции

В этом фрагменте кода показывается объявление и создание экземпляра geometry с экземпляром CircularString в одной инструкции:

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

Е. Создание экземпляра географического экземпляра с помощью CircularString

В следующем примере показывается объявление и создание экземпляра geography с экземпляром 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. Создание экземпляра геометрии с циклической строкой

В следующем примере показывается создание экземпляра CircularString , представляющего прямую:

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