다각형
Polygon은 외부 경계 링과 0개 이상의 내부 링을 정의하는 일련의 점으로 저장되는 2차원 표면입니다.
Polygon 인스턴스
Polygon 인스턴스는 서로 다른 점이 3개 이상 있는 링에서 구성될 수 있습니다. Polygon 인스턴스가 비어 있을 수도 있습니다.
Polygon의 외부 및 내부 링은 해당 경계를 정의합니다. 링 내부 공간은 Polygon의 내부를 정의합니다.
다음 그림에서는 Polygon 인스턴스의 예를 보여 줍니다.
그림에 대한 설명:
그림 1은 외부 링에서 정의한 경계가 있는 Polygon 인스턴스입니다.
그림 2는 외부 링 및 두 개의 내부 링에서 정의한 경계가 있는 Polygon 인스턴스입니다. 내부 링 내의 영역이 Polygon 인스턴스 외부의 일부분입니다.
그림 3은 Polygon 인스턴스의 내부 링이 하나의 탄젠트 점에서 교차하므로 올바른 인스턴스입니다.
허용되는 인스턴스
허용되는 Polygon 인스턴스는 geometry 또는 geography 변수에 저장해도 예외가 발생하지 않는 인스턴스입니다. geometry 유형에 대해 허용되는 Polygon 인스턴스는 다음과 같습니다.
빈 Polygon 인스턴스
허용되는 외부 링과 0개 이상의 사용 가능한 내부 링을 포함하는 Polygon 인스턴스
사용 가능한 링은 다음 조건을 만족해야 합니다.
LineString 인스턴스가 허용되어야 합니다.
LineString 인스턴스에는 점이 4개 이상(고유 점 3개 포함) 있어야 합니다.
LineString 인스턴스에서 시작 점 및 끝 점의 X 값과 Y 값은 같아야 합니다.
[!참고]
Z 및 M 값은 무시됩니다.
geography 유형의 Polygon 인스턴스는 유효한 경우에만 허용됩니다. 자세한 내용은 Valid Geography Polygon Instances를 참조하십시오.
다음 예에서는 geometry 유형의 허용되는 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 인스턴스는 아닐 수 있습니다. 다음 예에서는 Polygon 인스턴스가 허용되지 않으므로 System.FormatException이 발생합니다.
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 인스턴스가 유효한지 여부는 해당 변수 유형에 따라 결정됩니다.
Geometry 데이터 형식
geometry 유형의 Polygon 인스턴스가 유효하려면 다음 조건을 만족해야 합니다.
첫 번째 링이 외부 링이어야 합니다.
모든 내부 링이 외부 링 내에 있어야 합니다.
내부 링이 다른 내부 링 내에 있어서는 안 됩니다.
자체적으로 또는 다른 링과 교차하는 링이 없어야 합니다.
두 링이 같은 가장자리를 공유하지 않아야 합니다.
내부 링의 내부와 다른 내부 링의 내부가 겹치지 않아야 합니다.
모든 링은 0이나 한정된 수의 탄젠트 점에서 자체적으로 또는 다른 링에만 접할 수 있습니다.
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 데이터 형식
geography 유형의 Polygon 인스턴스가 유효하려면 다음 조건을 만족해야 합니다.
geometry 유형의 허용되는 Polygon 인스턴스로 간주되기 위해 필요한 모든 규칙을 만족해야 합니다.
왼쪽 규칙을 사용하여 인스턴스 내부가 연결되어 있어야 합니다.
인스턴스를 단일 반구에 포함할 수 있어야 합니다.
자체적으로 또는 다른 링과 교차하는 링이 없어야 합니다.
모든 링은 0이나 한정된 수의 탄젠트 점에서 자체적으로 또는 다른 링에만 접할 수 있습니다.
다음 예에서는 Polygon 인스턴스의 크기가 반구를 초과하므로 Microsoft.SqlServer.Types.GLArgumentException이 발생합니다.
DECLARE @g geography = 'POLYGON((-122.358 47.653, 122.348 47.649, 122.348 47.658, 122.358 47.658, -122.358 47.653))';
다음 예에서는 geography 유형에 대해 유효한 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))';
예
다음 예에서는 구멍이 있고 SRID가 10인 단순한 geometryPolygon 인스턴스를 만듭니다.
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)))