Polygon

Polygon представляет собой двухмерную поверхность, хранимую в виде последовательности точек, определяющих внешнее ограничивающее кольцо, и внутренних колец (последние могут отсутствовать).

Экземпляры Polygon

Каждый экземпляр Polygon должен быть сформирован на основе кольца, содержащего не менее трех уникальных точек. Экземпляр Polygon может быть пустым.

Внешнее и любое внутреннее кольца экземпляра Polygon определяют его границы. Пространство внутри колец определяет внутреннюю сторону экземпляра Polygon.

На следующем рисунке показаны примеры объектов Polygon.

Примеры объектов Polygon типа geometry

На рисунке представлены:

  1. на рисунке 1 представлен экземпляр Polygon, граница которого определяется внешним кольцом;

  2. на рисунке 2 представлен экземпляр Polygon, граница которого определяется внешним и двумя внутренними кольцами. Область внутри внутренних колец является частью внешней стороны экземпляра Polygon;

  3. на рисунке 3 представлен допустимый экземпляр Polygon, поскольку внутренние кольца пересекаются в одной точке касания.

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

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

  • Пустой экземпляр Polygon.

  • Экземпляр Polygon, имеющий приемлемое внешнее кольцо и от нуля и более приемлемых внутренних колец.

Допустимое кольцо должно отвечать следующим условиям.

  • Экземпляр LineString должен быть приемлемым.

  • Экземпляр LineString должен содержать как минимум четыре точки, включая три уникальные.

  • Начальная и конечная точки экземпляра LineString должны иметь одинаковые значения X и Y.

    ПримечаниеПримечание

    Значения Z и M не учитываются.

Экземпляр Polygon типа geography является приемлемым только в том случае, если экземпляр является приемлемым. Дополнительные сведения о допустимых экземплярах Polygon для типа geography см. в разделе BkmkValidGeographyPolygons.

В приведенных ниже примерах показываются приемлемые экземпляры Polygon.

DECLARE @g1 geometry = 'POLYGON EMPTY';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 1))';
DECLARE @g3 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 3 3, 0 3, 0 0))';
DECLARE @g4 geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(3 0, 6 0, 6 3, 3 3, 3 0))';

В примере @g4 показывается, что приемлемый экземпляр Polygon может быть недопустимым экземпляром Polygon. В следующих примерах будет выдано исключение System.FormatException, так как экземпляры Polygon являются неприемлемыми.

DECLARE @g1 geometry = 'POLYGON((1 1, 3 3, 1 1))';
DECLARE @g2 geometry = 'POLYGON((1 1, 3 3, 3 1, 1 5))';

@g1 не является приемлемым, поскольку экземпляр LineString для внутреннего кольца не содержит достаточного числа точек. @g2 является неприемлемым, поскольку начальная точка внешнего кольца экземпляра LineString не совпадает с конечной точкой. Следующие пример имеет приемлемое внешнее кольцо, но его внутреннее кольцо является неприемлемым. Также выдается исключение System.FormatException.

DECLARE @g geometry = 'POLYGON((-5 -5, -5 5, 5 5, 5 -5, -5 -5),(0 0, 3 0, 0 0))';

Допустимые экземпляры

Внутренние кольца экземпляра Polygon могут соприкасаться как сами с собой, так и друг с другом в точках одной касательной, но если внутренние кольца экземпляра Polygon пересекаются, экземпляр недействителен.

В приведенном ниже примере показываются допустимые экземпляры Polygon.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g3 является допустимым, поскольку два внутренних кольца соприкасаются в одной точке, не пересекая друг друга. В приведенном ниже примере показываются недопустимые экземпляры Polygon.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid();

@g1 не является допустимым, поскольку внутреннее кольцо в двух местах касается внешнего. @g2 является недопустимым, поскольку второе внутреннее кольцо находится внутри первого внутреннего кольца. @g3 является недопустимым, поскольку два внутренних кольца соприкасаются во множестве последовательных точек. @g4 является недопустимым, поскольку внутренние области двух внутренних колец перекрываются.

geometry, тип данных

Экземпляр Polygon типа geometry является допустимым в том случае, если он удовлетворяет следующим условиям.

  1. Первое кольцо является внешним кольцом.

  2. Все внутренние кольца лежат в пределах внешнего кольца.

  3. Ни одно из внутренних колец не лежит в пределах другого внутреннего кольца.

  4. Ни одно из колец не пересекает само себя или другое кольцо.

  5. Два кольца не могут иметь одну и ту же границу.

  6. Внутренняя область внутреннего кольца не может перекрывать внутреннюю область другого внутреннего кольца.

  7. Все кольца могут соприкасаться сами с собой или друг с другом только в нуле или конечном числе точек соприкосновения.

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

В приведенном ниже примере показываются допустимые экземпляры Polygon.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, -5 -10, -10 0))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

@g3 является допустимым, поскольку два внутренних кольца соприкасаются в одной точке, не пересекая друг друга. В приведенном ниже примере показываются недопустимые экземпляры Polygon.

DECLARE @g1 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (20 0, 0 10, 0 -20, 20 0))';
DECLARE @g2 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (5 0, 1 5, 1 -5, 5 0))';
DECLARE @g3 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 0 10, 0 -10, -10 0))';
DECLARE @g4 geometry = 'POLYGON((-20 -20, -20 20, 20 20, 20 -20, -20 -20), (10 0, 0 10, 0 -10, 10 0), (-10 0, 1 5, 0 -10, -10 0))';
DECLARE @g5 geometry = 'POLYGON((10 0, 0 10, 0 -10, 10 0), (-20 -20, -20 20, 20 20, 20 -20, -20 -20) )';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid();

@g1 не является допустимым, поскольку внутреннее кольцо касается внешнего в двух местах. @g2 является недопустимым, поскольку второе внутреннее кольцо находится внутри первого внутреннего кольца. @g3 является недопустимым, поскольку два внутренних кольца соприкасаются во множестве последовательных точек. @g4 является недопустимым, поскольку внутренние области двух внутренних колец перекрываются. @g5 является недопустимым, поскольку первое внутреннее кольцо является внутренним, а второе кольцо является внешним.

geography, тип данных

Экземпляр Polygon типа geography является допустимым, если он удовлетворяет следующим условиям.

  1. Чтобы считаться приемлемым, экземпляр Polygon типа geometry должен удовлетворять всем правилам.

  2. Внутренняя область экземпляра замкнута согласно правилу левой руки.

  3. Экземпляр может уместиться в полушарии.

  4. Ни одно из колец не пересекает само себя или другое кольцо.

  5. Все кольца могут соприкасаться сами с собой или друг с другом только в нуле или конечном числе точек соприкосновения.

В следующем примере выдается исключение Microsoft.SqlServer.Types.GLArgumentException, поскольку экземпляр Polygon выходит за пределы полушария.

DECLARE @g geography = 'POLYGON((-122.358 47.653, 122.348 47.649, 122.348 47.658, 122.358 47.658, -122.358 47.653))';

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

DECLARE @g geography = 'POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))';

Примеры

В следующем примере создается простой экземпляр geometryPolygon с отверстием и значением SRID, равным 10.

DECLARE @g geometry;
SET @g = geometry::STPolyFromText('POLYGON((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1))', 10);

Экземпляр , являющийся недопустимым, может быть введен и преобразован в допустимый экземпляр типа geometry. В следующем примере экземпляра Polygon внутреннее и внешнее кольца перекрещиваются, и экземпляр является недопустимым.

DECLARE @g geometry;
SET @g = geometry::Parse('POLYGON((1 0, 0 1, 1 2, 2 1, 1 0), (2 0, 1 1, 2 2, 3 1, 2 0))');

В следующем примере недопустимый экземпляр преобразуется в допустимый с помощью метода MakeValid().

SET @g = @g.MakeValid();
SELECT @g.ToString();

Экземпляром geometry, полученным в приведенном выше примере, является MultiPolygon.

MULTIPOLYGON (((2 0, 3 1, 2 2, 1.5 1.5, 2 1, 1.5 0.5, 2 0)), ((1 0, 1.5 0.5, 1 1, 1.5 1.5, 1 2, 0 1, 1 0)))