CARTO Analytics Toolbox for Snowflakeを使ってみよう


この記事は[Snowflake Advent Calendar 2023](https://qiita.com/advent-calendar/2023/snowflake)シリーズ2の9日目です。  
みんなでアドベントカレンダーを埋め尽くそうぜ！  

## はじめに

ここ1年くらいのSnowflakeは地理空間データの扱いがものすごいスピードで改良されているのですが、20年以上の歴史のあるPostGISと比べるとまだまだ足りない機能があります。  
…という話をSnowVillageでしていたら「足りない関数はCARTO Analytics Toolboxにあったりするので、そっちも見るとハッピーになれるかと」というコメントが。  
なにそれ知らない、ハッピーになりたい！試してみましょう。  

## 使い方

CARTO Analytics Toolboxには2つのバージョンがあります。CARTOのアカウントなしで利用できる基本的なものがCARTO Analytics Toolbox Coreです。  
これはSnowflake上の[Marketplace](https://app.snowflake.com/marketplace/listing/GZT0Z4CM1E9FM/carto-carto-analytics-toolbox-core)でNative Appとして公開されていて、無料で使用することができます。  

https://app.snowflake.com/marketplace/listing/GZT0Z4CM1E9FM/carto-carto-analytics-toolbox-core

![Marketplace](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/ca7114bb-c31b-1c94-d698-5ddf89ed75fe.png)

```取得```ボタンを押すことでNative Appを自分のアカウントにインストールできます。  
```Application名```はワークシートなどからCARTOの関数にアクセスするときに使うアプリケーション名、
```インストールに使用したウェアハウス```はインストール中に使うウェアハウスです。  

![Get Native App](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/b630f674-a538-7aac-de2a-85da49bec5ed.png)

1分ほどでインストールできました。  

![Complete to Get Native App](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/0d7277c7-3229-ba08-b5b5-752efe496e27.png)

以降はワークシートからCARTOの関数を呼び出すことができます。  
アプリケーション名がデフォルトのままであれば、例えば以下のように呼び出せます。  

```sql
SELECT CARTO_ANALYTICS_TOOLBOX_CORE.CARTO.VERSION_CORE();
```

## 試してみよう

ではワークシートからCARTOの関数を呼び出してみましょう。  
例えば東京からサンフランシスコまでの[大圏コース](https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%9C%8F%E3%82%B3%E3%83%BC%E3%82%B9)を調べてみましょう。サンフランシスコに行きたいかー！  

APIリファレンスは[こちら](https://docs.carto.com/data-and-analysis/analytics-toolbox-for-bigquery/sql-reference/transformations#st_greatcircle)です。  

https://docs.carto.com/data-and-analysis/analytics-toolbox-for-bigquery/sql-reference/transformations#st_greatcircle

```sql
-- 東京とサンフランシスコの緯度・経度を定義してGEOGRAPHY型に変換
WITH tokyo AS (SELECT TO_GEOGRAPHY('POINT(139.6917337 35.6895014)') as geog),
     sanfrancisco AS (SELECT TO_GEOGRAPHY('POINT(-122.4192524 37.7794658)') as geog)
-- 大圏コースを計算。50個の点で近似
SELECT CARTO_ANALYTICS_TOOLBOX_CORE.CARTO.ST_GREATCIRCLE(tokyo.geog, sanfrancisco.geog, 50) AS geog
FROM tokyo, sanfrancisco;
```

JSON形式で出力されました。ただ、数字を見ても正しいか分かりませんね…  

![Result on Snowsight](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/80e36c5f-1a3d-0203-183d-fc96ae5d71e6.png)

[OpenStreetMap WKT Playground](https://clydedacruz.github.io/openstreetmap-wkt-playground/)というサイトで地理空間データの可視化ができるのですが、入力フォーマットがWKT形式に限定されています。  
WKT形式で出力されるように設定して再実行してみましょう。  

```sql
-- 出力フォーマットをWKT形式に設定する
ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT='WKT';
-- 東京とサンフランシスコの緯度・経度を定義してGEOGRAPHY型に変換
WITH tokyo AS (SELECT TO_GEOGRAPHY('POINT(139.6917337 35.6895014)') as geog),
     sanfrancisco AS (SELECT TO_GEOGRAPHY('POINT(-122.4192524 37.7794658)') as geog)
-- 大圏コースを計算。50個の点で近似
SELECT CARTO_ANALYTICS_TOOLBOX_CORE.CARTO.ST_GREATCIRCLE(tokyo.geog, sanfrancisco.geog, 50) AS geog
FROM tokyo, sanfrancisco;
```

出力された結果をコピペすれば、大圏コースを確認することができました！

![Result on OpenStreetMap](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917580/cb3bb6f6-384d-ed6e-c70c-cc6b79a033ea.png)

## おわりに

CARTO Analytics Toolboxには色んな関数があるので地理空間データで遊ぶのが捗りますね！  
そしてNative AppによるSnowflakeの機能拡張、簡単なのにポテンシャルがすごい。