지리 공간 데이터 타입¶
Snowflake는 지표상에 점, 선, 다각형과 같은 지리 공간적 기능을 위한 기본 지원을 제공합니다.
이 항목의 내용:
데이터 타입¶
Snowflake는 지리 공간 데이터에 대해 다음 데이터 타입을 제공합니다.
GEOGRAPHY 데이터 타입¶
GEOGRAPHY 데이터 타입은 WGS 84 표준(공간 참조 ID 4326. 자세한 내용은 https://spatialreference.org/ref/epsg/wgs-84/ 참조)을 따릅니다.
지구상의 점은 경도(-180도~+180도)와 위도(-90~+90도)로 표시됩니다.
고도는 현재 지원되지 않습니다.
선분은 지표상의 측지 호로 해석됩니다.
Snowflake는 GEOGRAPHY 데이터 타입에 대해 작동하는 지리 공간 함수 도 제공합니다.
지리 공간 데이터(예: 경도 및 위도 데이터, WKT, WKB, GeoJSON 등)가 있는 경우 이 데이터를 VARCHAR, VARIANT 또는 NUMBER 열에 원래 형식으로 유지하는 대신 데이터를 변환하여 GEOGRAPHY 열에 저장해야 합니다. GEOGRAPHY 열에 데이터를 저장하면 지리 공간 기능을 사용하는 쿼리의 성능을 크게 개선할 수 있습니다.
GEOMETRY 데이터 타입¶
GEOMETRY 데이터 타입은 평면(유클리드, 데카르트) 좌표계의 특징을 나타냅니다.
좌표는 실수 쌍(x, y)으로 표시됩니다. 현재, 2D 좌표만 지원됩니다.
X와 Y의 단위는 GEOMETRY 오브젝트와 관련된 공간 참조 시스템(SRS) 에 따라 결정됩니다. 공간 참조 시스템은 공간 참조 시스템 식별자(SRID) 번호로 식별됩니다. GEOMETRY 오브젝트를 만들 때 또는 ST_SETSRID 호출로 SRID를 제공하지 않는 한 SRID는 0입니다.
Snowflake는 GEOMETRY 데이터 타입 에 대해 작동하는 지리 공간 함수 세트를 제공합니다. 이들 함수에 대한 사항은 다음과 같습니다.
기하학에서 비평면 SRS를 사용하더라도 모든 함수에서는 평면 좌표를 가정합니다.
측정 함수(예: ST_LENGTH)는 좌표계와 동일한 단위를 사용합니다.
여러 GEOMETRY 식을 인자로 받는 함수(예: ST_DISTANCE)의 경우 입력 식을 동일한 SRS에서 정의해야 합니다.
지리 공간 입력 및 출력¶
다음 섹션에서는 지리 공간 데이터를 읽고 쓸 때 지원되는 표준 형식 및 오브젝트 유형을 다룹니다.
지원되는 표준 입력 및 출력 형식¶
GEOGRAPHY 및 GEOMETRY 데이터 타입은 입력과 출력에 대해 다음의 표준 산업 형식을 지원합니다.
《WKT》 (Well-Known Text)
《WKB》 (Well-Known Binary)
EWKT 및 EWKB(Extended WKT 및 WKB) (EWKT 및 EWKB 처리에 관한 참고 사항 참조)
다음 참고 자료가 도움이 될 수도 있습니다.
Open Geospatial Consortium의 간단한 기능 액세스/공통 아키텍처 및 SQL 옵션:
이러한 표준에서 벗어나는 상황은 Snowflake 설명서에 명시적으로 언급되어 있습니다.
GEOGRAPHY 값의 GeoJSON 처리에 대한 참고 사항¶
WKT 및 WKB 표준에서는 형식만 지정하며, WKT/WKB 오브젝트의 의미 체계는 참조 시스템(예: 평면 또는 구)에 따라 다릅니다.
반면에, GeoJSON 표준은 형식과 의미 체계를 모두 지정합니다. GeoJSON 점은 명시적으로 WGS 84 좌표이고, GeoJSON 선분은 평면 가장자리(직선)여야 합니다.
그와는 반대로, Snowflake GEOGRAPHY 데이터 타입은 GeoJSON 형식에서의 입력이나 이 형식으로의 출력을 포함하여 모든 선분을 측지 호로 해석합니다. 본질적으로, Snowflake는 구형 의미 체계를 사용해 GeoJSON을 JSON 형식의 WKT로 취급합니다.
GEOGRAPHY 값의 EWKT 및 EWKB 처리에 대한 참고 사항¶
EWKT와 EWKB는 PostGIS 에 의해 도입된 비표준 형식입니다. 이들은 데이터와 함께 사용할 좌표 참조 시스템을 지정하는 SRID(Spatial Reference System Identifier) 를 포함함으로써 WKT 및 WKB 형식을 향상합니다. Snowflake는 현재 SRID=4326에 매핑하는 WGS84만 지원합니다.
기본적으로, Snowflake는 EWKB 또는 EWKT 입력값에 4326 이외의 SRID가 포함된 경우 오류를 발생시킵니다. 반대로, 모든 EWKB 및 EWKT 출력값에는 SRID=4326이 있습니다.
지원되는 지리 공간 오브젝트 유형¶
GEOGRAPHY 및 GEOMETRY 데이터 타입은 다음과 같은 유형의 지리 공간 오브젝트를 저장할 수 있습니다.
WKT/WKB/EWKT/EWKB/GeoJSON 지리 공간 오브젝트:
Point
MultiPoint
LineString
MultiLineString
Polygon
MultiPolygon
GeometryCollection
GeoJSON에 특정한 지리 공간 오브젝트:
Feature
FeatureCollection
결과 세트의 출력 형식 지정하기¶
세션 매개 변수 GEOGRAPHY_OUTPUT_FORMAT 과 GEOMETRY_OUTPUT_FORMAT 은 결과 세트에서 각각 GEOGRAPHY 유형 및 GEOMETRY 유형 열의 렌더링을 제어합니다.
GEOGRAPHY_OUTPUT_FORMAT 및 GEOMETRY 매개 변수는 다음 값 중 하나를 가질 수 있습니다.
매개 변수 값
설명
GeoJSON(기본값)
GEOGRAPHY / GEOMETRY 결과는 GeoJSON 형식의 OBJECT로 렌더링됩니다.
WKT
GEOGRAPHY / GEOMETRY 결과는 WKT 형식의 VARCHAR로 렌더링됩니다.
WKB
GEOGRAPHY / GEOMETRY 결과는 WKB 형식의 BINARY로 렌더링됩니다.
EWKT
GEOGRAPHY / GEOMETRY 결과는 EWKT 형식의 VARCHAR로 렌더링됩니다.
EWKB
GEOGRAPHY / GEOMETRY 결과는 EWKB 형식의 BINARY로 렌더링됩니다.
EWKT와 EWKB의 경우, SRID는 출력에서 항상 4326입니다. EWKT 및 EWKB 처리에 관한 참고 사항 을 참조하십시오.
이 매개 변수는 Snowflake UI와 SnowSQL 명령줄 클라이언트뿐 아니라 JDBC, ODBC, node.js, python 등의 드라이버와 커넥터도 포함한 모든 클라이언트에 영향을 줍니다.
예: JDBC 드라이버는 GEOGRAPHY 형식의 결과 열(이 예에서는 i
열)에 대해 다음 메타데이터를 반환합니다.
GEOGRAPHY_OUTPUT_FORMAT='GeoJSON'
또는GEOMETRY_OUTPUT_FORMAT='GeoJSON'
인 경우:ResultSetMetaData.getColumnType(i)
는java.sql.Types.VARCHAR
를 반환합니다.ResultSetMetaData.getColumnClassName(i)
는"java.lang.String"
을 반환합니다.
GEOGRAPHY_OUTPUT_FORMAT='WKT'
또는'EWKT'
인 경우, 또는GEOMETRY_OUTPUT_FORMAT='WKT'
또는'EWKT'
인 경우:ResultSetMetaData.getColumnType(i)
는java.sql.Types.VARCHAR
를 반환합니다.ResultSetMetaData.getColumnClassName(i)
는"java.lang.String"
을 반환합니다.
GEOGRAPHY_OUTPUT_FORMAT='WKB'
또는'EWKB'
인 경우, 또는GEOMETRY_OUTPUT_FORMAT='WKB'
또는'EWKB'
인 경우:ResultSetMetaData.getColumnType(i)
는java.sql.Types.BINARY
를 반환합니다.ResultSetMetaData.getColumnClassName(i)
는"[B"
(바이트 배열)를 반환합니다.
참고
데이터베이스별 형식 이름(JDBC의 getColumnTypeName
및 ODBC의 SQL_DESC_TYPE_NAME
설명자)을 검색하기 위한 API는 GEOGRAPHY_OUTPUT_FORMAT
매개 변수와 GEOMETRY_OUTPUT_FORMAT
매개 변수의 값과 관계없이 항상 형식 이름에 대해 GEOGRAPHY
와 GEOMETRY
를 반환합니다. 자세한 내용은 다음을 참조하십시오.
JDBC 드라이버 설명서의 Snowflake 고유 동작.
ODBC 드라이버 설명서의 결과 및 결과에 대한 정보 검색하기.
GEOGRAPHY 데이터 삽입과 쿼리의 예¶
아래 코드는 GEOGRAPHY 데이터 타입에 대한 샘플 입력 및 출력을 보여줍니다. 다음 사항을 참고하십시오.
WKT, EWKT, GeoJSON에 있는 좌표의 경우, 경도가 위도 앞에 나타납니다(예:
POINT(lon lat)
).WKB 및 EWKB 출력의 경우 BINARY_OUTPUT_FORMAT 매개 변수는
HEX
(매개 변수의 기본값)로 설정된 것으로 간주됩니다.
이 예에서는 GEOGRAPHY 열이 있는 테이블을 만들고 WKT 형식으로 데이터를 삽입하고 데이터를 다른 출력 형식으로 반환합니다.
create table geospatial_table (id INTEGER, g GEOGRAPHY); insert into geospatial_table values (1, 'POINT(-122.35 37.55)'), (2, 'LINESTRING(-124.20 42.00, -120.01 41.99)');alter session set GEOGRAPHY_OUTPUT_FORMAT='GeoJSON';select g from geospatial_table order by id; +------------------------+ | G | |------------------------| | { | | "coordinates": [ | | -122.35, | | 37.55 | | ], | | "type": "Point" | | } | | { | | "coordinates": [ | | [ | | -124.2, | | 42 | | ], | | [ | | -120.01, | | 41.99 | | ] | | ], | | "type": "LineString" | | } | +------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='WKT';select g from geospatial_table order by id; +-------------------------------------+ | G | |-------------------------------------| | POINT(-122.35 37.55) | | LINESTRING(-124.2 42,-120.01 41.99) | +-------------------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='WKB';select g from geospatial_table order by id; +------------------------------------------------------------------------------------+ | G | |------------------------------------------------------------------------------------| | 01010000006666666666965EC06666666666C64240 | | 010200000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 | +------------------------------------------------------------------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='EWKT';select g from geospatial_table order by id; +-----------------------------------------------+ | G | |-----------------------------------------------| | SRID=4326;POINT(-122.35 37.55) | | SRID=4326;LINESTRING(-124.2 42,-120.01 41.99) | +-----------------------------------------------+alter session set GEOGRAPHY_OUTPUT_FORMAT='EWKB';select g from geospatial_table order by id; +--------------------------------------------------------------------------------------------+ | G | |--------------------------------------------------------------------------------------------| | 0101000020E61000006666666666965EC06666666666C64240 | | 0102000020E610000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 | +--------------------------------------------------------------------------------------------+
Snowflake에서 지리 공간 데이터 사용하기¶
다음 섹션에서는 지리 공간 데이터를 읽고 쓸 때 지원되는 표준 형식 및 오브젝트 유형을 다룹니다.
GEOMETRY와 함께 다른 SRID를 사용하는 효과 이해하기¶
GEOMETRY 열에서 다른 SRID를 가진 오브젝트를 삽입할 수 있습니다. 열에 둘 이상의 SRID가 포함되어 있으면 중요한 성능 최적화 중 일부가 적용되지 않습니다. 이로 인해 특히 지리 공간 조건자에서 조인할 때 쿼리 속도가 느려질 수 있습니다.
GEOGRAPHY 및 GEOMETRY 열에 대한 DML 연산 수행하기¶
GEOGRAPHY 또는 GEOMETRY 열이 DML 작업(INSERT, COPY, UPDATE, MERGE 또는 CREATE TABLE AS…)의 대상일 때는 열의 원본 식이 다음과 같은 유형일 수 있습니다.
GEOGRAPHY 또는 GEOMETRY: GEOGRAPHY 또는 GEOMETRY 형식의 식은 보통 구문 분석 함수, 생성자 함수 또는 기존 GEOGRAPHY 또는 GEOMETRY 열의 결과입니다. 지원되는 함수와 함수 카테고리의 전체 목록은 지리 공간 함수 를 참조하십시오.
VARCHAR: WKT, WKB(16진수 형식), EWKT, EWKB(16진수 형식) 또는 GeoJSON 형식의 문자열로 해석됩니다(TO_GEOGRAPHY(VARCHAR) 참조).
BINARY: WKB 이진 형식으로 해석됩니다(TO_GEOGRAPHY(BINARY) 및
TO_GEOMETRY(BINARY) 참조).
VARIANT: GeoJSON 오브젝트로 해석됩니다(TO_GEOGRAPHY(VARIANT) 및 TO_GEOMETRY(VARIANT) 참조).
스테이지에서 지리 공간 데이터 로딩하기¶
스테이지에 있는 CSV 또는 JSON/AVRO 파일의 데이터를 GEOGRAPHY 열로 직접(즉, 복사 변환 없이) 로딩할 수 있습니다.
CSV: 해당 CSV 열의 문자열 값은 GeoJSON, WKT, EWKT, WKB 또는 EWKB로 구문 분석됩니다(TO_GEOGRAPHY(VARCHAR) 참조).
JSON/AVRO: 파일의 JSON 값은 GeoJSON으로 해석됩니다(TO_GEOGRAPHY(VARIANT) 참조).
COPY 변환을 통해 다른 파일 형식(Parquet, ORC 등)에서 데이터를 로딩할 수 있습니다.
Java UDF와 함께 지리 공간 데이터 사용하기¶
Java UDF는 GEOGRAPHY 형식을 인자와 반환 값으로 허용합니다. 자세한 내용은 매개 변수 및 반환 형식에 대한 SQL-Java 데이터 타입 매핑 및 인라인 Java UDF에 GEOGRAPHY 값 전달 섹션을 참조하십시오.
JavaScript UDF와 함께 지리 공간 데이터 사용하기¶
JavaScript UDFs는 GEOGRAPHY 형식을 인자와 반환 값으로 허용합니다.
JavaScript UDF에 GEOGRAPHY 형식의 인자가 있는 경우 그 인자는 UDF 본문 내 GeoJSON 형식의 JSON 오브젝트로 표시됩니다.
JavaScript UDF가 GEOGRAPHY를 반환할 경우 UDF 본문은 JSON 오브젝트를 GeoJSON 형식으로 반환할 것으로 예상됩니다.
예를 들어, 다음 두 JavaScript UDFs는 내장 함수 ST_X 및 ST_MAKEPOINT와 대략적으로 동등합니다.
create or replace function my_st_x(G geography) returns real
language javascript
as
$$
if (G["type"] != "Point")
{
throw "Not a point"
}
return G["coordinates"][0]
$$;
create or replace function my_st_makepoint(LNG real, LAT real) returns geography
language javascript
as
$$
g = {}
g["type"] = "Point"
g["coordinates"] = [ LNG, LAT ]
return g
$$;
사용할 지리 공간 데이터 타입 선택하기(GEOGRAPHY 또는 GEOMETRY)¶
다음 섹션에서는 GEOGRAPHY 데이터 타입과 GEOMETRY 데이터 타입의 차이점을 설명합니다.
GEOGRAPHY와 GEOMETRY의 차이점 이해하기¶
GEOGRAPHY 및 GEOMETRY 데이터 타입이 둘 다 지리 공간적 특징을 정의하지만, 타입은 서로 다른 모델을 사용합니다. 다음 표에 차이점이 요약되어 있습니다.
GEOGRAPHY 데이터 타입 |
GEOMETRY 데이터 타입 |
---|---|
|
|
GEOGRAPHY 및 GEOMETRY 데이터 타입을 비교하는 예¶
다음 예에서는 GEOGRAPHY 및 GEOMETRY 데이터 타입을 입력으로 사용할 때 지리 공간 함수의 출력을 비교합니다.
예 1: 베를린과 샌프란시스코 사이의 거리 쿼리하기¶
다음 표는 GEOGRAPHY 타입과 GEOMETRY 타입에 대한 ST_DISTANCE 의 출력을 비교한 내용입니다.
ST_DISTANCE . GEOGRAPHY 입력 사용하기 |
ST_DISTANCE . GEOMETRY 입력 사용하기 |
---|---|
SELECT ST_DISTANCE(
ST_POINT(13.4814, 52.5015),
ST_POINT(-121.8212, 36.8252))
AS distance_in_meters;
+--------------------+
| DISTANCE_IN_METERS |
|--------------------|
| 9182410.99227821 |
+--------------------+
|
SELECT ST_DISTANCE(
ST_GEOM_POINT(13.4814, 52.5015),
ST_GEOM_POINT(-121.8212, 36.8252))
AS distance_in_degrees;
+---------------------+
| DISTANCE_IN_DEGREES |
|---------------------|
| 136.207708844 |
+---------------------+
|
위의 예에 표시된 것처럼 다음과 같습니다.
GEOGRAPHY 입력값에서 입력 좌표는 도 단위이고 출력값은 미터 단위입니다. (결과는 9,182km입니다.)
GEOMETRY 입력값에서는 입력 좌표와 출력값이 모두 도 단위입니다. (결과는 136.208도입니다.)
예 2: 독일 면적 쿼리하기¶
다음 표는 GEOGRAPHY 타입과 GEOMETRY 타입에 대한 ST_AREA 의 출력을 비교한 내용입니다.
ST_AREA . GEOGRAPHY 입력 사용하기 |
ST_AREA . GEOMETRY 입력 사용하기 |
---|---|
SELECT ST_AREA(border) AS area_in_sq_meters
FROM world_countries
WHERE name = 'Germany';
+-------------------+
| AREA_IN_SQ_METERS |
|-------------------|
| 356379183635.591 |
+-------------------+
|
SELECT ST_AREA(border) as area_in_sq_degrees
FROM world_countries_geom
WHERE name = 'Germany';
+--------------------+
| AREA_IN_SQ_DEGREES |
|--------------------|
| 45.930026848 |
+--------------------+
|
위의 예에 표시된 것처럼 다음과 같습니다.
GEOGRAPHY 입력값에서 입력 좌표는 도 단위이고 출력값은 제곱미터 단위입니다. (결과는 356,379km^2입니다.)
GEOMETRY 입력값에서 입력 좌표는 도 단위이고 출력값은 제곱도 단위입니다. (결과는 45.930제곱도입니다.)
예 3: 베를린에서 샌프란시스코까지 노선이 겹치는 국가의 이름 쿼리하기¶
다음 표는 GEOGRAPHY 타입과 GEOMETRY 타입에 대한 ST_INTERSECTS 의 출력을 비교한 내용입니다.
입력 데이터 유효성 검사의 차이점 이해하기¶
입력 모양에 대한 GEOMETRY 또는 GEOGRAPHY 오브젝트를 만들려면 간단한 기능에 대한 OGC 규칙 에 따라 제대로 된 형태를 갖추고 유효한 모양을 사용해야 합니다. 다음 섹션에서는 GEOMETRY와 GEOGRAPHY 사이에 입력 데이터의 유효성이 어떻게 다른지 설명합니다.
모양은 유효한 GEOGRAPHY일 수 있지만 유효하지 않은 GEOMETRY임¶
주어진 모양은 유효한 GEOGRAPHY 오브젝트일 수 있지만 유효하지 않은 GEOMETRY 오브젝트일 수 있으며, 그 반대도 마찬가지입니다.
예를 들어 자체 교차 다각형은 OGC 규칙에 따라 허용되지 않습니다. 주어진 점 세트는 직교 영역에서 교차하지만 구에서는 교차하지 않는 모서리를 정의할 수 있습니다. 다음 다각형을 생각해 보겠습니다.
POLYGON((0 50, 25 50, 50 50, 0 50))
직교 영역에서 이 다각형은 선으로 분해되며, 결과적으로 유효하지 않습니다.
그러나 구에서는 위와 똑같은 다각형은 자체적으로 교차하지 않으며 유효합니다.
변환 및 생성자 함수는 유효성 검사를 다르게 처리함¶
입력 데이터가 유효하지 않은 경우 GEOMETRY 함수와 GEOGRAPHY 함수는 서로 다른 방식으로 유효성 검사를 처리합니다.
GEOGRAPHY 오브젝트를 생성하고 이 오브젝트로 변환하는 함수(예: TO_GEOGRAPHY)는 다각형에서 닫히지 않은 루프, 스파이크, 절단 및 자체 교차 루프와 같은 문제를 처리하기 위해 모양을 복구하려고 시도할 수 있습니다.
이 함수는 모양을 복구하는 데 성공하는 경우 GEOGRAPHY 오브젝트를 반환합니다.
GEOMETRY 오브젝트를 생성하고 이 오브젝트로 변환하는 함수(예: TO_GEOMETRY)는 모양을 복구하는 기능을 지원하지 않습니다.
GEOGRAPHY와 GEOMETRY 간에 변환하기¶
Snowflake는 GEOGRAPHY에서 GEOMETRY로, 그리고 그 반대로의 캐스팅을 지원하지 않습니다. 또한 Snowflake는 서로 다른 공간 참조 시스템(SRS)을 사용하는 오브젝트의 변환도 지원하지 않습니다.
GEOGRAPHY 오브젝트를 GEOMETRY 오브젝트로, 또는 GEOMETRY를 GEOGRAPHY로 변환해야 하는 경우 GeoJSON을 중간 형식으로 사용할 수 있습니다.
다음 예제에서는 GEOGRAPHY 오브젝트 geography_expression
를 SRID가 0인 GEOMETRY 오브젝트로 변환합니다.
SELECT TO_GEOMETRY(ST_ASGEOJSON(geography_expression));
GEOMETRY 오브젝트의 SRID를 설정해야 하는 경우 ST_SETSRID 함수를 호출합니다. 예를 들어, GEOGRAPHY 오브젝트 geography_expression
를 SRID가 4326인 GEOMETRY 오브젝트로 변환하는 방법은 다음과 같습니다.
SELECT ST_SETSRID(TO_GEOMETRY(ST_ASGEOJSON(geography_expression)), 4326);