다음을 통해 공유


Polygon

적용 대상: SQL Server Azure SQL 데이터베이스 SQL Managed Instance

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

Polygon 인스턴스

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

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

아래 일러스트레이션에서는 Polygon 인스턴스의 예제를 보여 줍니다.

기하 도형 Polygon 인스턴스의 예

그림에 대한 설명:

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

  2. 그래픽 블록 2는 외부 링 및 두 개의 내부 링에서 정의한 경계가 있는 Polygon 인스턴스입니다. 내부 링 안의 영역은 Polygon 인스턴스 외부의 일부입니다.

  3. 그래픽 블록 3은 내부 링이 단일 접선 포인트에서 교차하기 때문에 유효한 Polygon 인스턴스입니다.

허용되는 인스턴스

허용되는 Polygon 인스턴스는 예외를 발생시키지 않고 geometry 또는 geography 변수에 저장할 수 있는 인스턴스입니다. 다음은 허용되는 Polygon 인스턴스의 예제입니다.

  • Polygon 인스턴스
  • 허용 가능 외부 링(LineString) 및 0개 이상의 허용 가능 내부 링(LineStrings)을 포함하는 Polygon 인스턴스

링(LineString)이 허용되려면 다음 조건을 충족해야 합니다.

  • 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은(는) 유효하지 않습니다.

공간 데이터의 방향

다각형의 링 방향은 평면 시스템에서 중요한 요소가 아닙니다. SQL 사양용 OGC 단순 기능은 링 순서를 지정하지 않으며 SQL Server는 링 순서를 적용하지 않습니다.

타원 시스템에서 방향이 없는 다각형은 의미가 없거나 모호합니다. 예를 들어, 적도 주변의 고리는 북반구 또는 남반구를 설명하나요? Geography 데이터 형식을 사용하여 공간 인스턴스를 저장하는 경우 링의 방향을 지정하고 인스턴스의 위치를 정확하게 설명해야 합니다.

타원 시스템에서 다각형의 내부는 "왼쪽 규칙"에 의해 정의됩니다. 나열된 순서대로 점을 따라 geography 다각형의 고리를 따라 걷고 있다고 상상하면 왼쪽 영역은 다각형의 내부로, 오른쪽 영역은 Polygon의 외부로 취급됩니다.

시계 반대 방향

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;

'왼쪽 규칙' 시계 방향 시각화

SQL Server에서 호환성 수준이 100 이하인 경우 geography 데이터 형식에는 다음과 같은 제한 사항이 있습니다.

  • 각 geography 인스턴스는 단일 반구 내에 있어야 합니다. 반구보다 큰 공간 개체는 저장할 수 없습니다.

  • 반구보다 큰 개체를 생성하는 OGC(Open Geospatial Consortium) WKT(Well-Known Text) 또는 WKB(Well-Known Binary) 표현의 모든 geography 인스턴스에서 ArgumentException이 발생합니다.

  • STIntersection(), STUnion(), STDifference() 및 STSymDifference()와 같이 두 개의 geography 인스턴스를 입력해야 하는 geography 데이터 형식 메서드는 이 메서드의 결과가 단일 반구 내에 포함되지 않을 경우 null을 반환합니다. 출력이 단일 반구를 초과하는 경우에도 STBuffer()는 null을 반환합니다.

ReorientObject 확장 메서드를 활용하여 방향을 되돌릴 수 있습니다.

예제

예 A.

다음 예제에서는 간격과 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);

예 2.

유효하지 않은 인스턴스는 유효한 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))'
    );  

예제 C.

다음 예제에서는 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)))

예제 D.

이는 유효하지 않은 인스턴스를 유효한 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()  

위에서 반환된 기하학 인스턴스는 Point(1 3)입니다. 지정된 Polygon이(가) POLYGON((1 3, 1 5, 1 3, 1 3))인 경우 MakeValid()LINESTRING(1 3, 1 5)을(를) 반환합니다.

참고 항목

STArea(기하학 데이터 형식)
STExteriorRing(기하학 데이터 형식)
STNumInteriorRing(기하학 데이터 형식)
STInteriorRingN(기하학 데이터 형식)
STCentroid(기하학 데이터 형식)
STPointOnSurface(geometry 데이터 형식)
MultiPolygon
공간 데이터(SQL Server)
STIsValid(geography 데이터 형식)
STIsValid(geometry 데이터 형식)