CurvePolygon

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

Это важно

Для подробного описания и примеров пространственных функций, представленных в SQL Server 2012, включая CurvePolygon подтип, скачайте технический документ, Новые пространственные функции в 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.

    Замечание

    Значения 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();  

Примеры

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

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

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

В. Объявление и создание экземпляра геометрического объекта с CurvePolygon в одном и том же операторе

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

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

С. Создание экземпляра географии с помощью полигон с криволинейной границей

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

Д. Хранение криволинейного многоугольника с единственным внешним ограничительным кольцом

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

Е. Хранение кривого многоугольника, содержащего внутренние кольца

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

См. также

Многоугольник
ЦиклическаяСтрока
CompoundCurve
Справочник по методам типа данных geometry
Справочник по методам типа данных “geography”
Общие сведения о типах пространственных данных