Поделиться через


MultiPolygon

Экземпляр MultiPolygon представляет собой коллекцию экземпляров Polygon.

Экземпляры MultiPolygon

На рисунке ниже приведены примеры экземпляров MultiPolygon.

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

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

  • 1 — экземпляр типа MultiPolygon с двумя элементами Polygon. Граница определяется двумя внешними кольцами и тремя внутренними кольцами.

  • 2 — экземпляр типа MultiPolygon с двумя элементами Polygon. Граница определяется двумя внешними кольцами и тремя внутренними кольцами. Два элемента Polygon пересекаются в точке касания.

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

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

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

  • Все экземпляры, составляющие экземпляр MultiPolygon, являются принятыми экземплярами Polygon. Дополнительные сведения о принятых экземплярах Polygon см. в разделе Polygon.

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

DECLARE @g1 geometry = 'MULTIPOLYGON EMPTY';
DECLARE @g2 geometry = 'MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 3, 1 1)))';
DECLARE @g3 geometry = 'MULTIPOLYGON(((2 2, 2 -2, -2 -2, -2 2, 2 2)),((1 1, 3 1, 3 3, 1 3, 1 1)))';

Следующий пример демонстрирует экземпляр MultiPolygon, выдающий исключение System.FormatException.

DECLARE @g geometry = 'MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3)))';

Второй экземпляр в экземпляре MultiPolygon — это экземпляр LineString, а не допустимый экземпляр Polygon.

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

Экземпляр MultiPolygon является допустимым, если это пустой экземпляр MultiPolygon или если он удовлетворяет следующим критериям.

  1. Все экземпляры, составляющие экземпляр MultiPolygon, являются допустимыми экземплярами Polygon. Допустимые экземпляры Polygon см. в разделе Polygon.

  2. Экземпляры Polygon, составляющие экземпляр MultiPolygon, не перекрываются.

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

DECLARE @g1 geometry = 'MULTIPOLYGON EMPTY';
DECLARE @g2 geometry = 'MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 3, 1 1)))';
DECLARE @g3 geometry = 'MULTIPOLYGON(((2 2, 2 -2, -2 -2, -2 2, 2 2)),((1 1, 3 1, 3 3, 1 3, 1 1)))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid();

Экземпляр @g2 является допустимым, поскольку два экземпляра Polygon соприкасаются только в точке касания. Экземпляр @g3 недопустим, поскольку внутренние области двух экземпляров Polygon перекрываются.

Примеры

Следующий пример демонстрирует создание экземпляра MultiPolygon типа geometry и возвращает второй компонент в формате Well-Known Text (WKT).

DECLARE @g geometry;
SET @g = geometry::Parse('MULTIPOLYGON(((0 0, 0 3, 3 3, 3 0, 0 0), (1 1, 1 2, 2 1, 1 1)), ((9 9, 9 10, 10 9, 9 9)))');
SELECT @g.STGeometryN(2).STAsText();

В данном примере создается пустой экземпляр MultiPolygon.

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