CircularString

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

Объект 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)).

Примеры

А. Создание экземпляра Geometry с пустым экземпляром CircularString

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

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

B. Создание экземпляра Geometry с экземпляром CircularString, содержащим один сегмент дуги

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

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

C. Создание экземпляра Geometry с помощью экземпляра 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. Объявление и создание экземпляра Geometry с экземпляром 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)';  

Е. Создание экземпляра Geography с экземпляром 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. Создание экземпляра Geometry с экземпляром CircularString, представляющим прямую

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

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

См. также

Основные сведения о типах пространственных данных
CompoundCurve
MakeValid (тип данных geography)
MakeValid (тип данных geometry)
STIsValid (тип данных geometry)
STIsValid (тип данных geography)
STLength (тип данных geometry)
STStartPoint (тип данных geometry)
STEndpoint (тип данных geometry)
STPointN (тип данных geometry)
STNumPoints (тип данных geometry)
STIsRing (тип данных geometry)
STIsClosed (тип данных geometry)
STPointOnSurface (тип данных geometry)
LineString