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


CircularString

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

Важно!

Подробное описание и примеры новых пространственных функций, представленных в SQL Server 2012 г., включая CircularString подтип, можно скачать технический документ Новые пространственные функции в SQL Server 2012 г.

Экземпляры 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)).

Примеры

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

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

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

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

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

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

В. Создание экземпляра 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π (2 * pi), что является фактической окружностью круга.

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

Е. Создание экземпляра Geometry с экземпляром CircularString, представляющим прямую

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

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

См. также:

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