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