다음을 통해 공유


다각형

Polygon은 외부 경계 링과 0개 이상의 내부 링을 정의하는 일련의 점으로 저장되는 2차원 표면입니다.

Polygon 인스턴스

Polygon 인스턴스는 서로 다른 점이 3개 이상 있는 링에서 구성될 수 있습니다. Polygon 인스턴스가 비어 있을 수도 있습니다.

Polygon의 외부 및 내부 링은 해당 경계를 정의합니다. 링 내부 공간은 Polygon의 내부를 정의합니다.

다음 그림에서는 Polygon 인스턴스의 예를 보여 줍니다.

기하 도형 Polygon 인스턴스의 예

그림에 대한 설명:

  1. 그림 1은 외부 링에서 정의한 경계가 있는 Polygon 인스턴스입니다.

  2. 그림 2는 외부 링 및 두 개의 내부 링에서 정의한 경계가 있는 Polygon 인스턴스입니다. 내부 링 내의 영역이 Polygon 인스턴스 외부의 일부분입니다.

  3. 그림 3은 Polygon 인스턴스의 내부 링이 하나의 탄젠트 점에서 교차하므로 올바른 인스턴스입니다.

수락된 인스턴스

수락된 Polygon 인스턴스는 예외가 발생하지 않고 geometry 또는 geography 변수에 저장될 수 있는 인스턴스입니다. 다음 예는 geometry 형식에 대해 수락된 Polygon 인스턴스를 보여 줍니다.

  • 빈 Polygon 인스턴스

  • 사용 가능한 외부 링과 0 이상의 사용 가능한 내부 링을 갖는 Polygon 인스턴스

다음 조건은 사용 가능한 링에 필요합니다.

  • LineString 인스턴스가 수락되어야 합니다.

  • LineString 인스턴스는 최소한 네 개의 점을 가져야 하며 이 네 개의 점에 서로 다른 점이 3개 있어야 합니다.

  • LineString 인스턴스의 시작 점 및 끝 점은 동일한 X와 Y값을 가져야 합니다.

    [!참고]

    Z와 M 값은 무시됩니다.

geography 형식의 Polygon 인스턴스는 인스턴스가 유효할 때만 수락됩니다. geography 형식의 유효한 Polygon 인스턴스에 대한 자세한 내용은 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 인스턴스가 아닐 수 있습니다. 다음 예는 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))';
SELECT @g1.STIsValid(), @g2.STIsValid(), @g3.STIsValid(), @g4.STIsValid();

내부 링이 두 지점에서 외부 링과 만나므로 @g1은 유효하지 않습니다. 두 번째 내부 링이 첫 번째 내부 링의 내부에 있으므로 @g2는 유효하지 않습니다. 두 개의 내부 링이 여러 연속 점에서 만나므로 @g3은 유효하지 않습니다. 두 내부 링의 내부가 겹치므로 @g4는 유효하지 않습니다.

Geometry 데이터 형식

geometry 형식의 Polygon 인스턴스가 유효하려면 다음의 조건을 충족해야 합니다.

  1. 첫 번째 링이 외부 링입니다.

  2. 내부 링은 외부 링 내에 있습니다.

  3. 내부 링이 다른 내부 링 내에 존재하지 않습니다.

  4. 링은 그 자체 또는 다른 링을 교차하지 않습니다.

  5. 두 개의 링이 같은 가장자리를 공유할 수 없습니다.

  6. 내부 링의 내부는 다른 내부 링의 내부와 겹칠 수 없습니다.

  7. 모든 링은 탄젠트 점의 0 또는 한정된 수에서 자체 또는 다른 링만 만날 수 있습니다.

  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 데이터 형식

geography 형식의 Polygon 인스턴스가 유효하려면 다음의 조건을 충족해야 합니다.

  1. 인스턴스는 geometry 형식의 수락된 Polygon 인스턴스가 되기 위해 필요한 모든 규칙을 충족해야 합니다.

  2. 인스턴스의 내부는 왼쪽 규칙을 사용하여 연결됩니다.

  3. 인스턴스는 반구에 맞출 수 있습니다.

  4. 링은 그 자체 또는 다른 링과 교차하지 않습니다.

  5. 모든 링은 탄젠트 점의 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)))