지리 공간 데이터 타입

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

이 항목의 내용:

데이터 타입

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

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

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

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 데이터 타입은 입력과 출력에 대해 다음의 표준 산업 형식을 지원합니다.

다음 참고 자료가 도움이 될 수도 있습니다.

이러한 표준에서 벗어나는 상황은 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_FORMATGEOMETRY_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 매개 변수의 값과 관계없이 항상 형식 이름에 대해 GEOGRAPHYGEOMETRY 를 반환합니다. 자세한 내용은 다음을 참조하십시오.

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 열로 직접(즉, 복사 변환 없이) 로딩할 수 있습니다.

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 데이터 타입

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

  • 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;
+--------------------+
| 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 의 출력을 비교한 내용입니다.

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)'
    ));
+--------------------------+
| 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)'
    ));
+--------------------------+
| NAME                     |
|--------------------------|
| Germany                  |
| Belgium                  |
| Netherlands              |
| United Kingdom           |
| United States of America |
+--------------------------+
Countries intersecting when using GEOGRAPHY Countries intersecting when using GEOMETRY

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

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

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

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

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

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

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

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

POLYGON((0 50, 25 50, 50 50, 0 50)) invalid geometry, but valid geography

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

입력 데이터가 유효하지 않은 경우 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);
맨 위로 이동