【Snowflake】5月公開の地理関数 ST_BUFFER を使ってみた

【Snowflake】5月公開の地理関数 ST_BUFFER を使ってみた | Tableau-id Press -タブロイド-
snowflake_logo

5月にSnowflakeにおいてジオ関数が追加されました。

Snowflakeが新しい地理空間のイノベーションをリリース

追加された関数の中でも商圏分析に使えそうなST_Buffer関数に非常に注目しています。

今回はST_Bufferを使って地理データ(ポイントやポリライン)にバッファを付けてみた例や、躓いた点を共有します。

ST_BUFFERって何?

ST_Bufferは、Geometry型カラムのポイントやポリライン、ポリゴンに対して、指定したバッファ距離の周囲を領域として出力する関数です。

例えば、あるポイントAの半径1kmの商圏を求めることができます。

次のSQLでは、ポイントA (0,0)の周囲1kmの領域を求めています。

第2引数のバッファ距離の単位は緯度経度1度であり、日本において1kmに相当するのは約0.01度です。

SELECT ST_BUFFER(ST_GeometryFromText(ST_AsText(ST_MakePoint(0, 0))), 0.01);
					

また、次のSQLのように、鉄道の沿線をはじめとしたポリラインの周囲1kmの範囲を求めることも可能です。

SELECT ST_Buffer(To_Geometry('LINESTRING(0 0, 0.01 0, 0.02 0.01)'), 0.01) as POLYGON_1KM_AROUND_A; 

ちなみに、上記のスクリプトを実行した場合、ウェアハウスサイズXSで計算時間はおよそ2秒です。

ST_BUFFERの躓いた点

ST_BUFFERはGeography型では使えない…

ST_BufferはGeometry型でないと使えません。

ST_Makepintで作成したGeography型のポイントをST_Bufferに入れると…

select st_buffer(st_makepoint(0, 0), 1);

// Invalid argument types for function 'ST_BUFFER': (GEOGRAPHY, NUMBER(1,0))

Geography型を使うな~と怒られます。

Geography型を使用する場合はGeometry型に変換する必要があります。

対策法

以下のSQLのように、Geography型からGeometry型に変換してからST_BUFFERを使う必要があります。

  1. ST_AsTextによって、Geography型から文字型に変換
  2. ST_GeometryFromTextによって、文字型からGeometry型に変換
  3. ST_BUFFERを実行
SELECT ST_Buffer(ST_GeometryFromText(ST_AsText(ST_MakePoint(0, 0))), 1);

ちなみに、上記のスクリプトを実行すると、ウェアハウスXSサイズで50秒かかります。

ウェアハウスを大きくすれば、計算速度が上がりそうですが、どうやらGeography型->文字型->Geometry型に変換する過程で時間がかかっているようです。

おわりに

ST_BUFFERによる地理データのバッファ付けができることによって、Snowflakeのジオ分析の幅が広がりそうです。

また、Geometry型とGeography型との変換過程で、どうやら重たい計算を行っているらしいです。

時間が削減できるように引き続き調査を続けていきます。

それでは!