지리 공간 데이터 타입¶
Snowflake는 지표상에 점, 선, 다각형과 같은 지리 공간적 기능을 위한 기본 지원을 제공합니다.
팁
검색 최적화 서비스를 사용하여 쿼리 성능을 개선할 수 있습니다. 자세한 내용은 검색 최적화 서비스 섹션을 참조하십시오.
이 항목의 내용:
데이터 타입¶
Snowflake는 지리 공간 데이터에 대해 다음 데이터 타입을 제공합니다.
GEOGRAPHY 데이터 타입¶
GEOGRAPHY 데이터 타입은 WGS 84 표준(공간 참조 ID 4326. 자세한 내용은 https://spatialreference.org/ref/epsg/wgs-84/ 참조)을 따릅니다.
지구상의 점은 경도(-180도~+180도)와 위도(-90~+90도)로 표시됩니다. Snowflake는 소수점 이하 14자리를 사용하여 GEOGRAPHY 좌표를 저장합니다. 데이터에 이 제한을 초과하는 소수 자릿수가 포함된 경우 지정된 길이 제약 조건을 준수하도록 좌표가 반올림됩니다.
고도는 현재 지원되지 않습니다.
선분은 지표상의 측지 호로 해석됩니다.
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는 소수점 이하 14자리를 사용하여 GEOMETRY 좌표를 저장합니다. 데이터에 이 제한을 초과하는 소수 자릿수가 포함된 경우 지정된 길이 제약 조건을 준수하도록 좌표가 반올림됩니다.
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 <https://postgis.net/docs/ST_GeomFromEWKT.html>에 의해 도입된 비표준 형식입니다. 이들은 데이터와 함께 사용할 좌표 참조 시스템을 지정하는 `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가 포함되어 있으면 중요한 성능 최적화 중 일부가 적용되지 않습니다. 이로 인해 특히 지리 공간 조건자에서 조인할 때 쿼리 속도가 느려질 수 있습니다.
GEOMETRY 오브젝트의 공간 참조 시스템(SRS) 및 SRID 변경하기¶
기존 GEOMETRY 오브젝트의 SRS 및 SRID 를 변경하려면 ST_TRANSFORM 함수를 호출하여 새 SRID를 전달합니다. 이 함수는 새 SRID 및 SRS를 사용하도록 변환된 좌표를 사용하여 새 GEOMETRY 오브젝트를 반환합니다. 예를 들어, SRID 32633에 대해 SRS를 사용하는 geometry_expression
의 GEOMETRY 오브젝트를 반환하려면 다음 문을 실행하십시오.
SELECT ST_TRANSFORM(geometry_expression, 32633);
기존 GEOMETRY 오브젝트에 원본 SRID가 올바르게 설정되지 않은 경우 원본 SRID를 추가 인자로 지정하십시오. 예를 들어, geometry_expression
이 SRID 4326을 사용하는 GEOMETRY 오브젝트이고 SRID 28992를 사용하도록 이를 변환하려는 경우 다음 문을 실행합니다.
SELECT ST_TRANSFORM(geometry_expression, 4326, 28992);
GEOMETRY 오브젝트가 SRS에 대해 올바른 좌표를 사용하지만 잘못된 SRID가 있는 경우 ST_SETSRID 함수를 호출하여 SRID를 수정할 수 있습니다. 예를 들어, 다음 문은 좌표를 변경하지 않은 상태에서 geometry_expression
의 SRID를 4326으로 설정합니다.
SELECT ST_SETSRID(geometry_expression, 4326);
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 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
$$;
Python UDF와 함께 지리 공간 데이터 사용하기¶
Python UDF는 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.8
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)
$$;
더 많은 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진수 표현 가져오기(그 반대도 마찬가지임).
H3의 SQL 함수가 아래에 나와 있습니다.
함수 |
설명 |
---|---|
H3 셀의 경계를 나타내는 GEOGRAPHY 오브젝트를 반환합니다. |
|
주어진 해상도에 대해 H3 셀의 하위 항목 INTEGER ID로 구성된 ARRAY를 반환합니다. |
|
주어진 해상도에 대해 H3 셀 하위 항목의 16진수 ID를 포함하는 VARCHAR로 구성된 ARRAY를 반환합니다. |
|
주어진 해상도에 대해 H3 셀의 상위 항목 ID를 반환합니다. |
|
H3 셀의 도심인 점을 나타내는 GEOGRAPHY 오브젝트를 반환합니다. |
|
(GEOGRAPHY 오브젝트로 지정된) 도형을 완전히 덮는 H3 셀의 최소 세트를 식별하는 ID(INTEGER 값)로 구성된 ARRAY를 반환합니다. |
|
(GEOGRAPHY 오브젝트로 지정된) 다각형을 완전히 덮는 H3 셀의 최소 세트를 식별하는 16진수 ID(VARCHAR 값)로 구성된 ARRAY를 반환합니다. |
|
H3 셀의 해상도를 반환합니다. |
|
두 H3 셀 사이의 그리드 거리를 반환합니다. |
|
지정된 H3 셀의 지정된 그리드 거리 내에 있는 H3 셀의 ID로 구성된 ARRAY를 반환합니다. |
|
두 H3 셀 사이의 선을 구성하는 H3 셀의 ID로 구성된 ARRAY를 반환합니다. |
|
H3 셀 ID의 INTEGER 값을 16진수 형식으로 변환합니다. |
|
주어진 위도, 경도, 해상도에 대해 H3 셀 ID의 INTEGER 값을 반환합니다. |
|
주어진 위도, 경도, 해상도에 대해 H3 셀 ID를 16진수 형식(VARCHAR)으로 반환합니다. |
|
주어진 해상도에서 (GEOGRAPHY 오브젝트로 지정된) 점에 대한 H3 셀 ID의 INTEGER 값을 반환합니다. |
|
주어진 해상도에서 (GEOGRAPHY 오브젝트로 지정된) 점에 대한 H3 셀 ID의 16진수 값을 반환합니다. |
|
(GEOGRAPHY 오브젝트로 지정된) 다각형에 도심이 포함되어 있는 H3 셀을 식별하는 INTEGER ID로 구성된 ARRAY를 반환합니다. |
|
(GEOGRAPHY 오브젝트로 지정된) 다각형에 도심이 포함되어 있는 H3 셀을 식별하는 VARCHAR ID로 구성된 ARRAY를 반환합니다. |
|
16진수 형식의 H3 셀 ID를 INTEGER 값으로 변환합니다. |
사용할 지리 공간 데이터 타입 선택하기(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 오브젝트를 SRID 가 0인 GEOMETRY 오브젝트로 변환합니다.
SELECT TO_GEOMETRY(TO_GEOGRAPHY('POINT(-122.306100 37.554162)'));
새로운 GEOMETRY 오브젝트의 SRID를 설정하려면 생성자 함수에 SRID를 인자로 전달하십시오. 예:
SELECT TO_GEOMETRY(TO_GEOGRAPHY('POINT(-122.306100 37.554162)', 4326));
기존 GEOMETRY 오브젝트의 SRID를 설정해야 하는 경우 GEOMETRY 오브젝트의 공간 참조 시스템(SRS) 및 SRID 변경하기 를 호출합니다.
유효하지 않은 지리 공간 도형을 처리하는 방법 지정하기¶
기본적으로 지리 공간 변환 함수 를 사용하여 지원되는 입력 형식의 데이터 를 GEOGRAPHY 또는 GEOMETRY 오브젝트로 변환할 때 이 함수는 다음을 수행합니다.
이 함수는 입력 데이터에서 도형의 유효성을 검사하려고 시도합니다.
이 함수는 도형이 Open Geospatial Consortium의 Simple Feature Access / Common Architecture 표준에 따라 유효한지 확인합니다.
도형이 유효하지 않은 경우 이 함수는 데이터 복구를 시도합니다(예: 환형 도형을 닫아 다각형 수정).
복구 후에도 여전히 도형이 유효하지 않은 경우 이 함수는 오류를 보고하고 GEOGRAPHY 또는 GEOMETRY 오브젝트를 생성하지 않습니다. (TRY_* 함수는 오류를 보고하는 대신 NULL을 반환합니다.)
이 기능을 사용하면 유효성 검사 및 복구 프로세스에 대해 더 많은 제어 권한을 갖게 됩니다. 다음을 할 수 있습니다.
이러한 변환 함수가 유효하지 않은 도형에 대해 GEOGRAPHY 및 GEOMETRY 오브젝트를 생성하도록 허용합니다.
GEOGRAPHY 또는 GEOMETRY 오브젝트의 도형이 유효하지 않은지 확인합니다.
유효하지 않은 도형이 지리 공간 함수에 미치는 영향 이해하기¶
유효하지 않은 도형에 대해 GEOGRAPHY 또는 GEOMETRY 오브젝트를 전달할 때 다양한 지리 공간 함수 가 제각기 다른 영향을 미칩니다.
GEOMETRY 오브젝트에 대한 영향¶
GEOMETRY 오브젝트:
다음 함수는 유효하지 않은 원래 도형을 기반으로 결과를 반환합니다.
다음 함수는 도형의 유효성을 검사하고 도형이 유효하지 않을 경우 오류와 함께 실패합니다.
GEOGRAPHY 오브젝트에 대한 영향¶
GEOGRAPHY 오브젝트:
다음 함수는 유효하지 않은 원래 도형을 기반으로 결과를 반환합니다.
다음 함수는 도형의 유효성을 검사하고 도형이 유효하지 않을 경우 오류와 함께 실패합니다.
다음 함수는 값을 계산할 수 없는 경우 NULL을 반환합니다.
유효하지 않은 도형 작업하기¶
다음 섹션에서는 함수가 유효하지 않은 도형을 생성하도록 허용하는 방법과 GEOGRAPHY 또는 GEOMETRY 오브젝트가 유효하지 않거나 복구된 도형을 나타내는지 여부를 확인하는 방법을 설명합니다.
변환 함수가 유효하지 않은 도형을 생성하도록 허용하기¶
다음 변환 함수가 유효하지 않은 지리 공간 오브젝트를 만들 수 있도록 허용하려면 두 번째 인자(allowInvalid
)에 대해 TRUE
를 전달하십시오.
TO_GEOGRAPHY( <input> [, <allowInvalid> ] )
ST_GEOGFROMWKB( <input> [, <allowInvalid> ] )
ST_GEOGFROMWKT( <input> [, <allowInvalid> ] )
TO_GEOMETRY( <input> [, <allowInvalid> ] )
ST_GEOMFROMWKB( <input> [, <allowInvalid> ] )
ST_GEOMFROMWKT( <input> [, <allowInvalid> ] )
기본적으로 allowInvalid
인자는 FALSE
입니다.
allowInvalid
인자에 대해 TRUE
를 전달하면 변환 함수는 입력 도형이 유효하지 않고 이를 성공적으로 복구할 수 없더라도 GEOGRAPHY 또는 GEOMETRY 오브젝트를 반환합니다.
예를 들어 다음 입력 도형은 동일한 두 점으로 구성된 LineString입니다. allowInvalid
인자에 대해 TRUE
를 전달하면 유효하지 않은 도형을 나타내는 GEOMETRY 오브젝트가 반환됩니다.
SELECT TO_GEOMETRY('LINESTRING(100 102,100 102)', TRUE);
도형이 유효하지 않은지 확인하기¶
GEOGRAPHY 또는 GEOMETRY 오브젝트가 유효하지 않은지 확인하려면 ST_ISVALID 함수를 호출하십시오.
다음 예제에서는 오브젝트가 유효한지 확인합니다.
SELECT TO_GEOMETRY('LINESTRING(100 102,100 102)', TRUE) AS g, ST_ISVALID(g);