地理空間データ型¶
Snowflakeは、地球表面のポイント、ライン、ポリゴンなどの地理空間機能をネイティブでサポートしています。
Tip
検索最適化サービスを利用して、クエリのパフォーマンスを向上させることができます。詳細については、 検索最適化サービス をご参照ください。
このトピックの内容:
データ型¶
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 Binary (「WKB」)
拡張された WKT と WKB (EWKT と EWKB) ( EWKT と EWKB の取り扱いに関する注意 を参照)
次の参照資料には、関連項目が記載されています。
Open Geospatial Consortium's Simple Feature Access / Common Architecture and SQL Option:
これらの標準から逸脱する場合については、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) を含めることにより、 WKT および WKB 形式を拡張します。Snowflakeは現在、 SRID=4326にマップされる WGS84 のみをサポートしています。
デフォルトでは、 EWKB または EWKT 入力値に4326以外の SRID が含まれている場合、Snowflakeはエラーを発行します。逆に、すべての EWKB と EWKT 出力値には SRID=4326があります。
サポートされている地理空間オブジェクト型¶
GEOGRAPHY および GEOMETRY のデータ型は、次の型の地理空間オブジェクトを保存できます。
WKT / WKB / EWKT / EWKB / GeoJSON 地理空間オブジェクト:
ポイント
MultiPoint
LineString
MultiLineString
ポリゴン
MultiPolygon
GeometryCollection
これらの GeoJSON 固有の地理空間オブジェクト:
機能
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
記述子)を取得するための APIs は、 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 で異なる SRIDs を使用した場合の効果について¶
GEOMETRY 列には、異なる SRIDs を持つオブジェクトを挿入できます。列に複数の SRID が含まれている場合は、重要なパフォーマンス最適化の一部が適用されません。これにより、特に地理空間述語で結合する場合に、クエリが遅くなる可能性があります。
GEOMETRY オブジェクトの空間参照系(SRS)および SRID の変更¶
既存の GEOMETRY オブジェクトの SRS と SRID を変更するには、 ST_TRANSFORM 関数を呼び出し、新しい SRID を渡します。この関数は、SRS を使用するために変換された新しい SRID と座標を持つ、新しい 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) を参照)。
GEOGRAPHY 値の GeoJSON の取り扱いに関する注意 もご参照ください。
他のファイル形式(Parquet、 ORC など)からのデータのロードは、 COPY 変換を介して可能です。
Java UDFs での地理空間データの使用¶
Java UDFs は、 GEOGRAPHY 型を引数および戻り値として許可します。詳細については SQL-Javaデータ型マッピング および GEOGRAPHY 値のインラインJava UDF への引き渡し をご参照ください。
JavaScript UDFs での地理空間データの使用¶
JavaScript UDFs は、 GEOGRAPHY または GEOMETRY 型を引数および戻り値として許可します。
JavaScript UDF に型 GEOGRAPHY または GEOMETRY の引数がある場合、その引数は UDF 本体内で JSON オブジェクトとして GeoJSON 形式で表示されます。
JavaScript UDF が GEOGRAPHY または GEOMETRY を返す場合、 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
$$;
Python UDFs での地理空間データの使用¶
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.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 UDFs のさらなるサンプルについては、 Snowflakeラボ をご確認ください。中には、複雑な空間操作を可能にしたり、データのインジェスチョンを簡素化したりするものもあります。たとえば、 この UDF は、シェープファイル(.SHP)、 TAB、 KML、 GPKG など、ネイティブでサポートされていない形式を読み込むことができます。
注釈
Snowflakeラボのコードサンプルは、参照および教育のみを目的としています。これらのコードサンプルは、いかなるサービスレベル契約の対象にもなりません。
H3での GEOGRAPHY オブジェクトの使用¶
H3 は 階層的な地理空間インデックス で、世界を 離散的なグローバルグリッドシステム の六角形のセルに分割します。
Snowflakeには SQL 関数が用意されており、 GEOGRAPHY オブジェクトでH3を使用できます。これらの関数は次のように使用できます。
ポイントを表す GEOGRAPHY オブジェクトのH3セル ID (インデックス)を取得します(逆も同様)。
オブジェクト GEOGRAPHY をカバーするH3セルの最小セットの IDs を取得します。
ポリゴンを表す GEOGRAPHY オブジェクト内に重心を持つH3セルの IDs を取得します。
H3セルの境界を表す GEOGRAPHY オブジェクトを取得します。
特定のH3セルの親と子を取得します。
H3セルの重心の経度と緯度を取得します(逆も同様)。
H3セルの 解像度 を取得します。
H3セル ID の16進数表現を取得します(逆も同様)。
H3の SQL 関数を以下に示します。
関数 |
説明 |
---|---|
H3セルの境界を表す GEOGRAPHY オブジェクトを返します。 |
|
特定の解像度のH3セルの子の INTEGER IDs の ARRAY を返します。 |
|
特定の解像度のH3セルの子の16進数 IDs を含む VARCHARs の ARRAY を返します。 |
|
特定の解像度のH3セルの親の ID を返します。 |
|
H3セルの重心であるポイントを表す GEOGRAPHY オブジェクトを返します。 |
|
形状を完全にカバーするH3セルの最小集合を識別する IDs の ARRAY を( INTEGER 値として)返します( GEOGRAPHY オブジェクトで指定)。 |
|
ポリゴンを完全にカバーするH3セルの最小集合を識別する16進数の IDs の ARRAY を( VARCHAR 値として)返します( GEOGRAPHY オブジェクトで指定)。 |
|
H3セルの解像度を返します。 |
|
2つのH3セル間のグリッド距離を返します。 |
|
指定されたH3セルの指定されたグリッド距離内にあるH3セルの IDs の ARRAY を返します。 |
|
2つのH3セル間の線を構成するH3セルの IDs の ARRAY を返します。 |
|
H3セル ID の INTEGER 値を16進数形式に変換します。 |
|
特定の緯度、経度、解像度に対するH3セル ID の INTEGER 値を返します。 |
|
特定の緯度、経度、解像度のH3セル ID を16進数形式で返します( VARCHAR として)。 |
|
特定の解像度におけるポイント( GEOGRAPHY オブジェクトで指定された)のH3セル ID の INTEGER 値を返します。 |
|
特定の解像度におけるポイント( GEOGRAPHY オブジェクトで指定された)のH3セル ID の16進値を返します。 |
|
ポリゴン( GEOGRAPHY オブジェクトで指定された)に含まれる重心を持つH3セルを識別する ARRAY の INTEGER IDs を返します。 |
|
ポリゴン( GEOGRAPHY オブジェクトで指定された)に含まれる重心を持つH3セルを識別する ARRAY の VARCHAR IDs を返します。 |
|
H3セル ID を16進数形式で 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,182 km。)
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,379 km^2。)
GEOMETRY 入力値の場合、入力座標は度単位で、出力値は平方度単位です。(結果は45.930平方度。)
例3: ベルリンからサンフランシスコまでの線に重なる国名のクエリ¶
次のテーブルは、 GEOGRAPHY 型と GEOMETRY 型の ST_INTERSECTS の出力を比較しています。
入力データ検証の違いについて¶
入力形状の GEOMETRY または GEOGRAPHY オブジェクトを作成するには、 `Simple Featuresの 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 オブジェクトが無効な形状または修復された形状を表しているかどうかを判断する方法について説明します。
変換関数が無効な形状を作成できるようにする¶
次の変換関数が無効な地理空間オブジェクトを作成できるようにするには、2番目の引数(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 オブジェクトを返します。
たとえば、次の入力形状は、同じ2つのポイントで構成される 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);