Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
A CompoundCurve — это коллекция нулевых или более непрерывных экземпляров типов геометрии или географии CircularString или LineString.
Это важно
Для подробного описания и примеров новых пространственных функций в этом выпуске, включая CompoundCurve подтип, скачайте технический документ Новые Пространственные Функции в SQL Server 2012.
Можно создать пустой экземпляр 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соединены. Первая точка для каждого следующего сегмента круговой дуги совпадает с последней точкой на предыдущем сегменте такой дуги.Замечание
Сюда входят координаты 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.
Примеры
А. Создание экземпляра геометрии с пустым 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