地理空間データ型

Snowflakeは、地球表面のポイント、ライン、ポリゴンなどの地理空間機能をネイティブでサポートしています。

このトピックの内容:

GEOGRAPHY データ型

Snowflakeは、地球を完全な球体であるかのようにモデル化する GEOGRAPHY データ型を提供します。

GEOGRAPHY データ型は WGS 84標準に従います(空間参照 ID 4326。詳細については、https://spatialreference.org/ref/epsg/wgs-84/を参照)。

地球上のポイントは、経度(-180度から+180度)および緯度(-90から+90)で表されます。

高度は現在サポートされていません。

線分は、地球表面の測地弧として解釈されます。

Snowflakeは、 GEOGRAPHY データ型を操作する 地理空間関数 も提供します。

地理空間の入力形式および出力形式

GEOGRAPHY データ型の入力形式と出力形式、および地理空間関数名とセマンティクスは、業界標準に準拠しています。サポートされている入力形式と出力形式は次のとおりです。

次の参照資料には、関連項目が記載されています。

これらの標準から逸脱する場合については、Snowflakeのドキュメントに明記されています。

GeoJSON の取り扱いに関する注意

WKT および WKB 標準では、形式のみを指定します。WKT/WKB オブジェクトのセマンティクスは、参照システム(平面や球など)に依存します。

一方、 GeoJSON 標準では、形式とそのセマンティクスの両方を指定します。GeoJSON ポイントは明示的に WGS 84座標であり、 GeoJSON 線分は平面エッジ(直線)であると想定されています。

それとは対照的に、Snowflake GEOGRAPHY データ型は、 GeoJSON 形式の入力または出力を含むすべての線分を測地弧として解釈します。本質的に、Snowflakeは GeoJSON を球形のセマンティクスを持つ JSON 形式の WKT として扱います。

EWKT と EWKB の取り扱いに関する注意

EWKT と EWKB は非標準のフォーマットであり、 PostGIS によって導入されます。これらは、データで使用する座標参照系を指定する 空間参照系識別子(SRID) を含めることにより、 WKT および WKB 形式を拡張します。Snowflakeは現在、 SRID=4326にマップされる WGS84 のみをサポートしています。

デフォルトでは、 EWKB または EWKT 入力値に4326以外の SRID が含まれている場合、Snowflakeはエラーを発行します。逆に、すべての EWKB と EWKT 出力値には SRID=4326があります。

地理空間オブジェクト型

GEOGRAPHY データ型は、次のタイプの地理空間オブジェクトを保存できます。

  • WKT / WKB / EWKT / EWKB / GeoJSON 地理空間オブジェクト:

    • ポイント

    • MultiPoint

    • LineString

    • MultiLineString

    • ポリゴン

    • MultiPolygon

    • GeometryCollection

  • これらの GeoJSON 固有の地理空間オブジェクト:

    • 機能

    • FeatureCollection

入出力

このセクションでは、地理空間データの入力と出力について詳しく説明します。

GEOGRAPHY 列での DML 操作

GEOGRAPHY 列が DML 操作のターゲットである場合(INSERT、 COPY、 UPDATE、 MERGE、または CREATE TABLE AS ...)、列のソース式は、次の型のいずれかです。

  • GEOGRAPHY :型 GEOGRAPHY の式は通常、解析関数、コンストラクター関数、または既存の GEOGRAPHY 列の結果です。サポートされている関数と関数のカテゴリの包括的なリストについては、 地理空間関数 をご参照ください。

  • VARCHAR : WKT、 WKB (16進数形式)、 EWKT、 EWKB (16進数形式)、または GeoJSON 形式の文字列として解釈されます( TO_GEOGRAPHY (VARCHAR) を参照)。

  • BINARY : WKB バイナリとして解釈されます( TO_GEOGRAPHY(BINARY) を参照)。

  • VARIANT : GeoJSON オブジェクトとして解釈されます( TO_GEOGRAPHY(VARIANT) を参照)。

GEOGRAPHY_OUTPUT_FORMAT :結果セットの GEOGRAPHY。

セッションパラメーター GEOGRAPHY_OUTPUT_FORMAT は、結果セット内にある GEOGRAPHY 型の列のレンダリングを制御します。

GEOGRAPHY_OUTPUT_FORMAT パラメーターは、次のいずれかの値を指定できます。

パラメーター値

説明

GeoJSON (デフォルト)

GEOGRAPHY の結果は、 GeoJSON 形式の OBJECT としてレンダリングされます。

WKT

GEOGRAPHY の結果は、 WKT 形式の VARCHAR としてレンダリングされます。

WKB

GEOGRAPHY の結果は、 WKB 形式の BINARY としてレンダリングされます。

EWKT

GEOGRAPHY の結果は、 EWKT 形式の VARCHAR としてレンダリングされます。

EWKB

GEOGRAPHY の結果は、 EWKB 形式の BINARY としてレンダリングされます。

EWKT および EWKB の場合、出力では SRID は常に4326です。 EWKT および EWKB の取り扱いに関する注意 をご参照ください。

このパラメーターは、Snowflake UI と SnowSQL コマンドラインクライアント、および JDBC、 ODBC、node.js、pythonなどのドライバーとコネクタを含むすべてのクライアントに影響します。

例: JDBC クライアントでは、 GEOGRAPHY 型の結果列(たとえば、列 i)のメタデータは次のようになります。

  • GEOGRAPHY_OUTPUT_FORMAT='GeoJSON' の場合、

    • ResultSetMetaData.getColumnTypeName(i) は「OBJECT」を返します。

    • ResultSetMetaData.getColumnClassName(i) は「java.lang.String」を返します。

  • GEOGRAPHY_OUTPUT_FORMAT='WKT' または 'EWKT' の場合、

    • ResultSetMetaData.getColumnTypeName(i) は「VARCHAR」を返します。

    • ResultSetMetaData.getColumnClassName(i) は「java.lang.String」を返します。

  • GEOGRAPHY_OUTPUT_FORMAT='WKB' または 'EWKB' の場合、

    • ResultSetMetaData.getColumnTypeName(i) は「BINARY」を返します。

    • ResultSetMetaData.getColumnClassName(i) は 「[B」(バイトの配列)を返します。

ODBC ドライバーなどの他のクライアントについても同様の情報が返されます。

ステージのサポート

ステージ内の CSV または JSON / AVRO ファイルからのデータは、直接(つまり、コピー変換なしで) GEOGRAPHY 列にロードできます。

他のファイル形式(Parquet、 ORC など)からのデータのロードは、 COPY 変換を介して可能です。

JavaScript UDFs へのサポート

JavaScript UDFs GEOGRAPHY 型を引数および戻り値として許可します。

JavaScript UDF に型 GEOGRAPHY の引数がある場合、その引数は UDF 本体内で JSON オブジェクトとして GeoJSON 形式で表示されます。

JavaScript UDF が GEOGRAPHY を返す場合、 UDF 本体は JSON オブジェクトを GeoJSON 形式で返すことが期待されています。

たとえば、次の2つの 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 データ型のサンプルの入力と出力を示しています。WKB および EWKB 出力では、 BINARY_OUTPUT_FORMAT パラメーターが HEX (パラメーターのデフォルト値)に設定されていると想定されています。

create table geospatial_table (g GEOGRAPHY);
insert into geospatial_table values
    ('POINT(-122.35 37.55)'), ('LINESTRING(-124.20 42.00, -120.01 41.99)');
alter session set GEOGRAPHY_OUTPUT_FORMAT='GeoJSON';
select g
    from geospatial_table;
+------------------------+
| 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;
+-------------------------------------+
| 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;
+------------------------------------------------------------------------------------+
| G                                                                                  |
|------------------------------------------------------------------------------------|
| 01010000006666666666965EC06666666666C64240                                         |
| 010200000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 |
+------------------------------------------------------------------------------------+
alter session set GEOGRAPHY_OUTPUT_FORMAT='EWKT';
select g
    from geospatial_table;
+-----------------------------------------------+
| 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;
+--------------------------------------------------------------------------------------------+
| G                                                                                          |
|--------------------------------------------------------------------------------------------|
| 0101000020E61000006666666666965EC06666666666C64240                                         |
| 0102000020E610000002000000CDCCCCCCCC0C5FC00000000000004540713D0AD7A3005EC01F85EB51B8FE4440 |
+--------------------------------------------------------------------------------------------+