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


CompoundCurve

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

CompoundCurve — это коллекция из нуля или более непрерывных экземпляров CircularString или LineString для геометрических или географических типов.

Можно создать пустой экземпляр CompoundCurve , но, чтобы экземпляр CompoundCurve был допустимым, он должен удовлетворять следующим требованиям.

  1. Должен содержать хотя бы один экземпляр CircularString или LineString .

  2. Последовательность экземпляров 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 является правильным, если он пустой или удовлетворяет следующим требованиям.

  1. Все экземпляры, содержащиеся в CompoundCurve , — это правильные экземпляры сегментов окружности. Дополнительные сведения о допустимых экземплярах сегментов окружности см. в разделах LineString и CircularString.

  2. Все сегменты окружности в экземпляре CompoundCurve соединены. Первая точка каждого последующего сегмента совпадает с последней точкой предыдущего сегмента.

    Примечание.

    Это касается и координат Z и M. То есть все четыре координаты (X, Y, Z и M) должны быть одинаковыми.

  3. Ни один из вложенных экземпляров не является пустым.

В следующем примере показаны принятые экземпляры 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 допустим, если удовлетворяет следующим требованиям.

  1. Экземпляр CompoundCurve является правильным.

  2. Все экземпляры сегментов окружности, содержащиеся в экземпляре 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.

Примеры

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

В следующем примере показано, как создать пустой экземпляр 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))';  

В. Создание экземпляра географического экземпляра с помощью 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.

Е. Создание экземпляра геометрии с помощью 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.