다각형
Polygon은 외부 경계 링과 0개 이상의 내부 링을 정의하는 일련의 점으로 저장되는 2차원 표면입니다.
Polygon 인스턴스
Polygon 인스턴스는 서로 다른 점이 3개 이상 있는 링에서 구성될 수 있습니다. Polygon 인스턴스가 비어 있을 수도 있습니다.
Polygon의 외부 및 내부 링은 해당 경계를 정의합니다. 링 내부 공간은 Polygon의 내부를 정의합니다.
다음 그림에서는 Polygon 인스턴스의 예를 보여 줍니다.
그림에 대한 설명:
그림 1은 외부 링에서 정의한 경계가 있는 Polygon 인스턴스입니다.
그림 2는 외부 링 및 두 개의 내부 링에서 정의한 경계가 있는 Polygon 인스턴스입니다. 내부 링 내의 영역이 Polygon 인스턴스 외부의 일부분입니다.
그림 3은 Polygon 인스턴스의 내부 링이 하나의 탄젠트 점에서 교차하므로 올바른 인스턴스입니다.
허용되는 인스턴스
허용되는 Polygon 인스턴스는 예외를 발생시키지 않고 geometry 또는 geography 변수에 저장할 수 있는 인스턴스입니다. 다음 Polygon 인스턴스가 허용됩니다.
빈 Polygon 인스턴스
허용 가능 외부 링 및 0개 이상의 허용 가능 내부 링을 포함하는 Polygon 인스턴스
링이 허용되려면 다음 조건을 충족해야 합니다.
LineString 인스턴스가 허용되어야 합니다.
LineString 인스턴스에 4개 이상의 점이 있어야 합니다.
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 인스턴스가 허용될 4개의 점이 있는 링만 포함해야 함을 보여 줍니다.
다음 예에서는 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))';
외부 링에 대한 LineString 인스턴스에 점이 부족하기 때문에 @g1이 허용되지 않습니다. 외부 링 LineString 인스턴스의 시작 점이 끝 점과 같지 않기 때문에 @g2가 허용되지 않습니다. 다음 예에는 허용 가능한 외부 링이 있지만 내부 링은 허용되지 않습니다. 여기서도 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))';
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가 유효하지 않습니다. 링에 고유 점이 3개 이상 없기 때문에 @g6이 유효하지 않습니다.
예
다음 예에서는 구멍이 있고 SRID가 10인 단순한 geometry Polygon 인스턴스를 만듭니다.
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)를 반환합니다.
참고 항목
참조
STExteriorRing(geometry 데이터 형식)
STNumInteriorRing(geometry 데이터 형식)
STInteriorRingN(geometry 데이터 형식)
STPointOnSurface(geometry 데이터 형식)