t.ozawa / About Author
Tableau-ID Snowflake【Snowflake】5月公開の地理関数 ST_BUFFER を使ってみた
5月にSnowflakeにおいてジオ関数が追加されました。
Snowflakeが新しい地理空間のイノベーションをリリース
追加された関数の中でも商圏分析に使えそうな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は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を使う必要があります。
SELECT ST_Buffer(ST_GeometryFromText(ST_AsText(ST_MakePoint(0, 0))), 1);
ちなみに、上記のスクリプトを実行すると、ウェアハウスXSサイズで50秒かかります。
ウェアハウスを大きくすれば、計算速度が上がりそうですが、どうやらGeography型->文字型->Geometry型に変換する過程で時間がかかっているようです。
ST_BUFFERによる地理データのバッファ付けができることによって、Snowflakeのジオ分析の幅が広がりそうです。
また、Geometry型とGeography型との変換過程で、どうやら重たい計算を行っているらしいです。
時間が削減できるように引き続き調査を続けていきます。
それでは!