Upgrade to Pro — share decks privately, control downloads, hide ads and more …

第9回Snowflake Rookies Camp

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

第9回Snowflake Rookies Camp

今回のテーマは「地図のデータをSnowflakeに取り込んで、地図として表示してみよう」です。
難しそうに聞こえるかもしれませんが、やることは大きく3つだけです。
①地図のデータ(ファイル)をSnowflakeに置く、
②それを地図として扱える形(GEOGRAPHY型)に変換する、
③BIツールで地図に表示する。
今日の題材はイタリアの鉄道路線のデータです。「線」がたくさん入ったデータを使います。

Avatar for Snowflake Rookies Camp

Snowflake Rookies Camp

August 28, 2026

More Decks by Snowflake Rookies Camp

Other Decks in Technology

Transcript

  1. Snowflakeとは? 『AI Data Cloud』として、 DWHの機能に加え以下の 機能を有しています。 (一部抜粋) ・Snowpipe - 自動データロード

    ・Data Sharing - データ共有 ・Cortex AI 出典:Snowflakeとは?何がすごいの?~アーキテクチャと特長をわかりやすく解説!~ - 機械学習プラットフォーム https://www.ashisuto.co.jp/db_blog/article/what-snowflake.html ・Snowpark - PythonやJava、Scalaの開発 および実行基盤
  2. 特に重要なアーキテクチャ Snowflakeの機能を理解する にあたって大切な3層です。 この場では、簡潔にご説明し ます。 出典:FORM S-1 Snowflake Inc. p.84

    https://docs.snowflake.com/ja/user-guide/intro-key-concepts ・クラウドサービス層 - 認証、権限制御、クエリ最適化、 メタデータ管理など ・コンピュート層(クエリ処理層) - 仮想ウェアハウスで処理毎に 処理を実施 ・ストレージ層 - 物理データを列志向で格納 - マイクロパーティションで分割
  3. FROSTYFRIDAYとは Frosty_Fridayとは 1.金曜日に更新されるSnowflakeのスキルアップ ウィークリーチャレンジです 2.レベルは Easy Basic Intermediate Hard ※この勉強会ではEasyかBasicのみ

    3.回答は(公式には)ありません! ※先人たちの回答はGitHubにあります Snowflakeの機能を学びつつTipsが学べます! https://www.frostyfri.day/ 解説動画があります Snowvillage(Snowflakeのコミュニティー) でご活躍中の tomoさん がくさん あれさん がSnowflakeを得意とするゲストを招いて 隔週で解説動画をYouTubeにUPしてくれています。 わからなければこの解説動画を見ながら学べます! https://www.youtube.com/watch? v=0T8P_bw6GgE&list =PLVj4iIZgzTAq2FzaBB gqFOtZaJTcoG3JR
  4. 今日学ぶこと 1. 入れて・作る 2. 測る・分析する 3. 地図に可視化 地理空間データ(緯度・ FLATTENで1行ずつに展 BIツールを使い、分析し

    経度)とは何かを学び、 開し、TO_GEOGRAPHY たSQLの結果を実際の地 GEOGRAPHY型と でGEOGRAPHY型のテー 図上にプロットして確認 ST_MAKEPOINT等の基本 ブルに変換します。 します。 関数で「点」を作りま す。
  5. そもそも地理空間データとは? 緯度 (latitude): 南北を表す (-90 〜 90)。 経度 (longitude): 東西を表す

    (-180 〜 180)。 この2つの組み合わせで地球上の「1点」を特定します。 データの形には以下の種類があります: ・点(ポイント)= 店舗、顧客 ・線(ライン)= 道路、ルート ・面(ポリゴン)= エリア、市区町村 ※今回のハンズオンでは主に「線(鉄道路線) 」を扱います。
  6. GEOGRAPHY型とは Snowflakeが用意している「地球の座標」を入れる専用の型です。 地球を丸い球として扱う GEOMETRY型との違い GEOGRAPHYは地球を球体とみなして 似た型に「GEOMETRY」があります 扱う型です(座標系はWGS84 / SRID が、こちらは平面(地図を平らな紙と

    4326) 。ただの数値ではなく「地理的な みなす)を前提としています。緯度経 点」として保存されるため、正確な距 度の実データを扱う場合は、基本的に 離計算などの空間関数が使えます。 GEOGRAPHYを使うと覚えておけば OKです。
  7. データの表し方 地理空間データは、文字(WKT)かJSON(GeoJSON)で表します。 WKT(Well-Known Text) :人が読める文字列。 例 POINT(経度緯度) / LINESTRING(経度 緯度,

    …)。座標は空白区切り。 GeoJSON:JSONで図形を表す形式。 例 type=LineString, coordinates=[[経度,緯度], …] WKTと同じ図形をJSONで表現できます。 【超重要】 どちらも「経度が先・緯度が後」です! SnowflakeはTO_GEOGRAPHY()で、WKT・GeoJSONのどちらからでも GEOGRAPHYに変換できます。
  8. 距離を測る 2点間の距離は関数ひとつで求められます。 ST_DISTANCE(点A, 点B): 2点間の最短距離を返します。GEOGRAPHY型であれば、地球の丸みを 考慮した正確な距離計算が行われます。 ※ 単位はメートルです。 kmにしたい場合は /1000

    を行います。 ST_DWITHIN(点A, 点B, 距離m): (おまけ) 「指定した距離以内か?」を TRUE / FALSE で返します。特定範囲 内の顧客を抽出するなどの条件判定に非常に便利です。
  9. 初心者向けTips ここだけ押さえれば地理空間はこわくない。 経度が先、緯度が後 距離の単位はメートル キャストと型の選択 ST_MAKEPOINT(lon, ST_DISTANCEの単位はメ 迷ったら GEOGRAPHY lat)。逆にすると点が海の

    ートルです。キロメート 型を選択し、緯度経度が 上や別大陸へ飛びます。 ルで出したい場合は忘れ 文字列なら ::FLOAT でキ おかしな距離が出たら座 ずに /1000 を行いましょ ャストします。NULLや範 標順を疑いましょう。 う。 囲外データにも注意。
  10. 全体の流れ(ハンズオン全体図) 今日の作業を1枚で俯瞰します。 4. 片付け・その他 (時間があれば) 2. 取込・変換 GeoJSONをステージへ → 環境を削除(DROP)

    FLATTEN + TO_GEOGRAPHY (+Marketplace鉄道データ) 1. 準備・データ取込 3. 地図で表示(可視化) WH・DB・スキーマ作成 BIツールから接続し、 緯度・経度のテーブル投入 鉄道網を地図に表示
  11. 取り込みの流れ 内部ステージのGeoJSONを、GEOGRAPHY型のテーブルに変換します。 。 ①展開して変換: GeometryCollectionの geometries を FLATTEN で1行ずつに分け、 TO_GEOGRAPHY()

    でGEOGRAPHY型に変換してテーブル化します。 ② 確認: ST_ASGEOJSON で中身を確認、ST_LENGTH で路線の長さも見られます。 ポイント: 元データは図形(線)だけで属性(路線名など)は入っていません。属性で色分けし たい場合は属性付きのGeoJSONを使います。
  12. 発展:もっと分析したい人へ RAILWAYSテーブルでできる「分析の入り口」SQL集 -- 1) 鉄道網の総延長(km) ※ST_LENGTHの単位はメートル -- 4) ある地点(ミラノ中央駅付近: 経度

    9.204 / 緯度 45.486)の SELECT ROUND(SUM(ST_LENGTH(GEOM)) / 1000, 1) AS total_km -FROM RAILWAYS; 半径5km以内を通る路線の本数 ※ST_DWITHINは距離(m)以内でTRUE SELECT COUNT(*) AS lines_within_5km FROM RAILWAYS -- 2) 長い路線 TOP10(1本あたりの長さ km) WHERE ST_DWITHIN(GEOM, TO_GEOGRAPHY('POINT(9.204 45.486)'), SELECT geometry_id, 5000); ROUND(ST_LENGTH(GEOM) / 1000, 2) AS km FROM RAILWAYS -- 5) データ全体のおおよその範囲(外接矩形)をWKTで確認 ORDER BY km DESC SELECT ST_ASWKT(ST_ENVELOPE(ST_COLLECT(GEOM))) AS LIMIT 10; bounding_box FROM RAILWAYS; -- 3) 各路線の頂点数(線の複雑さ) SELECT geometry_id, ST_NPOINTS(GEOM) AS n_points FROM RAILWAYS -- 6) 地図表示を軽くしたい時:頂点を間引く(許容誤差 50m 目安) SELECT geometry_id, ST_SIMPLIFY(GEOM, 50) AS geom_light ORDER BY n_points DESC FROM RAILWAYS LIMIT 10; LIMIT 100;