TO_GEOMETRY

TO_GEOMETRY

TO_GEOMETRY는 입력을 파싱해 GEOMETRY 타입의 값을 반환하는 변환 함수예요. WKT, WKB, EWKT, EWKB, GeoJSON 같은 지리 공간 표현을 GEOMETRY 객체로 바꿀 때 사용해요.

출처: Snowflake SQL Reference

본문

카테고리: 지리 공간 함수, 변환 함수

구문 (Syntax)

다음 중 하나를 사용해요:

TO_GEOMETRY( <varchar_expression> [ , <srid> ] [ , <allow_invalid> ] )

TO_GEOMETRY( <binary_expression> [ , <srid> ] [ , <allow_invalid> ] )

TO_GEOMETRY( <variant_expression> [ , <srid> ] [ , <allow_invalid> ] )

TO_GEOMETRY( <geography_expression> [ , <srid> ] [ , <allow_invalid> ] )

인자 (Arguments)

필수:

<varchar_expression> — 다음 형식 중 하나로 유효한 기하 객체를 나타내는 문자열 표현식이어야 해요:

  • WKT(well-known text)
  • WKB(well-known binary), 16진수 형식(앞에 0x 없음)
  • EWKT(extended well-known text)
  • EWKB(extended well-known binary), 16진수 형식(앞에 0x 없음)
  • GeoJSON

<binary_expression> — WKB 또는 EWKB 형식의 이진 표현식이어야 해요.

<variant_expression> — GeoJSON 형식의 OBJECT여야 해요.

<geography_expression> — GEOGRAPHY 타입의 표현식이어야 해요.

선택:

<srid> — 사용할 SRID의 정수 값이에요.

<allow_invalid> — TRUE이면 입력 모양이 유효하지 않고 복구할 수 없어도 GEOGRAPHY 또는 GEOMETRY 객체를 반환하도록 지정해요. 자세한 내용은 유효하지 않은 지리 공간 모양 처리 방법 지정을 참고해요.

반환값 (Returns)

GEOMETRY 타입의 값을 반환해요.

사용 시 유의사항 (Usage notes)

  • 입력이 지원되는 형식(WKT, WKB, EWKT, EWKB, GeoJSON) 중 하나로 파싱될 수 없으면 오류를 발생시켜요.
  • GeoJSON, WKT, WKB 입력에서 srid 인자를 지정하지 않으면 결과 GEOMETRY 객체의 SRID는 0으로 설정돼요.
  • WKT 또는 EWKT 입력에서 GEOMETRY 객체를 만들려면 ST_GEOMETRYFROMWKT도 사용할 수 있어요.
  • WKB 또는 EWKB 입력에서 GEOMETRY 객체를 만들려면 ST_GEOMETRYFROMWKB도 사용할 수 있어요.

예시 (Examples)

다음 예시는 WKT로 표현된 객체를 TO_GEOMETRY 함수로 GEOMETRY 객체로 변환하는 방법을 보여줘요. 예시는 srid 인자를 지정하지 않고, 객체의 입력 표현에도 SRID가 지정되어 있지 않으므로 SRID는 0으로 설정돼요.

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT TO_GEOMETRY('POINT(1820.12 890.56)');
+--------------------------------------+
| TO_GEOMETRY('POINT(1820.12 890.56)') |
|--------------------------------------|
| SRID=0;POINT(1820.12 890.56)         |
+--------------------------------------+

다음 예시는 EWKT로 표현된 객체를 GEOMETRY 객체로 변환해요. 입력 EWKT는 사용할 SRID를 지정해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT TO_GEOMETRY('SRID=4326;POINT(1820.12 890.56)');
+------------------------------------------------+
| TO_GEOMETRY('SRID=4326;POINT(1820.12 890.56)') |
|------------------------------------------------|
| SRID=4326;POINT(1820.12 890.56)                |
+------------------------------------------------+

다음 예시는 SRID를 srid 입력 인자로 지정하는 방법을 보여줘요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT TO_GEOMETRY('POINT(1820.12 890.56)', 4326);
+--------------------------------------------+
| TO_GEOMETRY('POINT(1820.12 890.56)', 4326) |
|--------------------------------------------|
| SRID=4326;POINT(1820.12 890.56)            |
+--------------------------------------------+

다음 예시는 EWKT 형식으로 설명된 Z 좌표가 있는 지리 공간 객체에 대한 GEOMETRY 객체를 반환해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT TO_GEOMETRY('SRID=32633;POINTZ(389866.35 5819003.03 30)');
+-----------------------------------------------------------+
| TO_GEOMETRY('SRID=32633;POINTZ(389866.35 5819003.03 30)') |
|-----------------------------------------------------------|
| SRID=32633;POINTZ(389866.35 5819003.03 30)                |
+-----------------------------------------------------------+

GEOGRAPHY 객체를 GEOMETRY 객체로 변환하는 예시는 GEOGRAPHY와 GEOMETRY 간 변환을 참고해요.

다음 예시들은 테이블의 데이터에 대한 쿼리에서 TO_GEOMETRY 함수를 사용해요. GEOMETRY 값이 있는 행으로 임시 테이블을 만들어요:

CREATE OR REPLACE TEMP TABLE demo_to_geometry AS
SELECT
  1                                                     AS id,
  'POINT(10 20)'                                        AS wkt_col,         -- VARCHAR (WKT)
  'SRID=32633;POINT(500000.0 4649776.22)'               AS ewkt_col,        -- VARCHAR (EWKT)
  ST_ASWKB(TO_GEOMETRY('LINESTRING(0 0, 1 1)'))         AS wkb_bin_col,     -- BINARY (WKB)
  PARSE_JSON('{"type":"Point","coordinates":[10,20]}')  AS geojson_col,     -- VARIANT (GeoJSON)
  TO_GEOGRAPHY('POINT(-122.35 37.55)')                  AS geog_col,        -- GEOGRAPHY
  'POLYGON((0 0,2 2,2 0,0 2,0 0))'                      AS invalid_wkt_col, -- invalid shape
  0                                                     AS srid0,           -- SRID columns to show positional args
  3857                                                  AS srid_col,
  TRUE                                                  AS allow_true,      -- allow_invalid flags from columns
  FALSE                                                 AS allow_false
UNION ALL
SELECT
  2,
  'LINESTRING(0 0, 10 10)',
  'SRID=32633;POINT(389866.35 5819003.03)',
  ST_ASWKB(TO_GEOMETRY('POINT(2 3)')),
  PARSE_JSON('{"type":"LineString","coordinates":[[0,0],[1,1]]}'),
  TO_GEOGRAPHY('LINESTRING(-124.2 42,-120.01 41.99)'),
  'POLYGON((0 0,1 1,1 0,0 1,0 0))',
  0,
  3857,
  TRUE,
  FALSE;

이 테이블은 TO_GEOMETRY 함수가 다음 형식으로 입력으로 받아들이는 데이터 타입의 열을 가져요:

  • VARCHAR (WKT/WKB 및 16진수/EWKT/EWKB/GeoJSON)
  • BINARY (WKB/EWKB)
  • VARIANT (GeoJSON 객체)
  • GEOGRAPHY

선택적 srid와 allow_invalid 값은 이 형식 중 어떤 것 뒤에든 올 수 있어요. St_Aswkb 함수는 유효한 WKB BINARY 값을 생성해요.

다음 예시는 wkt_col 열의 VARCHAR 값을 기본 SRID 0을 사용해 GEOMETRY 값으로 변환해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT id, TO_GEOMETRY(wkt_col) AS g
  FROM demo_to_geometry;
+----+------------------------------+
| ID | G                            |
|----+------------------------------|
|  1 | SRID=0;POINT(10 20)          |
|  2 | SRID=0;LINESTRING(0 0,10 10) |
+----+------------------------------+

다음 예시는 wkt_col 열의 VARCHAR 값을 srid_col 열의 SRID 값을 사용해 GEOMETRY 값으로 변환해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT id, TO_GEOMETRY(wkt_col, srid_col) AS g
  FROM demo_to_geometry;
+----+----------------------------------+
| ID | G                                |
|----+----------------------------------|
|  1 | SRID=3857;POINT(10 20)           |
|  2 | SRID=3857;LINESTRING(0 0,10 10)  |
+----+----------------------------------+

다음 예시는 ewkt_col 열의 VARCHAR 값을, ewkt_col 열 값에 포함된 SRID 값을 사용해 GEOMETRY 값으로 변환해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT id, TO_GEOMETRY(ewkt_col) AS g
  FROM demo_to_geometry;
+----+--------------------------------------------+
| ID | G                                          |
|----+--------------------------------------------|
|  1 | SRID=32633;POINT(500000 4649776.22)        |
|  2 | SRID=32633;POINT(389866.35 5819003.03)     |
+----+--------------------------------------------+

다음 예시는 wkb_bin_col 열의 BINARY 값을 GEOMETRY 값으로 변환해요:

ALTER SESSION SET BINARY_OUTPUT_FORMAT='HEX';

SELECT id, TO_GEOMETRY(wkb_bin_col) AS g
  FROM demo_to_geometry;
+----+----------------------------+
| ID | G                          |
|----+----------------------------|
|  1 | SRID=0;LINESTRING(0 0,1 1) |
|  2 | SRID=0;POINT(2 3)          |
+----+----------------------------+

다음 예시는 geojson_col 열의 VARIANT 값을 srid_col 열의 SRID 값을 사용해 GEOMETRY 값으로 변환해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT id, TO_GEOMETRY(geojson_col, srid_col) AS g
  FROM demo_to_geometry;
+----+--------------------------------+
| ID | G                              |
|----+--------------------------------|
|  1 | SRID=3857;POINT(10 20)         |
|  2 | SRID=3857;LINESTRING(0 0,1 1)  |
+----+--------------------------------+

다음 예시는 geog_col 열의 GEOGRAPHY 값을 srid_col 열의 SRID 값을 사용해 GEOMETRY 값으로 변환해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT id, TO_GEOMETRY(geog_col, srid_col) AS g
  FROM demo_to_geometry;
+----+-----------------------------------------------+
| ID | G                                             |
|----+-----------------------------------------------|
|  1 | SRID=4326;POINT(-122.35 37.55)                |
|  2 | SRID=4326;LINESTRING(-124.2 42,-120.01 41.99) |
+----+-----------------------------------------------+

다음 예시는 invalid_wkt_col 열의 VARCHAR 값을 srid0 열의 SRID 값(0)과 allow_true 열의 allow_invalid 값을 사용해 GEOMETRY 값으로 변환해요:

ALTER SESSION SET GEOMETRY_OUTPUT_FORMAT='EWKT';

SELECT id, TO_GEOMETRY(invalid_wkt_col, srid0, allow_true) AS g
  FROM demo_to_geometry;

출력에는 유효하지 않은 모양도 포함돼요:

+----+---------------------------------------+
| ID | G                                     |
|----+---------------------------------------|
|  1 | SRID=0;POLYGON((0 0,2 2,2 0,0 2,0 0)) |
|  2 | SRID=0;POLYGON((0 0,1 1,1 0,0 1,0 0)) |
+----+---------------------------------------+

더 알아보기