CircularString
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных SQL Microsoft Fabric в Microsoft Fabric
Объект 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);
Связанный контент
- Основные сведения о типах пространственных данных
- 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