지리 공간 데이터 타입

Snowflake는 지표상에 점, 선, 다각형과 같은 지리 공간적 기능을 위한 기본 지원을 제공합니다.

검색 최적화 서비스를 사용하여 쿼리 성능을 개선할 수 있습니다. 자세한 내용은 검색 최적화 서비스 섹션을 참조하십시오.

데이터 타입

Snowflake는 지리 공간 데이터에 대해 다음 데이터 타입을 제공합니다.

  • 지구가 완벽한 구인 것처럼 지구를 모델링하는 GEOGRAPHY 데이터 타입.

  • 평면(유클리드, 데카르트) 좌표계의 특징을 나타내는 GEOMETRY 데이터 타입.

GEOGRAPHY 데이터 타입

GEOGRAPHY 데이터 타입은 WGS 84 표준(공간 참조 ID 4326. 자세한 내용은 https://epsg.io/4326 참조)을 따릅니다.

지구상의 점은 경도(-180도~+180도)와 위도(-90~+90도)로 표시됩니다. Snowflake는 소수점 이하 14자리를 사용하여 GEOGRAPHY 좌표를 저장합니다. 데이터에 이 제한을 초과하는 소수 자릿수가 포함된 경우 지정된 길이 제약 조건을 준수하도록 좌표가 반올림됩니다.

현재 고도는 지원되지 않습니다.

선분은 지구 표면에서 큰 원호로 해석됩니다.

Snowflake는 GEOGRAPHY 데이터 타입에 대해 작동하는 지리 공간 함수 도 제공합니다.

지리적 공간 데이터(예: 경도 및 위도 데이터, WKT, WKB, GeoJSON 등)가 있는 경우 이 데이터를 원래 형식으로 VARCHAR, VARIANT 또는 NUMBER 열에 보관하지 말고 GEOGRAPHY 열에 변환하여 저장하는 것이 좋습니다. GEOGRAPHY 열에 데이터를 저장하면 지리 공간 기능을 사용하는 쿼리의 성능을 크게 개선할 수 있습니다.

GEOGRAPHY 데이터 타입의 지리 공간 함수에 대한 입력이 다각형을 나타내는 경우, 다각형의 시작점과 끝점은 동일해야 합니다. 그렇지 않은 경우 함수가 오류를 반환할 수 있습니다.

GEOMETRY 데이터 타입

GEOMETRY 데이터 타입은 평면(유클리드, 데카르트) 좌표계의 특징을 나타냅니다.

좌표는 실수 쌍(x, y)으로 표시됩니다. 현재, 2D 좌표만 지원됩니다.

X와 Y의 단위는 GEOMETRY 오브젝트와 관련된 공간 참조 시스템(SRS) 에 따라 결정됩니다. 공간 참조 시스템은 공간 참조 시스템 식별자(SRID) 번호로 식별됩니다. GEOMETRY 오브젝트를 만들 때 또는 ST_SETSRID 호출로 SRID를 제공하지 않는 한 SRID는 0입니다.

Snowflake는 소수점 이하 14자리를 사용하여 GEOMETRY 좌표를 저장합니다. 데이터에 이 제한을 초과하는 소수 자릿수가 포함된 경우 지정된 길이 제약 조건을 준수하도록 좌표가 반올림됩니다.

Snowflake는 GEOMETRY 데이터 타입 에 대해 작동하는 지리 공간 함수 세트를 제공합니다. 이들 함수에 대한 사항은 다음과 같습니다.

  • 기하학에서 비평면 SRS를 사용하더라도 모든 함수에서는 평면 좌표를 가정합니다.

  • 측정 함수(예: ST_LENGTH)는 좌표 시스템과 동일한 단위를 사용합니다.

  • 여러 개의 GEOMETRY 식을 인자로 받는 함수(예: ST_DISTANCE)의 경우 입력 식은 동일한 SRS 에 정의되어야 합니다.

지리 공간 입력 및 출력

다음 섹션에서는 지리 공간 데이터를 읽고 쓸 때 지원되는 표준 형식 및 오브젝트 유형을 다룹니다.

지원되는 표준 입력 및 출력 형식

GEOGRAPHY 및 GEOMETRY 데이터 타입은 입력과 출력에 대해 다음의 표준 산업 형식을 지원합니다.

다음 오픈 지리 공간 컨소시엄의 간단한 기능 액세스 참조 자료도 도움이 될 수 있습니다.

이러한 표준에서 벗어나는 상황은 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에 특정한 지리 공간 오브젝트:

    • 특징

    • FeatureCollection

결과 세트의 출력 형식 지정하기

세션 매개 변수 GEOGRAPHY_OUTPUT_FORMATGEOMETRY_OUTPUT_FORMAT 은 결과 세트에서 GEOGRAPHY 및 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로 렌더링됩니다.

EWKTEWKB 의 경우, SRID는 출력에서 항상 4326입니다. GEOGRAPHY 값에 대한 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 매개 변수의 값과 관계없이 항상 형식 이름에 대해 GEOGRAPHYGEOMETRY 를 반환합니다. 자세한 내용은 다음을 참조하십시오.

GEOGRAPHY 데이터 삽입과 쿼리의 예

아래 코드는 GEOGRAPHY 데이터 타입에 대한 샘플 입력 및 출력을 보여줍니다. 다음 사항을 참고하십시오.

  • WKT, EWKT, GeoJSON 의 좌표의 경우 경도가 위도 앞에 표시됩니다(예: POINT(lon lat)).

  • WKB 및 EWKB 출력의 경우 BINARY_OUTPUT_FORMAT 매개 변수는 HEX (매개 변수의 기본값)로 설정된 것으로 간주됩니다.

다음 예에서는 GEOGRAPHY 열이 있는 테이블을 만들고 WKT 형식으로 데이터를 삽입하고 데이터를 다른 출력 형식으로 반환합니다.

CREATE OR REPLACE 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)');
Copy
ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT='GeoJSON';
Copy
SELECT g
  FROM geospatial_table
  ORDER BY id;
Copy
+------------------------+
| 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';
Copy
SELECT g
  FROM geospatial_table
  ORDER BY id;
Copy
+-------------------------------------+
| G                                   |
|-------------------------------------|
| POINT(-122.35 37.55)                |
| LINESTRING(-124.2 42,-120.01 41.99) |
+-------------------------------------+
ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT='WKB';
Copy
SELECT g
  FROM geospatial_table
  ORDER BY id;
Copy
+------------------------------------------------------------------------------------+
| G                                                                                  |
|------------------------------------------------------------------------------------|
| 01010000006666666666965EC06666666666C64240                                         |
| 010200000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 |
+------------------------------------------------------------------------------------+
ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT='EWKT';
Copy
SELECT g
  FROM geospatial_table
  ORDER BY id;
Copy
+-----------------------------------------------+
| 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';
Copy
SELECT g
  FROM geospatial_table
  ORDER BY id;
Copy
+--------------------------------------------------------------------------------------------+
| G                                                                                          |
|--------------------------------------------------------------------------------------------|
| 0101000020E61000006666666666965EC06666666666C64240                                         |
| 0102000020E610000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 |
+--------------------------------------------------------------------------------------------+

Snowflake에서 지리 공간 데이터 사용하기

다음 섹션에서는 Snowflake에서 지리 공간 데이터로 작업하는 방법을 다룹니다.

GEOMETRY와 함께 다른 SRID를 사용하는 효과 이해하기

GEOMETRY 열에서 다른 SRID 를 가진 오브젝트를 삽입할 수 있습니다. 열에 둘 이상의 SRID 가 포함되어 있으면 중요한 성능 최적화 중 일부가 적용되지 않습니다. 이로 인해 특히 지리 공간 조건자에서 조인할 때 쿼리 속도가 느려질 수 있습니다.

GEOMETRY 오브젝트의 공간 참조 시스템(SRS) 및 SRID 변경하기

기존 GEOMETRY 오브젝트의 SRSSRID 를 변경하려면 ST_TRANSFORM 함수를 호출하여 새 SRID를 전달합니다. 이 함수는 새 SRID 및 SRS를 사용하도록 변환된 좌표를 사용하여 새 GEOMETRY 오브젝트를 반환합니다. 예를 들어, SRID 32633에 대해 SRS를 사용하는 geometry_expression 의 GEOMETRY 오브젝트를 반환하려면 다음 문을 실행하십시오.

SELECT ST_TRANSFORM(geometry_expression, 32633);
Copy

기존 GEOMETRY 오브젝트에 원본 SRID 가 올바르게 설정되지 않은 경우 원본 SRID 를 추가 인자로 지정하십시오. 예를 들어, geometry_expression 이 SRID 4326을 사용하는 GEOMETRY 오브젝트이고 SRID 28992를 사용하도록 이를 변환하려는 경우 다음 문을 실행합니다.

SELECT ST_TRANSFORM(geometry_expression, 4326, 28992);
Copy

GEOMETRY 오브젝트가 SRS 에 대해 올바른 좌표를 사용하지만 잘못된 SRID 가 있는 경우 ST_SETSRID 함수를 호출하여 SRID 를 수정할 수 있습니다. 예를 들어, 다음 문은 좌표를 변경하지 않은 상태에서 geometry_expression 의 SRID 를 4326으로 설정합니다.

SELECT ST_SETSRID(geometry_expression, 4326);
Copy

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_GEOMETRYBINARY 참조).

  • VARIANT: GeoJSON 오브젝트로 해석됩니다(TO_GEOGRAPHY(VARIANT)TO_GEOMETRY(VARIANT) 참조).

스테이지에서 지리 공간 데이터 로딩하기

스테이지의 CSV 또는 JSON/AVRO 파일에서 직접(즉, 복사본 변환 없이) GEOGRAPHY 열로 데이터를 로드할 수 있습니다.

다른 파일 형식(Parquet, ORC 등)의 데이터 로딩은 COPY 변환을 통해 가능합니다.

Java UDF와 함께 지리 공간 데이터 사용하기

Java UDF는 GEOGRAPHY 형식을 인자와 반환 값으로 허용합니다. 자세한 내용은 SQL-Java 데이터 타입 매핑인라인 Java UDF에 GEOGRAPHY 값 전달하기 섹션을 참조하십시오.

JavaScript UDF와 함께 지리 공간 데이터 사용하기

JavaScript UDF는 GEOGRAPHY 또는 GEOMETRY 형식을 인자와 반환 값으로 허용합니다.

JavaScript UDF 에 GEOGRAPHY 또는 GEOMETRY 유형의 인자가 있는 경우 해당 인자는 UDF 본문 내에서 GeoJSON 형식의 JSON 오브젝트로 표시됩니다.

JavaScript UDF가 GEOGRAPHY 또는 GEOMETRY를 반환할 경우 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
$$;
Copy

Python UDF와 함께 지리 공간 데이터 사용하기

Python UDFs는 GEOGRAPHY 및 GEOMETRY 타입을 인자와 반환 값으로 허용합니다.

Python UDF 에 GEOGRAPHY 또는 GEOMETRY 형식의 인자가 있는 경우 해당 인자는 GeoJSON 오브젝트로 표시되며, 이는 UDF 본문 내에서 Python dict 오브젝트로 변환됩니다.

Python UDF가 GEOGRAPHY 또는 GEOMETRY를 반환하는 경우 UDF 본문은 GeoJSON의 구조를 준수하는 Python dict 오브젝트를 반환해야 합니다.

예를 들어 이 Python UDF는 복합 GEOGRAPHY 형식을 구성하는 고유한 기하 도형의 수를 반환합니다.

CREATE OR REPLACE FUNCTION py_numgeographys(geo GEOGRAPHY)
RETURNS INTEGER
LANGUAGE PYTHON
RUNTIME_VERSION = 3.10
PACKAGES = ('shapely')
HANDLER = 'udf'
AS $$
from shapely.geometry import shape, mapping
def udf(geo):
    if geo['type'] not in ('MultiPoint', 'MultiLineString', 'MultiPolygon', 'GeometryCollection'):
        raise ValueError('Must be a composite geometry type')
    else:
        g1 = shape(geo)
        return len(g1.geoms)
$$;
Copy

더 많은 Python UDF 샘플을 보려면 Snowflake Labs 를 확인하십시오. 그중 일부는 복잡한 공간 조작을 가능하게 하거나 데이터 수집을 단순화합니다. 예를 들어, 이 UDF 를 사용하면 Shapefiles(.SHP), TAB, KML, GPKG 등과 같이 기본적으로 지원되지 않는 형식을 읽을 수 있습니다.

참고

Snowflake Labs의 코드 샘플은 참조 및 교육 목적으로만 사용됩니다. 이러한 코드 샘플에는 서비스 수준 계약이 적용되지 않습니다.

H3과 함께 GEOGRAPHY 오브젝트 사용하기

H3불연속 전역 그리드 시스템 에서 세계를 육각형 셀로 분할하는 계층적 지리 공간 인덱스 입니다.

Snowflake는 GEOGRAPHY 오브젝트와 함께 H3을 사용할 수 있게 해주는 SQL 함수를 제공합니다. 이러한 함수를 사용하여 다음을 수행할 수 있습니다.

  • 점을 나타내는 GEOGRAPHY 오브젝트에 대한 H3 셀 ID(인덱스) 가져오기(그 반대도 마찬가지임).

  • GEOGRAPHY 오브젝트를 포괄하는 H3 셀의 최소 세트 ID 가져오기.

  • 다각형을 나타내는 GEOGRAPHY 오브젝트 내에 도심이 있는 H3 셀의 ID 가져오기.

  • H3 셀의 경계를 나타내는 GEOGRAPHY 오브젝트 가져오기.

  • 주어진 H3 셀의 상위 항목과 하위 항목 가져오기.

  • H3 셀 도심의 경도와 위도 가져오기(그 반대도 마찬가지임).

  • H3 셀의 해상도 가져오기.

  • H3 셀 ID의 16진수 표현 가져오기(그 반대도 마찬가지임).

이러한 함수에 대한 자세한 내용은 지리공간 함수 를 참조하십시오.

사용할 지리 공간 데이터 타입 선택하기(GEOGRAPHY 또는 GEOMETRY)

다음 섹션에서는 GEOGRAPHY 데이터 타입과 GEOMETRY 데이터 타입의 차이점을 설명합니다.

GEOGRAPHY와 GEOMETRY의 차이점 이해하기

GEOGRAPHY 및 GEOMETRY 데이터 타입이 둘 다 지리 공간적 특징을 정의하지만, 타입은 서로 다른 모델을 사용합니다. 다음 표에 차이점이 요약되어 있습니다.

GEOGRAPHY 데이터 타입

GEOMETRY 데이터 타입

  • 구에서 특징을 정의합니다.

  • WGS84 좌표계만 해당됩니다. SRID 는 항상 4326입니다.

  • 좌표는 도 단위로 표시한 위도(-90~90)와 경도(-180~180)입니다.

  • 측정 작업 결과(ST_LENGTH, ST_AREA 등)는 미터 단위로 표시됩니다.

  • 세그먼트는 지구 표면의 큰 원호로 해석됩니다.

  • 평면상의 특징을 정의합니다.

  • 모든 좌표계가 지원됩니다.

  • 좌표 값의 단위는 공간 참조 시스템에 의해 정의됩니다.

  • 측정 작업 결과(ST_LENGTH, ST_AREA 등)는 좌표와 동일한 단위로 표시됩니다. 예를 들어, 입력 좌표가 도 단위로 주어지는 경우 결과는 도 단위로 표시됩니다.

  • 세그먼트는 평면에서 직선으로 해석됩니다.

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;
Copy
+--------------------+
| DISTANCE_IN_METERS |
|--------------------|
|   9182410.99227821 |
+--------------------+
SELECT ST_DISTANCE(
    ST_GEOMPOINT(13.4814, 52.5015),
    ST_GEOMPOINT(-121.8212, 36.8252))
  AS distance_in_degrees;
Copy
+---------------------+
| 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';
Copy
+-------------------+
| AREA_IN_SQ_METERS |
|-------------------|
|  356379183635.591 |
+-------------------+
SELECT ST_AREA(border) as area_in_sq_degrees
  FROM world_countries_geom
  WHERE name = 'Germany';
Copy
+--------------------+
| AREA_IN_SQ_DEGREES |
|--------------------|
|       45.930026848 |
+--------------------+

위의 예에 표시된 것처럼 다음과 같습니다.

  • GEOGRAPHY 입력값에서 입력 좌표는 도 단위이고 출력값은 제곱미터 단위입니다. 결과는 356,379km^2입니다.

  • GEOMETRY 입력값에서 입력 좌표는 도 단위이고 출력값은 제곱도 단위입니다. 결과는 45.930제곱도입니다.

예 3: 베를린에서 샌프란시스코까지 노선이 겹치는 국가의 이름 쿼리하기

다음 표는 GEOGRAPHY 타입과 GEOMETRY 타입에 대한 ST_INTERSECTS 의 출력을 비교한 내용입니다.

ST_INTERSECTS . GEOGRAPHY 입력 사용하기

ST_INTERSECTS . GEOMETRY 입력 사용하기

SELECT name FROM world_countries WHERE
  ST_INTERSECTS(border,
    TO_GEOGRAPHY(
      'LINESTRING(13.4814 52.5015, -121.8212 36.8252)'
    ));
Copy
+--------------------------+
| NAME                     |
|--------------------------|
|                  Germany |
|                  Denmark |
|                  Iceland |
|                Greenland |
|                   Canada |
| United States of America |
+--------------------------+
SELECT name FROM world_countries_geom WHERE
  ST_INTERSECTS(border,
    TO_GEOMETRY(
      'LINESTRING(13.4814 52.5015, -121.8212 36.8252)'
    ));
Copy
+--------------------------+
| NAME                     |
|--------------------------|
|                  Germany |
|                  Belgium |
|              Netherlands |
|           United Kingdom |
| United States of America |
+--------------------------+
GEOGRAPHY 사용 시 교차하는 국가 GEOMETRY 사용 시 교차하는 국가

입력 데이터 유효성 검사의 차이점 이해하기

입력 도형에 대한 GEOMETRY 또는 GEOGRAPHY 오브젝트를 만들려면 간단한 기능에 대한 OGC 규칙 에 따라 제대로 된 형태를 갖추고 유효한 도형을 사용해야 합니다. 다음 섹션에서는 GEOMETRY와 GEOGRAPHY 사이에 입력 데이터의 유효성이 어떻게 다른지 설명합니다.

모양은 유효한 GEOGRAPHY일 수 있지만 유효하지 않은 GEOMETRY임

주어진 모양은 유효한 GEOGRAPHY 오브젝트일 수 있지만 유효하지 않은 GEOMETRY 오브젝트일 수 있으며, 그 반대도 마찬가지입니다.

예를 들어 자체 교차 다각형은 OGC 규칙에 따라 허용되지 않습니다. 주어진 점 세트는 직교 영역에서 교차하지만 구에서는 교차하지 않는 모서리를 정의할 수 있습니다. 다음 다각형을 생각해 보겠습니다.

POLYGON((0 50, 25 50, 50 50, 0 50))
Copy

직교 영역에서 이 다각형은 선으로 분해되며, 결과적으로 유효하지 않습니다.

그러나 구에서는 위와 똑같은 다각형은 자체적으로 교차하지 않으며 유효합니다.

POLYGON((0 50, 25 50, 50 50, 0 50)) GEOMETRY는 유효하지 않지만 GEOGRAPHY는 유효함

변환 및 생성자 함수는 유효성 검사를 다르게 처리함

입력 데이터가 유효하지 않은 경우 GEOMETRY 함수와 GEOGRAPHY 함수는 서로 다른 방식으로 유효성 검사를 처리합니다.

  • GEOGRAPHY 오브젝트를 생성하고 이 오브젝트로 변환하는 함수 중 일부는 다각형에서 닫히지 않은 루프, 스파이크, 절단 및 자체 교차 루프와 같은 문제를 처리하기 위해 모양을 복구하려고 시도할 수 있습니다. 예를 들어 TO_GEOGRAPHY 함수 또는 ST_MAKEPOLYGON 함수를 사용하여 다각형을 만들 때 이 함수는 루프의 방향을 수정하여 지구의 절반 이상에 걸친 다각형을 만들지 않도록 합니다. 그러나 ST_MAKEPOLYGONORIENTED 함수는 루프의 방향을 수정하려고 시도하지 않습니다.

    이 함수는 모양을 복구하는 데 성공하는 경우 GEOGRAPHY 오브젝트를 반환합니다.

  • GEOMETRY 오브젝트를 생성하고 이 오브젝트로 변환하는 함수(예: TO_GEOMETRY)은 모양을 복구하는 함수를 지원하지 않습니다.

GEOGRAPHY와 GEOMETRY 간에 변환하기

Snowflake는 GEOGRAPHY 오브젝트에서 GEOMETRY 오브젝트로의(그리고 그 반대로도) 변환을 지원합니다. 또한 Snowflake는 서로 다른 공간 참조 시스템(SRS)을 사용하는 오브젝트의 변환도 지원합니다.

다음 예에서는 점을 나타내는 GEOGRAPHY 오브젝트를 SRID 가 0인 GEOMETRY 오브젝트로 변환합니다.

SELECT TO_GEOMETRY(TO_GEOGRAPHY('POINT(-122.306100 37.554162)'));
Copy

새로운 GEOMETRY 오브젝트의 SRID를 설정하려면 생성자 함수에 SRID를 인자로 전달하십시오. 예:

SELECT TO_GEOMETRY(TO_GEOGRAPHY('POINT(-122.306100 37.554162)', 4326));
Copy

기존 GEOMETRY 오브젝트의 SRID를 설정해야 하는 경우 GEOMETRY 오브젝트의 공간 참조 시스템(SRS) 및 SRID 변경하기 를 호출합니다.

지리 공간 조건자가 포함된 쿼리의 자동 성능 최적화

Snowflake는 지리 공간 조건자가 있는 쿼리에 대해 다음과 같은 성능 최적화를 자동으로 구현합니다.

GeoJoin

*GeoJoin*은 지리 공간 조인을 위한 Snowflake 쿼리 최적화 기능입니다. ST_INTERSECTS, ST_CONTAINS, ST_DWITHIN 등의 지리 공간 함수를 호출하는 조건자를 기반으로 테이블을 조인할 때 성능을 개선하는 특수 조인 재작성 최적화입니다. 예를 들어,GeoJoin은 특정 지리적 리전 내의 모든 매장을 찾는 데 사용할 수 있습니다.

GeoJoin의 특징은 다음과 같습니다.

  • 지리 공간 함수를 사용하는 테이블을 조인하는 쿼리를 자동으로 최적화합니다.

  • 지리적 데이터 세트 간의 공간 중첩 분석을 수행합니다.

Snowflake의 쿼리 최적화 프로그램이 SQL 쿼리에서 적절한 지리 공간적 조인 패턴을 감지하면 GeoJoin 최적화가 자동으로 트리거됩니다. 향상된 성능의 이점을 활용하기 위해 추가 구성이 필요하지 않습니다.

GEOMETRY 조건자에 대한 지리 공간적 정리

Snowflake는 일치하는 행을 포함할 수 없는 :ref:`마이크로 파티션을 정리 <label-micropartitions_query_pruning>`하여 GEOMETRY 열에서 필터링하는 일부 쿼리의 성능을 개선할 수 있습니다. 이 최적화에서는 조건자를 충족하지 않도록 보장되는 데이터의 스캔을 방지하기 위해 GEOMETRY 값으로 저장된 경계 상자 메타데이터를 사용합니다. 즉, Snowflake는 저장된 경계 상자 메타데이터가 필터에 있는 상수 기하 도형의 경계 상자와 교차하지 않는 마이크로 파티션을 건너뜁니다.

Snowflake는 이러한 최적화를 자동으로 수행하며, 향상된 성능의 이점을 활용하기 위해 추가 구성이 필요하지 않습니다.

지리 공간적 정리의 이점을 활용할 수 있는 조건자

정리는 한 면이 상수 기하 도형(예: 리터럴 또는 상수로 접을 수 있는 식)인 GEOMETRY 열의 필터 조건자를 위해 설계되었습니다. 예:

  • ST_INTERSECTS(geom_col, <constant_geometry>)

  • ST_CONTAINS(geom_col, <constant_geometry>)

  • ST_COVERS(geom_col, <constant_geometry>)

  • ST_COVEREDBY(geom_col, <constant_geometry>)

  • ST_WITHIN(geom_col, <constant_geometry>)

다음은 경계 상자를 사용하는 파일 수준 정리의 이점을 활용하는 특정 유형의 조건자입니다.

지리 공간적 정리의 작동 방식

GEOMETRY 값은 다음 항목을 포함하는 메타데이터와 함께 저장됩니다.

  • 경계 상자(xmin, ymin, xmax, ymax)

  • SRID 값

Snowflake는 파일 수준 경계 상자 메타데이터를 정리를 위한 기본 신호로 사용합니다.

Snowflake는 정확한 기하 도형 조건자를 평가하기 전에 경계 상자 교차에 대한 마이크로 파티션을 사전에 검사합니다. 메타데이터가 경계 상자 중첩이 가능하지 않음을 나타내는 경우 마이크로 파티션을 건너뛸 수 있습니다.

다음 그림은 두 개의 교차 모양과 두 개의 교차하지 않는 모양이 있는 경계 상자 선을 보여줍니다.

두 개의 교차 모양과 두 개의 교차하지 않는 모양이 있는 경계 상자 선

이 그림은 다음 예제와 유사한 지리 공간 쿼리를 보여줍니다.

SELECT *
  FROM <table>
  WHERE ST_CONTAINS(<geo_column>, <constant_geometry>);
Copy

지리 공간 상수(파란색으로 표시)에서 지정된 경계 상자의 경우, 경계 상자 선(녹색으로 표시)과 겹치는 경계 상자에 해당하는 마이크로 파티션만 스캔됩니다. 겹치지 않는 경계 상자(빨간색으로 표시)에 해당하는 마이크로 파티션은 정리됩니다.

SRID 동작

Snowflake의 공간 조건자는 SRID에 민감합니다. 따라서 동일한 열에서 호환되지 않는 SRIDs를 혼합하면 잘못된 결과를 반환할 수 있습니다. 최상의 결과와 결정적 동작을 위해서는 GEOMETRY 열 내에서 SRIDs를 일관되게 유지하는 것이 일반적인 실제 패턴이기도 합니다.

Iceberg 테이블에 대한 지리 공간적 정리

Iceberg GEOMETRY 열의 경우 Snowflake는 표준 Snowflake 테이블의 GEOMETRY 열에서와 동일한 방식으로 지리 공간 정리에 경계 상자 메타데이터를 사용하려고 시도합니다. 기본 Iceberg 메타데이터에 필요한 통계가 있는 경우 동일한 정리 논리가 수정 없이 적용됩니다.

지리 공간적 정리에 대한 기타 성능 고려 사항

지리 공간적 정리는 데이터 레이아웃에서 Snowflake가 광범위한 마이크로 파티션을 건너뛸 수 있을 때 가장 잘 작동합니다. 유사한 위치의 행이 여러 마이크로 파티션에 분산되어 있으면, 정리를 사용하는 경우에도 Snowflake는 테이블의 많은 부분을 스캔해야 할 수 있습니다.

위치별 클러스터링은 정리 효율성을 향상할 수 있습니다. GEOMETRY 열에서 파생된 공간 키로 행을 클러스터링하는 경우, 서로 가까이 있는 오브젝트는 동일한 마이크로 파티션에 저장될 가능성이 더 큽니다. 결과적으로, 상수 기하 도형이 있는 ST_INTERSECTS 또는 ST_CONTAINS와 같은 공간 필터는 더 많은 마이크로 파티션을 정리하고 더 적은 데이터를 읽을 수 있습니다.

지리 공간적 정리를 최적화하려면 다음 모범 사례를 따릅니다.

  • 도심과 같은 기하 도형의 대표 지점에서 계산된 H3 또는 지오해시와 같은 이산화된 공간 인덱스로 클러스터링합니다. 쿼리 윈도우 크기에 적합한 해상도를 사용합니다.

  • 넓은 영역을 차지하는 다각형과 같이 기하 도형이 큰 경우 여러 키로 클러스터링하여 과도한 클러스터링을 줄이고 선택성을 개선하는 것이 좋습니다. 예를 들어, 두 가지 분해능에서 H3으로 클러스터링하거나 거친 그리드 키와 더 미세한 그리드 키를 사용하여 클러스터링할 수 있습니다. 지배적인 쿼리 패턴(예: “도시 내” 또는 “타일 내”)이 있는 데이터 세트의 경우 해당 패턴에 맞는 클러스터링 키를 선택합니다.

다음 예제에서는 점이 포함된 GEOMETRY 열로 테이블을 클러스터링합니다.

ALTER TABLE <table_name>
  CLUSTER BY (H3_POINT_TO_CELL(<geo_column>, <h3_resolution>));
Copy

다음 예제에서는 LineStrings 및 다각형이 포함된 GEOMETRY 열로 테이블을 클러스터링합니다.

ALTER TABLE <table_name>
  CLUSTER BY (H3_POINT_TO_CELL(ST_CENTROID(<geo_column>), <h3_resolution>));
Copy

참고

  • 클러스터링은 쿼리 결과를 변경하지 않습니다. 저장소에서 데이터가 구성되는 방식을 변경합니다. 클러스터링의 이점은 데이터 배포, 테이블 크기, 쿼리 패턴에 따라 다릅니다.

  • 클러스터링 전후에 스캔된 바이트와 스캔된 마이크로 파티션을 비교하여 정리 효과를 모니터링할 수 있습니다.

지리 공간적 정리에 대한 제한 사항

지리 공간적 정리에는 다음 제한 사항이 적용됩니다.

  • 이는 GEOMETRY(평면) 조건자에만 적용됩니다.

    GEOGRAPHY 조건자를 정리하려면 :doc:`검색 최적화 </user-guide/search-optimization-service>`를 사용합니다.

  • 이는 하나의 조건자 인자가 상수인 경우에만 적용됩니다.

    두 조건자 인자가 모두 열인 경우(예: ST_INTERSECTS(a.geom, b.geom)), 이 최적화는 적용되지 않습니다. 이러한 경우, :ref:`label-geojoin`이 사용될 수 있습니다.

유효하지 않은 지리 공간 도형을 처리하는 방법 지정하기

기본적으로 지리 공간 변환 함수 를 사용하여 지원되는 입력 형식의 데이터 를 GEOGRAPHY 또는 GEOMETRY 오브젝트로 변환할 때 이 함수는 다음을 수행합니다.

  1. 이 함수는 입력 데이터에서 도형의 유효성을 검사하려고 시도합니다.

  2. 이 함수는 도형이 Open Geospatial Consortium의 Simple Feature Access / Common Architecture 표준에 따라 유효한지 확인합니다.

  3. 도형이 유효하지 않은 경우 함수는 데이터를 복구하려고 시도합니다(예: 링을 닫아 다각형을 수정).

  4. 복구 후에도 여전히 도형이 유효하지 않은 경우 이 함수는 오류를 보고하고 GEOGRAPHY 또는 GEOMETRY 오브젝트를 생성하지 않습니다. (TRY_* 함수는 오류를 보고하는 대신 NULL 을 반환합니다.)

이 기능을 사용하면 유효성 검사 및 복구 프로세스에 대해 더 많은 제어 권한을 갖게 됩니다. 다음을 할 수 있습니다.

  • 이러한 변환 함수가 유효하지 않은 도형에 대해 GEOGRAPHY 및 GEOMETRY 오브젝트를 생성하도록 허용합니다.

  • GEOGRAPHY 또는 GEOMETRY 오브젝트의 도형이 유효하지 않은지 확인합니다.

유효하지 않은 도형이 지리 공간 함수에 미치는 영향 이해하기

유효하지 않은 도형에 대해 GEOGRAPHY 또는 GEOMETRY 오브젝트를 전달할 때 다양한 지리 공간 함수 가 제각기 다른 영향을 미칩니다.

GEOMETRY 오브젝트에 대한 영향

GEOMETRY 오브젝트:

GEOGRAPHY 오브젝트에 대한 영향

GEOGRAPHY 오브젝트:

유효하지 않은 도형 작업하기

다음 섹션에서는 함수가 유효하지 않은 도형을 생성하도록 허용하는 방법과 GEOGRAPHY 또는 GEOMETRY 오브젝트가 유효하지 않거나 복구된 도형을 나타내는지 여부를 확인하는 방법을 설명합니다.

변환 함수가 유효하지 않은 도형을 생성하도록 허용하기

다음 변환 함수가 유효하지 않은 지리 공간 오브젝트를 만들 수 있도록 허용하려면 두 번째 인자(allowInvalid)에 대해 TRUE 를 전달하십시오.

TO_GEOGRAPHY( <input> [, <allowInvalid> ] )
Copy
ST_GEOGFROMWKB( <input> [, <allowInvalid> ] )
Copy
ST_GEOGFROMWKT( <input> [, <allowInvalid> ] )
Copy
TO_GEOMETRY( <input> [, <allowInvalid> ] )
Copy
ST_GEOMFROMWKB( <input> [, <allowInvalid> ] )
Copy
ST_GEOMFROMWKT( <input> [, <allowInvalid> ] )
Copy

기본적으로 allowInvalid 인자는 FALSE 입니다.

allowInvalid 인자에 대해 TRUE 를 전달하면 변환 함수는 입력 도형이 유효하지 않고 이를 성공적으로 복구할 수 없더라도 GEOGRAPHY 또는 GEOMETRY 오브젝트를 반환합니다.

예를 들어 다음 입력 도형은 동일한 두 점으로 구성된 LineString입니다. allowInvalid 인자에 대해 TRUE 를 전달하면 유효하지 않은 도형을 나타내는 GEOMETRY 오브젝트가 반환됩니다.

SELECT TO_GEOMETRY('LINESTRING(100 102,100 102)', TRUE);
Copy

도형이 유효하지 않은지 확인하기

GEOGRAPHY 또는 GEOMETRY 오브젝트가 유효하지 않은지 확인하려면 ST_ISVALID 함수를 호출하십시오.

다음 예제에서는 오브젝트가 유효한지 확인합니다.

SELECT TO_GEOMETRY('LINESTRING(100 102,100 102)', TRUE) AS g, ST_ISVALID(g);
Copy