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


CompoundCurve

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

Это важно

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

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

  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');

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

Д. Хранение квадрата в экземпляре 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.566370... значение равно 4π (4 * pi). Экземпляр 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 в CompoundCurve

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

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))');

И. Иллюстрирование того, почему экземпляры 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 составляет примерно 4π (4 * pi), что является фактическим значением периметра. Однако периметр для Circle One значительно неточный. Экземпляр Circle One CompoundCurve хранит один сегмент круговой дуги (ABC) и два сегмента линии (CD, DA). Экземпляр CompoundCurve должен хранить два сегмента круговой дуги (ABC, CDA), чтобы определить круг. Экземпляр LineString определяет второй набор точек (4 2, 2 4, 0 2) в экземпляре Circle One CompoundCurve . Необходимо явно объявить экземпляр объекта CircularString внутри CompoundCurve.

См. также

STIsValidSTLength (тип данных geometry)STStartPoint (геометрический тип данных)STEndpoint (геометрический тип данных)LineStringCircularStringОбзор пространственных типов данныхPoint