Polygon

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

다각형은 외부 경계 링과 0개 이상의 내부 링을 정의하는 점 시퀀스로 저장된 2차원 표면입니다.

다각형 인스턴스

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

다각형의 외부 및 내부 고리는 경계를 정의합니다. 링 내부 공간은 Polygon의 내부를 정의합니다.

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

Examples of geometry Polygon instances

그림에 대한 설명:

  1. 그림 1은 외부 링에 의해 경계가 정의된 Polygon 인스턴스입니다.

  2. 그림 2는 외부 링과 두 개의 내부 링으로 경계가 정의된 다각형 인스턴스입니다. 내부 링 내부의 영역은 Polygon 인스턴스 외부의 일부입니다.

  3. 그림 3은 내부 링이 단일 탄젠트 지점에서 교차하기 때문에 유효한 다각형 인스턴스입니다.

허용되는 인스턴스

허용되는 다각형 인스턴스는 예외를 throw하지 않고 기하 도형 또는 지리 변수에 저장할 수 있는 인스턴스입니다. 허용되는 다각형 인스턴스는 다음과 같습니다.

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

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

  • LineString 인스턴스를 수락해야 합니다.
  • LineString 인스턴스에는 4개 이상의 지점이 있어야 합니다.
  • LineString 인스턴스의 시작점과 끝점은 동일해야 합니다.

다음 예제에서는 허용되는 다각형 인스턴스를 보여 줍니다.

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))';  

@g5 허용되는 @g4Polygon 인스턴스가 유효한 Polygon 인스턴스가 아닐 수 있습니다. @g5 또한 Polygon 인스턴스는 수락할 4개의 점이 있는 링만 포함해야 한다는 것을 보여 줍니다.

다음 예제에서는 Polygon 인스턴스가 허용되지 않으므로 throw 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))';  

유효한 인스턴스

다각형내부 고리는 단일 탄젠트 지점에서 서로 닿을 수 있지만 다각형 십자가의 내부 링이 있으면 인스턴스가 유효하지 않습니다.

다음 예제에서는 유효한 다각형 인스턴스를 보여 줍니다.

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 은 링에 세 개 이상의 고유 점이 없기 때문에 유효하지 않습니다.

공간 데이터의 방향

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

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

타원 시스템에서 다각형의 내부는 "왼쪽 규칙"에 의해 정의됩니다 : 지리 다각형의 고리를 따라 걷는 자신을 상상하는 경우, 그들이 나열되는 순서대로 지점에 따라, 왼쪽의 영역은 다각형의 내부로 처리되고, 오른쪽의 영역은 다각형의 외부로 처리됩니다.

시계 반대 방향

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 0 0, 20 0, 20 20, 0 20))', 4326);
SELECT @square;

Visualization of 'left-hand rule' counter-clockwise orientation

시계 방향 으로

DECLARE @square GEOGRAPHY;
SET @square = GEOGRAPHY::STPolyFromText('POLYGON((0 20, 20 20, 20 0, 0 0, 0 20))', 4326);
SELECT @square;

Visualization of 'left-hand rule' clockwise orientation

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

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

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

  • 두 지리 인스턴스(예: STIntersection(), STUnion(), STDifference() 및 STSymDifference())의 입력이 필요한 지리 데이터 형식 메서드는 메서드의 결과가 단일 반구 내에 맞지 않으면 null을 반환합니다. 출력이 단일 반구를 초과하는 경우에도 STBuffer()는 null을 반환합니다.

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

예제 A.

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

예 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(geometry 데이터 형식)
STExteriorRing(geometry 데이터 형식)
STNumInteriorRing(geometry 데이터 형식)
STInteriorRingN(geometry 데이터 형식)
STCentroid(geometry 데이터 형식)
STPointOnSurface(geometry 데이터 형식)
MultiPolygon
공간 데이터(SQL Server)
STIsValid(geography 데이터 형식)
STIsValid(geometry 데이터 형식)