CurvePolygon

Применимо к:SQL ServerБаза данных Azure SQLУправляемый экземпляр Azure SQLКонечная точка аналитики SQL в Microsoft FabricХранилище в Microsoft FabricБаза данных SQL в Microsoft Fabric

CurvePolygon — это топологически замкнутая поверхность, определяемая внешним ограничивающим кольцом и не имеющая внутренних колец или имеющая одно либо несколько внутренних колец в пространственных данных компонента SQL ядро СУБД.

Important

Чтобы получить подробное описание и примеры пространственных возможностей, представленных в SQL Server 2012 (11.x), включая подтип CurvePolygon, скачайте технический документ New Spatial Features in SQL Server 2012.

Следующие критерии определяют атрибуты экземпляра CurvePolygon .

  • Границы экземпляра CurvePolygon определяются внешним кольцом и всеми внутренними кольцами.

  • Внутреннее пространство экземпляра CurvePolygon ― это пространство между внешним кольцом и всеми внутренними кольцами.

Экземпляр CurvePolygon отличается от экземпляра Polygon в том, что экземпляр CurvePolygon может содержать следующие сегменты круговой дуги: CircularString и CompoundCurve.

Экземпляры CompoundCurve

На следующей иллюстрации показаны допустимые фигуры CurvePolygon .

Принятые экземпляры

Чтобы экземпляр CurvePolygon считался допустимым, он должен либо быть пустым, либо содержать только допустимые кольца из круговых дуг. Принимаемое кольцо дуги удовлетворяет следующим требованиям.

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

  2. Имеет минимум четыре точки.

  3. Начальная и конечная точка имеют одинаковые координаты X и Y.

    Note

    Значения 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 был допустимым, внешние и внутренние кольца должны удовлетворять следующим критериям.

  1. Они могут касаться только в одной тангентной точке.
  2. Они не могут пересекать друг друга.
  3. Каждое кольцо должно содержать минимум четыре точки.
  4. Каждое кольцо должно принадлежать к приемлемому типу кривой.

Кроме того, экземплярыCurvePolygon должны удовлетворять особым критериям в зависимости от того, к какому типу данных они принадлежат, geometry или geography .

Тип данных «Геометрия»

Допустимый экземпляр geometryCurvePolygon должен иметь следующие атрибуты:

  1. Все внутренние кольца должны находиться в пределах внешнего кольца.
  2. Могут иметь несколько внутренних колец, но при этом одно внутреннее кольцо не может содержать другое внутреннее кольцо.
  3. Кольцо не может пересекать само себя или другое кольцо.
  4. Кольца могут соприкасаться только в одной точке (число точек, где точки соприкасаются, должно быть конечным).
  5. Внутренняя область многоугольника должна быть связной.

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

Тип данных «География»

Допустимый экземпляр geographyCurvePolygon должен иметь следующие атрибуты:

  1. Внутреннее пространство многоугольника соединяется с использованием правила левой руки.
  2. Кольцо не может пересекать само себя или другое кольцо.
  3. Кольца могут соприкасаться только в одной точке (число точек, где точки соприкасаются, должно быть конечным).
  4. Внутренняя область многоугольника должна быть связной.

В следующем примере приведён корректный экземпляр geography CurvePolygon.

DECLARE @g geography = 'CURVEPOLYGON((-122.3 47, 122.3 47, 125.7 49, 121 38, -122.3 47))';  
SELECT @g.STIsValid();  

Examples

A. Создание экземпляра геометрии с пустой кривойPolygon

В этом примере показано, как создать пустой экземпляр CurvePolygon :

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

B. Объявление и создание экземпляра Geometry с объектом CurvePolygon в одной инструкции

В этом фрагменте кода показано, как объявить и инициализировать экземпляр геометрии с CurvePolygon в одном выражении:

DECLARE @g geometry = 'CURVEPOLYGON(CIRCULARSTRING(2 4, 4 2, 6 4, 4 6, 2 4))'  

C. Создание экземпляра Geography с помощью объекта CurvePolygon

В этом фрагменте кода показано, как объявить и инициализировать экземпляр 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. Сохранить CurvePolygon только с внешним ограничивающим кольцом

В этом примере показано сохранение простого круга в экземпляре 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;  

E. Сохранение криволинейного полигона, содержащего внутренние кольца

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