CurvePolygon
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечную точку аналитики SQL в хранилище Microsoft Fabric в базе данных SQL Microsoft Fabric в Microsoft Fabric
КриваяPolygon — это топологическая закрытая поверхность, определяемая внешним ограничивающим кольцом и нулевыми или более внутренними кольцами в пространственных данных модуля База данных SQL.
Внимание
Подробное описание и примеры пространственных функций, представленных в SQL Server 2012 (11.x), включая подтип CurvePolygon , скачайте технический документ, новые пространственные функции в SQL Server 2012.
Следующие критерии определяют атрибуты экземпляра CurvePolygon .
Границы экземпляра CurvePolygon определяются внешним кольцом и всеми внутренними кольцами.
Внутреннее пространство экземпляра CurvePolygon ― это пространство между внешним кольцом и всеми внутренними кольцами.
Экземпляр CurvePolygon отличается от экземпляра Polygon в том, что экземпляр CurvePolygon может содержать следующие сегменты круговой дуги: CircularString и CompoundCurve.
Экземпляры CompoundCurve
На следующей иллюстрации показаны допустимые фигуры CurvePolygon .
Правильные экземпляры
Чтобы экземпляр CurvePolygon был принят, он должен быть либо пустым, либо содержать только принимаемые кольца дуги. Принимаемое кольцо дуги удовлетворяет следующим требованиям.
Является принятым экземпляром LineString, CircularStringили CompoundCurve . Дополнительные сведения о принятых экземплярах см. в разделах LineString, CircularStringи CompoundCurve.
Имеет минимум четыре точки.
Начальная и конечная точка имеют одинаковые координаты X и Y.
Примечание.
Значения Z и M пропускаются.
В следующем примере показаны принятые экземпляры CurvePolygon .
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0, 0 0))';
DECLARE @g3 geometry = 'CURVEPOLYGON((0 0 1, 0 0 2, 0 0 3, 0 0 3))'
DECLARE @g4 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
DECLARE @g5 geography = 'CURVEPOLYGON((-122.3 47, 122.3 -47, 125.7 -49, 121 -38, -122.3 47))';
@g3
принимается, несмотря на то что начальная и конечная точки имеют различные значения Z, поскольку значения Z не учитываются. @g5
принимается, хотя экземпляр типа geography является недопустимым.
Следующие примеры вызывают исключение System.FormatException
.
DECLARE @g1 geometry = 'CURVEPOLYGON((0 5, 0 0, 0 0, 0 0))';
DECLARE @g2 geometry = 'CURVEPOLYGON((0 0, 0 0, 0 0))';
@g1
не принимается, поскольку не совпадают значения Y для начальной и конечной точек. @g2
не принимается, поскольку кольцо содержит недостаточное число точек.
Допустимые экземпляры
Чтобы экземпляр CurvePolygon был допустимым, внешние и внутренние кольца должны удовлетворять следующим критериям.
- Они могут касаться только в одной тангентной точке.
- Они не могут пересекать друг друга.
- Каждое кольцо должно содержать минимум четыре точки.
- Каждое кольцо должно принадлежать к приемлемому типу кривой.
Кроме того, экземплярыCurvePolygon должны удовлетворять особым критериям в зависимости от того, к какому типу данных они принадлежат, geometry или geography .
Тип данных Geometry
Допустимый экземпляр geometryCurvePolygon должен иметь следующие атрибуты:
- Все внутренние кольца должны находиться в пределах внешнего кольца.
- Могут иметь несколько внутренних колец, но при этом одно внутреннее кольцо не может содержать другое внутреннее кольцо.
- Кольцо не может пересекать само себя или другое кольцо.
- Кольца могут соприкасаться только в одной точке (число точек, где точки соприкасаются, должно быть конечным).
- Внутренняя часть многоугольника должна быть замкнутой.
В приведенном ниже примере показаны допустимые экземпляры geometryCurvePolygon .
DECLARE @g1 geometry = 'CURVEPOLYGON EMPTY';
DECLARE @g2 geometry = 'CURVEPOLYGON(CIRCULARSTRING(1 3, 3 5, 4 7, 7 3, 1 3))';
SELECT @g1.STIsValid(), @g2.STIsValid();
Экземпляры CurvePolygon имеют те же правила допустимости, что и экземпляры Polygon, за исключением того, что экземпляры CurvePolygon могут принимать новые типы сегментов круговой дуги. Дополнительные примеры допустимых и недопустимых экземпляров приведены в разделе Polygon.
Тип данных Geography
Допустимый экземпляр geographyCurvePolygon должен иметь следующие атрибуты:
- Внутреннее пространство многоугольника соединяется с использованием правила левой руки.
- Кольцо не может пересекать само себя или другое кольцо.
- Кольца могут соприкасаться только в одной точке (число точек, где точки соприкасаются, должно быть конечным).
- Внутренняя часть многоугольника должна быть замкнутой.
В следующем примере показан допустимый экземпляр CurvePolygon типа Geography.
DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';
SELECT @g.STIsValid();
Примеры
А. Создание экземпляра геометрии с пустой кривойPolygon
В этом примере показано, как создать пустой экземпляр CurvePolygon :
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON EMPTY');
B. Объявление и создание экземпляра геометрического экземпляра с помощью кривойPolygon в той же инструкции
В этом фрагменте кода показывается объявление и инициализация экземпляра типа Geometry с CurvePolygon в одной инструкции.
DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'
В. Создание экземпляра Geography с помощью кривойPolygon
На примере следующего фрагмента кода показано объявление и создание экземпляра geography с CurvePolygon.
DECLARE @g geography = 'CURVEPOLYGON(CIRCULARSTRING(-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';
D. Хранение кривойPolygon только с внешним ограничивающим кольцом
В этом примере показано сохранение простого круга в экземпляре CurvePolygon (для определения круга используется только внешнее ограничивающее кольцо):
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
Е. Хранение кривойPolygon, содержащей внутренние кольца
В этом примере в экземпляре CurvePolygon создается бублик (для определения бублика используются как внешнее ограничивающее кольцо, так и внутреннее кольцо):
DECLARE @g geometry;
SET @g = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 4, 4 0, 8 4, 4 8, 0 4), CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))');
SELECT @g.STArea() AS Area;
В этом примере показано, как при использовании внутренних колец экземпляр CurvePolygon может быть допустимым и недопустимым.
DECLARE @g1 geometry, @g2 geometry;
SET @g1 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (-2 2, 2 2, 2 -2, -2 -2, -2 2))');
IF @g1.STIsValid() = 1
BEGIN
SELECT @g1.STArea();
END
SET @g2 = geometry::Parse('CURVEPOLYGON(CIRCULARSTRING(0 5, 5 0, 0 -5, -5 0, 0 5), (0 5, 5 0, 0 -5, -5 0, 0 5))');
IF @g2.STIsValid() = 1
BEGIN
SELECT @g2.STArea();
END
SELECT @g1.STIsValid() AS G1, @g2.STIsValid() AS G2;
И в @g1
, и в @g2
используется одинаковое внешнее ограничивающее кольцо: круг с радиусом 5, а в качестве внутреннего кольца в обоих экземплярах используется квадрат. Но при этом экземпляр @g1
является допустимым, а @g2
― нет. Недопустимость @g2 вызвана тем, что внутреннее кольцо делит внутреннее пространство, ограниченное внешним кольцом, на четыре отдельные области. На следующем чертеже показано, что произошло.