공간 데이터 형식 개요
적용 대상: SQL Server Azure SQL 데이터베이스 SQL Managed Instance
공간 데이터 형식에는 두 가지가 있습니다. geometry 데이터 형식은 평면, 즉 유클리드(평평한 표면) 데이터를 지원합니다. SQL Server에서 지원되는 geometry 데이터 형식은 Open Geospatial Consortium (OGC) Simple Features for SQL Specification 버전 1.1.0을 따르고 SQL MM(ISO 표준)을 준수합니다. SQL Server는 또한 geography 데이터 형식을 지원하며, GPS 위도 및 경도 좌표 등의 타원(둥근 표면) 데이터를 저장합니다.
팁
SQL Server 공간 도구는 SQL Server의 공간 유형과 함께 사용할 수 있는 Microsoft에서 후원하는 오픈 소스 도구 컬렉션입니다. 이 프로젝트는 애플리케이션에서 사용할 수 있는 재사용 가능한 함수 집합을 제공합니다. 이러한 함수에는 데이터 변환 루틴, 새 변환, 집계 등이 포함될 수 있습니다. 자세한 내용은 GitHub의 Microsoft/SQLServerSpatialTools를 참조하세요.
공간 데이터 개체
geometry 및 geography 데이터 형식은 16가지 유형의 공간 데이터 개체 또는 인스턴스 형식을 지원합니다. 그러나 이러한 인스턴스 유형 중 11개만 인스턴스화할 수 있습니다. 데이터베이스에서 이러한 인스턴스를 만들고 작업하거나 인스턴스화할 수 있습니다. 이러한 인스턴스는 상위 데이터 형식에서 특정 속성을 파생합니다.
아래 그림에서는 geometry 및 geometry 데이터 형식의 기반인 geography 계층을 보여 줍니다. 인스턴스화 가능한 형식의 geometry 및 geography가 파란색으로 표시됩니다.
geography 데이터 형식의 경우 인스턴스화할 수 있는 추가 형식인 FullGlobe가 있습니다. geometry 및 geography형식은 인스턴스가 명시적으로 정의되지 않은 경우에도 올바른 형식의 인스턴스인 경우 특정 인스턴스를 인식할 수 있습니다. 예를 들어 STPointFromText() 메서드를 사용하여 Point인스턴스를 명시적으로 정의하는 경우 geometry 및 geography에서는 메서드 입력이 제대로 구성되는 한 인스턴스를 Point로 인식합니다. STGeomFromText()
메서드를 사용하여 동일한 인스턴스를 정의할 경우 geometry 및 geography 데이터 형식은 해당 인스턴스를 Point로 인식합니다.
geometry 및 geography 형식의 하위 형식은 단순 형식과 컬렉션 형식으로 나뉩니다. STNumCurves()
와 같은 일부 메서드는 단순 형식에서만 작동합니다.
단순 형식은 다음과 같습니다.
컬렉션 형식은 다음과 같습니다.
geometry 데이터 형식과 geography 데이터 형식의 차이
두 가지 유형의 공간 데이터는 유사하게 동작하는 경우가 많습니다. 데이터를 저장하고 조작하는 방법에는 몇 가지 주요 차이점이 있습니다.
연결 모서리를 정의하는 방법
LineString 및 Polygon 형식에 대한 정의 데이터는 꼭짓점만 있습니다. geometry 형식의 두 꼭짓점 사이의 연결 에지는 직선입니다. 그러나 geography 형식에서는 두 꼭지점을 잇는 연결 가장자리가 두 꼭지점 사이의 짧고 큰 타원 호입니다. 큰 타원은 타원체와 그 중심을 통과하는 평면의 교차점입니다. 큰 타원 호는 큰 타원의 호 세그먼트입니다.
원호 세그먼트 정의 방법
geometry 형식의 원호 세그먼트는 XY 직교 좌표평면에 정의됩니다(Z 값은 무시됨). geography 형식의 원호 세그먼트는 참조 구의 곡선 세그먼트에 의해 정의됩니다. 참조 구의 위도선은 두 호의 점이 일정한 위도를 갖는 두 개의 보완 원호로 정의될 수 있습니다.
공간 데이터 형식의 측정
평면(평면 지구) 시스템에서 거리 및 영역의 측정값은 좌표와 동일한 단위로 제공됩니다. geometry 데이터 형식을 이용하면 사용한 단위에 상관없이 (2, 2)와 (5, 6) 사이의 거리는 5단위입니다.
타원 또는 둥근 지구 시스템에서 좌표는 위도와 경도의 도 단위로 지정됩니다. 그러나 geography 인스턴스의 공간 참조 식별자에 따라 측정이 달라지더라도 길이 및 영역은 일반적으로 미터와 제곱미터로 측정됩니다. Geography 데이터 형식에 대한 가장 일반적인 측정 단위는 미터입니다.
공간 데이터의 방향
다각형의 링 방향은 평면 시스템에서 중요한 요소가 아닙니다. SQL 사양용 OGC 단순 기능은 링 순서를 지정하지 않으며 SQL Server는 링 순서를 적용하지 않습니다.
타원 시스템에서 방향이 없는 다각형은 의미가 없거나 모호합니다. 예를 들어, 적도 주변의 고리는 북반구 또는 남반구를 설명하나요? geography 데이터 형식을 사용하여 공간 인스턴스를 저장하는 경우 링의 방향을 지정하고 인스턴스의 위치를 정확하게 설명해야 합니다.
타원 시스템에서 다각형의 내부는 "왼쪽 규칙"에 의해 정의됩니다. 나열된 순서대로 점을 따라 geography 다각형의 고리를 따라 걷고 있다고 상상하면 왼쪽 영역은 다각형의 내부로, 오른쪽 영역은 Polygon의 외부로 취급됩니다.
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을 반환합니다.
SQL Server에서 FullGlobe는 전 세계를 포괄하는 특수한 유형의 Polygon입니다. FullGlobe 에는 영역이 있지만 테두리나 꼭지점은 없습니다.
geography
데이터 형식의 외부 및 내부 링
SQL 사양용 OGC 단순 기능에서는 외부 링 및 내부 링에 대해 설명하지만 다각형의 링은 외부 링으로 사용될 수 있기 때문에 구분이 geography 데이터 형식에서는 거의 의미가 없습니다.
OGC 사양에 대한 자세한 내용은 다음을 참조하세요.
- OGC Specifications, Simple Feature Access Part 1 - Common Architecture
- OGC 사양, 단순한 기능 액세스 2부 - SQL 옵션
원호 세그먼트
세 가지 인스턴스화 가능 형식은 원형 호 세그먼트인 CircularString, CompoundCurve 및 CurvePolygon을 사용할 수 있습니다. 원호 세그먼트는 2차원 평면에서 3개의 점으로 정의되며 세 번째 점은 첫 번째 점과 같을 수 없습니다. 원호 세그먼트의 몇 가지 예는 다음과 같습니다.
처음 두 예제에서는 일반적인 원호 세그먼트를 보여 줍니다. 세 개의 각 점이 원의 둘레에 놓이는 것을 볼 수 있습니다.
그림 C와 D에서는 선 세그먼트를 원호 세그먼트로 정의할 수 있는 방법을 보여 줍니다. 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 비교
다음 코드 예제에서는 LineString 및 CompoundCurve 인스턴스를 사용하여 동일한 그림을 저장하는 방법을 보여 줍니다.
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 인스턴스를 사용하여 원형 조각을 저장하려면 각 선 세그먼트에 세 개의 점을 사용해야 합니다. 중간 지점을 알 수 없는 경우 계산해야 하거나 다음 조각과 같이 선 세그먼트의 엔드포인트를 두 배로 늘여야 합니다.
SET @g = geometry::Parse('CIRCULARSTRING( 0 0, 3 6.3246, 3 6.3246, 0 7, -3 6.3246, 0 0, 0 0)');
CompoundCurve 인스턴스는 LineString 및 CircularString 구성 요소를 모두 허용하므로 원형 조각의 선 세그먼트를 두 점만 알면 합니다. 이 코드 예제에서는 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 인스턴스는 외부 및 내부 링을 정의할 때 CircularString 및 CompoundCurve 인스턴스를 사용할 수 있습니다. Polygon인스턴스는 사용할 수 없습니다.