Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
Конечная точка аналитики SQL в Microsoft Fabric
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
CompoundCurve — это коллекция из нуля или более непрерывных экземпляров CircularString или LineString для геометрических или географическихтипов.
Можно создать пустой экземпляр CompoundCurve , но, чтобы экземпляр CompoundCurve был допустимым, он должен удовлетворять следующим требованиям.
Должен содержать хотя бы один экземпляр CircularString или LineString .
Последовательность экземпляров CircularString или LineString должна быть непрерывной.
Если объект CompoundCurve содержит последовательность из нескольких экземпляров CircularString и LineString , то конечная точка каждого экземпляра, кроме последнего, должна быть начальной конечной точкой следующего экземпляра в последовательности. Это означает, что, если конечная точка предыдущего экземпляра в последовательности — (4 3 7 2), начальной точкой следующего экземпляра в последовательности также должна быть (4 3 7 2). Значения Z(elevation) и M(measure) для точки также должны совпадать. Если такие две точки отличаются друг от друга, формируется исключение System.FormatException . Точки в объектах CircularString могут не иметь значение Z или M. Если значения Z или M не заданы для конечной точки предыдущего экземпляра, начальная точка следующего экземпляра также не может иметь значения Z или M. Если конечная точка для предыдущей последовательности — (4 3), начальной точкой для следующей последовательности также должна быть (4 3) и не может быть (4 3 7 2). Все точки в экземпляре CompoundCurve должны либо не иметь значения Z, либо иметь одинаковые значения Z.
Экземпляры CompoundCurve
На следующей иллюстрации показаны допустимые типы CompoundCurve .
Принятые экземпляры
ЭкземплярCompoundCurve является правильным, если он пустой или удовлетворяет следующим требованиям.
Все экземпляры, содержащиеся в CompoundCurve , — это правильные экземпляры сегментов окружности. Дополнительные сведения о допустимых экземплярах сегментов окружности см. в разделах LineString и CircularString.
Все сегменты окружности в экземпляре CompoundCurve соединены. Первая точка каждого последующего сегмента совпадает с последней точкой предыдущего сегмента.
Note
Это касается и координат Z и M. То есть все четыре координаты (X, Y, Z и M) должны быть одинаковыми.
Ни один из вложенных экземпляров не является пустым.
В следующем примере показаны принятые экземпляры CompoundCurve .
DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';
В следующем примере показаны неправильные экземпляры CompoundCurve . Эти экземпляры формируют исключение System.FormatException.
DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING EMPTY)';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (1 0, 2 0))';
Допустимые экземпляры
Экземпляр CompoundCurve допустим, если удовлетворяет следующим требованиям.
Экземпляр CompoundCurve является правильным.
Все экземпляры сегментов окружности, содержащиеся в экземпляре CompoundCurve , допустимы.
В следующем примере показаны допустимые экземпляры CompoundCurve .
DECLARE @g1 geometry = 'COMPOUNDCURVE EMPTY';
DECLARE @g2 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 0, 0 1, -1 0), (-1 0, 2 0))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();
@g3 допустим, так как допустим экземпляр CircularString . Дополнительные сведения о допустимости экземпляра CircularString см. в разделе CircularString.
В следующем примере показаны недопустимые экземпляры CompoundCurve .
DECLARE @g1 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 1 1, 1 1), (1 1, 3 5, 5 4, 3 5))';
DECLARE @g2 geometry = 'COMPOUNDCURVE((1 1, 1 1))';
DECLARE @g3 geometry = 'COMPOUNDCURVE(CIRCULARSTRING(1 1, 2 3, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();
@g1 недопустим, поскольку второй экземпляр не является допустимым LineString.
@g2 недопустим, так как недопустим экземпляр LineString .
@g3 недопустим, так как недопустим экземпляр CircularString . Дополнительные сведения о допустимых экземплярах CircularString и LineString см. в разделах CircularString и LineString.
Examples
A. Создание экземпляра геометрии с пустым CompoundCurve
В следующем примере показано, как создать пустой экземпляр CompoundCurve .
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');
B. Объявление и создание экземпляра геометрического экземпляра с помощью CompoundCurve в той же инструкции
В следующем примере показано, как объявить и инициализировать экземпляр geometry с помощью CompoundCurve в одном операторе.
DECLARE @g geometry = 'COMPOUNDCURVE ((2 2, 0 0),CIRCULARSTRING (0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0))';
C. Создание экземпляра географического экземпляра с помощью CompoundCurve
В следующем примере показано объявление и инициализация экземпляра geography с CompoundCurve:
DECLARE @g geography = 'COMPOUNDCURVE(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';
D. Хранение квадрата в экземпляре CompoundCurve
В следующем примере показаны два способа использования экземпляра CompoundCurve для хранения квадрата.
DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3), (1 3, 3 3),(3 3, 3 1), (3 1, 1 1))');
SET @g2 = geometry::Parse('COMPOUNDCURVE((1 1, 1 3, 3 3, 3 1, 1 1))');
SELECT @g1.STLength(), @g2.STLength();
Длина экземпляров @g1 и @g2 одинакова. На этом примере видно, что в экземпляре CompoundCurve может храниться один или несколько экземпляров LineString.
E. Создание экземпляра геометрии с помощью CompoundCurve с несколькими циклическими строками
В следующем примере показано, как использовать два разных экземпляра CircularString для инициализации CompoundCurve.
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT @g.STLength();
Это создает выходные данные 12.5663706143592 , эквивалентные 4pi. Экземпляр CompoundCurve в этом примере хранит окружность с радиусом 2. В двух предыдущих примерах кода использование экземпляра CompoundCurveне требовалось. В первом примере было бы проще использовать экземпляр LineString , а во втором было бы проще использовать экземпляр CircularString . В следующем примере показано, когда следует использовать экземпляр CompoundCurve .
F. Использование CompoundCurve для хранения полуцирок
В следующем примере экземпляр CompoundCurve используется для хранения полукруга.
DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 0 2))');
SELECT @g.STLength();
G. Хранение нескольких экземпляров CircularString и LineString в СоставномCurve
В следующем примере показано, как можно хранить несколько экземпляров CircularString и LineString с помощью CompoundCurve.
DECLARE @g geometry
SET @g = geometry::Parse('COMPOUNDCURVE((3 5, 3 3), CIRCULARSTRING(3 3, 5 1, 7 3), (7 3, 7 5), CIRCULARSTRING(7 5, 5 7, 3 5))');
SELECT @g.STLength();
H. Хранение экземпляров со значениями Z и M
В следующем примере показано, как использовать экземпляр CompoundCurve для хранения последовательности экземпляров CircularString и LineString со значениями Z и M.
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(7 5 4 2, 5 7 4 2, 3 5 4 2), (3 5 4 2, 8 7 4 2))');
I. Почему экземпляры CircularString должны быть явно объявлены
В следующем примере показано, почему экземпляры CircularString должны быть явно объявлены. Программист желает хранить окружность в экземпляре CompoundCurve .
DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 2 4, 0 2))');
SELECT 'Circle One', @g1.STLength() AS Perimeter; -- gives an inaccurate amount
SET @g2 = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), CIRCULARSTRING(4 2, 2 4, 0 2))');
SELECT 'Circle Two', @g2.STLength() AS Perimeter; -- now we get an accurate amount
Вот результирующий набор.
Circle One11.940039...
Circle Two12.566370...
Периметр для circle Two составляет примерно 4pi, что является фактическим значением периметра. Напротив, значение периметра окружности 1 очень неточное. Экземпляр Circle One CompoundCurve хранит один сегмент круговой дуги (ABC) и два сегмента линии (CD, DA). Экземпляр CompoundCurve должен хранить два сегмента круговой дуги (ABC, CDA), чтобы определить круг. Экземпляр LineString определяет второй набор точек (4 2, 2 4, 0 2) в экземпляре CompoundCurve окружности 1. Необходимо явно объявить экземпляр CircularString в экземпляре CompoundCurve.