Многоугольник
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Polygon представляет собой двухмерную поверхность, хранимую в виде последовательности точек, определяющих внешнее ограничивающее кольцо, и внутренних колец (последние могут отсутствовать).
Экземпляры многоугольников
Каждый экземпляр Polygon должен быть сформирован на основе кольца, содержащего не менее трех уникальных точек. Экземпляр Polygon может быть пустым.
Внешнее и любое внутреннее кольца экземпляра Polygon определяют его границы. Пространство внутри колец определяет внутреннюю сторону экземпляра Polygon.
На рисунке ниже приведены примеры экземпляров Polygon .
На рисунке представлены:
на рисунке 1 представлен экземпляр Polygon , граница которого определяется внешним кольцом;
на рисунке 2 представлен экземпляр Polygon , граница которого определяется внешним и двумя внутренними кольцами. Область внутри внутренних колец является частью внешней стороны экземпляра Polygon ;
на рисунке 3 представлен допустимый экземпляр Polygon , поскольку внутренние кольца пересекаются в одной точке касания.
Правильные экземпляры
Правильные экземпляры Polygon — это экземпляры, которые можно сохранить в переменной geometry или geography , не вызывая исключения. Следующие экземпляры Polygon являются правильными:
- Пустой экземпляр Polygon
- Экземпляр Polygon с допустимым внешним кольцом (LineString) и с нулем или большим количеством допустимых внутренних колец (LineStrings).
Чтобы кольцо (LineString) было допустимым, должны выполняться следующие требования.
- Экземпляр LineString должен быть принят.
- Экземпляр LineString должен иметь не менее четырех точек.
- Начальная и конечная точки экземпляра LineString должны совпадать.
В следующем примере показаны принятые экземпляры 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))';
DECLARE @g5 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
На примере @g4
и @g5
видно, что может приниматься экземпляр Polygon , который не является допустимым экземпляром Polygon . @g5
также показывает, что экземпляр 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 .
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) )';
DECLARE @g6 geometry = 'POLYGON((1 1, 1 1, 1 1, 1 1))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid(), @g5.STIsValid(), @g6.STIsValid();
@g1
не является допустимым, так как внутреннее кольцо касается внешнего кольца в двух местах. @g2
не является допустимым, так как второй внутренний круг в интерьере первого внутреннего кольца. @g3
недействителен, так как два внутренних кольца касаются нескольких последовательных точек. @g4
не является допустимым, так как интерьеры двух внутренних кругов перекрываются. @g5
не является допустимым, так как внешнее кольцо не является первым кольцом. @g6
недействителен, так как кольцо не имеет по крайней мере трех разных точек.
Ориентация пространственных данных
Ориентация кольца многоугольника не является важным фактором в планарной системе. Простые функции OGC для спецификации SQL не диктуют порядок кругов, и SQL Server не применяет порядок кругов.
В эллиптической модели без указания ориентации многоугольник не определен или является неоднозначным. Например, описывает ли кольцо вокруг экватора северное или южное полушарие? При использовании типа данных geography для хранения пространственного экземпляра необходимо указать ориентацию кольца и точно описать расположение экземпляра.
Внутренняя часть многоугольника в эллиптической системе определяется по правилу левой руки: если двигаться вдоль географического прямоугольника, следуя по точкам в том порядке, в котором они указаны, область слева будет считаться внутренней частью, а область справа — внешней.
Против часовой стрелки
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;
По часовой стрелке
DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;
Если уровень совместимости равен 100 или ниже в SQL Server, то тип данных geography имеет следующие ограничения:
Любой экземпляр geography должен лежать в пределах одного полушария. Не допускается сохранение пространственных объектов больше размера полушария.
Любой экземпляр geography в представлении консорциума OGC Well-Known Text (WKT) или Well-Known Binary (WKB), порождающий объект больше полушария, приводит к возникновению исключения ArgumentException.
Методы типа данных geography, требующие ввода двух экземпляров географии (например, STIntersection(), STUnion(), STDifference() и STSymDifference()), возвращают значение NULL, если результаты из методов не помещаются внутри одного полушария. Метод STBuffer() также возвращает значение NULL, если выходные данные выходят за пределы одного полушария.
Ориентация может быть отменена с помощью расширенного метода ReorientObject .
Примеры
Пример А.
В следующем примере создается простой экземпляр geometry
Polygon
с gap и 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)))
Пример Г.
Это еще один пример преобразования недопустимого экземпляра в допустимый экземпляр geometry. В следующем примере создается экземпляр Polygon
с тремя одинаковыми точками:
DECLARE @g geometry
SET @g = geometry::Parse('POLYGON((1 3, 1 3, 1 3, 1 3))');
SET @g = @g.MakeValid();
SELECT @g.ToString()
Экземпляр geometry, возвращаемый выше, — это Point(1 3)
. Если задан экземпляр Polygon
POLYGON((1 3, 1 5, 1 3, 1 3))
, функция MakeValid()
вернет LINESTRING(1 3, 1 5)
.
См. также
STArea (тип данных geometry)
STExteriorRing (тип данных geometry)
STNumInteriorRing (тип данных geometry)
STInteriorRingN (тип данных geometry)
STCentroid (тип данных geometry)
STPointOnSurface (тип данных geometry)
MultiPolygon
Пространственные данные (SQL Server)
STIsValid (тип данных geography)
STIsValid (тип данных geometry)