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


CompoundCurve

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

Важно!

Чтобы получить подробное описание и примеры новых пространственных функций в этом выпуске, включая CompoundCurve подтип, скачайте технический документ New Spatial Features in SQL Server 2012.

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

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

  2. Последовательность экземпляров CircularString или LineString должна быть непрерывной.

CompoundCurve Если содержит последовательность из нескольких CircularString экземпляров и LineString , конечная конечная точка для каждого экземпляра, за исключением последнего экземпляра, должна быть начальной конечной точкой для следующего экземпляра последовательности. Это означает, что, если конечная точка предыдущего экземпляра в последовательности — (4 3 7 2), начальной точкой следующего экземпляра в последовательности также должна быть (4 3 7 2). Обратите внимание, что значения Z (высота) и M (мера) этих точек также должны совпадать. Если такие две точки отличаются друг от друга, формируется исключение 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.

Примеры

A. Создание экземпляра geometry с пустым экземпляром CompoundCurve

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

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE EMPTY');

Б. Объявление и создание экземпляра geometry с экземпляром 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))';

В. Создание экземпляра geography с экземпляром 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.

Д. Создание экземпляра geometry с помощью экземпляра CompoundCurve с несколькими экземплярами CircularString

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

Е. Использование экземпляра CompoundCurve для хранения полуокружности

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

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(0 2, 2 0, 4 2), (4 2, 0 2))');
SELECT @g.STLength();

Ж. Хранение нескольких экземпляров CircularString и LineString в экземпляре CompoundCurve

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

З. Хранение экземпляров со значениями 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...

Периметр для круга 2 примерно равен 4π (4 * pi), что является фактическим значением для периметра. Напротив, значение периметра окружности 1 очень неточное. Экземпляр CompoundCurve окружности 1 хранит один сегмент окружности (ABC) и два линейных сегмента (CD, DA). Экземпляр CompoundCurve должен хранить два сегмента окружности (ABC, CDA), чтобы определять окружности. Экземпляр LineString определяет второй набор точек (4 2, 2 4, 0 2) в экземпляре CompoundCurve окружности 1. Необходимо явно объявить экземпляр CircularString в экземпляре CompoundCurve.

См. также:

STIsValid (тип данных geometry)STLength (тип данных geometry)STStartPoint (тип данных geometry)STEndpoint (тип данных geometry)LineStringCircularString SpatialData Types OverviewPoint