공간 데이터 형식 개요

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

공간 데이터에는 두 가지 유형이 있습니다. geometry 데이터 형식은 평면, 즉 유클리드(평평한 표면) 데이터를 지원합니다. 기하 도형 데이터 형식은 모두 OGC(Open Geospatial Consortium) SIMPLE Features for SQL Specification 버전 1.1.0을 준수하며 SQL MM(ISO 표준)을 준수합니다. SQL Server는 GPS 위도 및 경도 좌표와 같은 타원(둥근 지구) 데이터를 저장하는 지리 데이터 형식도 지원합니다.

SQL Server 공간 도구는 SQL Server의 공간 유형과 함께 사용할 수 있는 Microsoft에서 후원하는 오픈 소스 도구 컬렉션입니다. 이 프로젝트는 애플리케이션에서 사용할 수 있는 재사용 가능한 함수 집합을 제공합니다. 이러한 함수에는 데이터 변환 루틴, 새 변환, 집계 등이 포함될 수 있습니다. 자세한 내용은 GitHub의 Microsoft/SQLServerSpatialTools를 참조하세요.

공간 데이터 개체

기하 도형 및 지리 데이터 형식은 16가지 유형의 공간 데이터 개체 또는 인스턴스 형식을 지원합니다. 그러나 이러한 인스턴스 유형 중 11개만 인스턴스화할 수 있습니다. 데이터베이스에서 이러한 인스턴스를 만들고 작업하거나 인스턴스화할 수 있습니다. 이러한 인스턴스는 부모 데이터 형식에서 특정 속성을 파생합니다.

아래 그림에서는 geometrygeometry 데이터 형식의 기반인 geography 계층을 보여 줍니다. 인스턴스화 가능한 형식의 기하 도형지리가 파란색으로 표시됩니다.

geom_hierarchy

지리 데이터 형식에 대한 추가 인스턴스화 가능한 형식 인 FullGlobe가 있습니다. 기하 도형 및 지리 형식은 인스턴스가 명시적으로 정의되지 않은 경우에도 올바른 형식의 인스턴스인 경우 특정 인스턴스를 인식할 수 있습니다. 예를 들어 STPointFromText() 메서드를 사용하여 Point 인스턴스를 명시적으로 정의하는 경우 기하 도형지리에서는 메서드 입력이 제대로 구성되는 한 인스턴스를 Point로 인식합니다. 메서드를 사용하여 동일한 인스턴스를 STGeomFromText() 정의하는 경우 기하 도형지리 데이터 형식 모두 인스턴스를 Point인식합니다.

기하 도형 및 지리 형식의 하위 형식은 단순 형식과 컬렉션 형식으로 나뉩니다. STNumCurves() 와 같은 일부 메서드는 단순 형식에서만 작동합니다.

간단한 형식은 다음과 같습니다.

컬렉션 형식은 다음과 같습니다.

geometry 데이터 형식과 geography 데이터 형식의 차이

두 가지 유형의 공간 데이터는 유사하게 동작하는 경우가 많습니다. 데이터를 저장하고 조작하는 방법에는 몇 가지 주요 차이점이 있습니다.

연결 에지가 정의되는 방법

LineString 및 Polygon 형식에 대한 정의 데이터는 꼭짓점일 뿐입니다. 기하 도형 형식의 두 꼭짓점 사이의 연결 가장자리는 직선입니다. 그러나 geography 형식에서는 두 꼭지점을 잇는 연결 가장자리가 두 꼭지점 사이의 짧고 큰 타원 호입니다. 큰 타원은 타원의 중심을 통해 비행기와 타원의 교차점입니다. 큰 타원 호는 큰 타원의 호 세그먼트입니다.

원호 세그먼트 정의 방법

기하 도형 형식의 원호 세그먼트는 XY 카티전 좌표계에 정의됩니다(Z 값은 무시됨). 지리 형식의 원호 세그먼트는 참조 구의 곡선 세그먼트에 의해 정의됩니다. 참조 구의 위도선은 두 호의 점이 일정한 위도를 갖는 두 개의 보완 원호로 정의될 수 있습니다.

공간 데이터 형식의 측정

평면(평면 지구) 시스템에서 거리 및 영역의 측정값은 좌표와 동일한 단위로 제공됩니다. 기하 도형 데이터 형식을 사용하면 사용된 단위에 관계없이 (2, 2) 및 (5, 6) 사이의 거리는 5개 단위입니다.

타원 또는 둥근 지구 시스템에서 좌표는 위도 및 경도의 각도로 지정됩니다. 그러나 geography 인스턴스의 공간 참조 식별자에 따라 측정이 달라지더라도 길이 및 영역은 일반적으로 미터와 제곱미터로 측정됩니다. 지리 데이터 형식에 대한 가장 일반적인 측정 단위는 미터입니다.

공간 데이터의 방향

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

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

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

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

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

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

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

SQL Server 에서 FullGlobe 는 전 세계를 포괄하는 특수한 유형의 다각형입니다. 영역이 있지만 테두리나 꼭짓점은 없습니다.

데이터 형식의 외부 및 내부 링 geography

SQL 사양용 OGC 단순 기능에서는 외부 링과 내부 링에 대해 설명하지만, 이러한 구분은 SQL Server 지리 데이터 형식에 거의 의미가 없습니다. 다각형의 모든 링은 외부 링으로 사용할 수 있습니다.

OGC 사양에 대한 자세한 내용은 다음 문서를 참조하세요.

원호 세그먼트

세 가지 인스턴스화 가능 형식은 원형 호 세그먼트 인 CircularString, CompoundCurveCurvePolygon을 사용할 수 있습니다. 원호 세그먼트는 2차원 평면에서 3개의 점으로 정의되며 세 번째 점은 첫 번째 점과 같을 수 없습니다. 원호 세그먼트의 몇 가지 예는 다음과 같습니다.

circular_arc_segments

처음 두 예제에서는 일반적인 원호 세그먼트를 보여 줍니다. 세 개의 각 점이 원의 둘레에 놓이는 것을 볼 수 있습니다.

다른 두 예제에서는 선 세그먼트를 원호 세그먼트로 정의할 수 있는 방법을 보여 줍니다. 2포인트로 정의할 수 있는 일반 선 세그먼트와 달리 원호 세그먼트를 정의하려면 여전히 3점이 필요합니다.

원호 세그먼트 형식에서 작동하는 메서드는 직선 세그먼트를 사용하여 원호를 근사화합니다. 호 근사값을 계산하는 데 사용되는 선 세그먼트 수는 호의 길이와 곡률에 따라 달라집니다. Z 값은 각 원호 세그먼트 유형에 대해 저장할 수 있지만 계산에는 사용되지 않습니다.

참고 항목

원호 세그먼트에 Z 값이 지정되면 원호 세그먼트의 모든 점이 입력에 허용되려면 동일해야 합니다. 예: CIRCULARSTRING(0 0 1, 2 2 1, 4 0 1) 수락되었지만 CIRCULARSTRING(0 0 1, 2 2 2, 4 0 1) 허용되지 않습니다.

LineString 및 CircularString 비교

이 예에서는 LineString 인스턴스와 CircularString 인스턴스를 모두 사용하여 동일한 이등변 삼각형을 저장하는 방법을 보여줍니다.

DECLARE @g1 geometry;
DECLARE @g2 geometry;
SET @g1 = geometry::STGeomFromText('LINESTRING(1 1, 5 1, 3 5, 1 1)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(1 1, 3 1, 5 1, 4 3, 3 5, 2 3, 1 1)', 0);
IF @g1.STIsValid() = 1 AND @g2.STIsValid() = 1
  BEGIN
      SELECT @g1.ToString(), @g2.ToString()
      SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length]
  END

삼각형을 정의하는 데 CircularString 인스턴스에는 7개의 점이 필요하지만 LineString 인스턴스에는 4개의 점만 필요합니다. 이는 CircularString 인스턴스가 원호 세그먼트만 저장하고 선 세그먼트는 저장하지 않기 때문입니다. CircularString 인스턴스에 저장된 삼각형의 측면은 ABC, CDE 및 EFA입니다. LineString 인스턴스에 저장된 삼각형의 측면은 AC, CE 및 EA입니다.

다음 예제를 참조하세요.

SET @g1 = geometry::STGeomFromText('LINESTRING(0 0, 2 2, 4 0)', 0);
SET @g2 = geometry::STGeomFromText('CIRCULARSTRING(0 0, 2 2, 4 0)', 0);
SELECT @g1.STLength() AS [LS Length], @g2.STLength() AS [CS Length];

결과 집합은 다음과 같습니다.

LS Length    CS Length
5.65685...   6.28318...

CircularString 인스턴스는 LineString 인스턴스보다 정밀도가 높은 곡선 경계를 저장하는 데 더 적은 지점을 사용합니다. CircularString 인스턴스는 특정 지점에서 반경 20마일 이내 검색과 같이 원 경계를 저장하는 데 유용합니다. LineString 인스턴스는 정사각형 도시 블록과 같은 선형 경계를 저장하는 데 적합합니다.

LineString 및 CompoundCurve 비교

다음 코드 예제에서는 LineStringCompoundCurve 인스턴스를 사용하여 동일한 그림을 저장하는 방법을 보여 줍니다.

SET @g = geometry::Parse('LINESTRING(2 2, 4 2, 4 4, 2 4, 2 2)');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2), (4 2, 4 4), (4 4, 2 4), (2 4, 2 2))');
SET @g = geometry::Parse('COMPOUNDCURVE((2 2, 4 2, 4 4, 2 4, 2 2))');

위 예제에서 LineString 인스턴스나 CompoundCurve 인스턴스는 그림을 저장할 수 있습니다. 다음 예제에서는 CompoundCurve사용하여 원형 조각을 저장합니다.

SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING(2 2, 1 3, 0 2),(0 2, 1 0, 2 2))');  

CompoundCurve 인스턴스는 원호 세그먼트(2 2, 1 3, 0 2)를 직접 저장할 수 있지만 LineString 인스턴스는 곡선을 여러 개의 작은 선 세그먼트로 변환해야 합니다.

CircularString 및 CompoundCurve 비교

다음 코드 예제에서는 CircularString 인스턴스에 원형 조각을 저장하는 방법을 보여 줍니다.

DECLARE @g geometry;
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 1 2.1082, 3 6.3246, 0 7, -3 6.3246, -1 2.1082, 0 0)');
SELECT @g.ToString(), @g.STLength();

CircularString 인스턴스를 사용하여 원형 조각을 저장하려면 각 선 세그먼트에 3개의 점을 사용해야 합니다. 중간 지점을 알 수 없는 경우 계산해야 하거나 다음 코드 조각과 같이 선 세그먼트의 엔드포인트를 두 배로 늘여야 합니다.

SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');

CompoundCurve 인스턴스는 LineStringCircularString 구성 요소를 모두 허용하므로 원형 조각의 선 세그먼트를 두 점만 알려야 합니다. 이 코드 예제에서는 CompoundCurve사용하여 동일한 그림을 저장하는 방법을 보여줍니다.

DECLARE @g geometry;
SET @g = geometry::Parse('COMPOUNDCURVE(CIRCULARSTRING( 3 6.3246, 0 7, -3 6.3246), (-3 6.3246, 0 0, 3 6.3246))');
SELECT @g.ToString(), @g.STLength();

다각형 및 CurvePolygon 비교

CurvePolygon 인스턴스는 외부 및 내부 링을 정의할 때 CircularStringCompoundCurve 인스턴스를 사용할 수 있습니다. 다각형 인스턴스는 사용할 수 없습니다.

참고 항목