Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

『GO』アプリの地理空間データを扱う工夫

GO Inc. dev
October 17, 2023

 『GO』アプリの地理空間データを扱う工夫

GO TechTalk #23 ジオスペシャル!位置情報活用の現場をお話します! で発表した資料です。

■ YouTube
https://www.youtube.com/live/5V_SVH9wIgE?si=tMme2F2Rszw3ESQ1&t=1573

■ connpass
https://jtx.connpass.com/event/295571/

GO Inc. dev

October 17, 2023
Tweet

More Decks by GO Inc. dev

Other Decks in Programming

Transcript

  1. © GO Inc. 2 2 自己紹介 GO株式会社 ソフトウェアエンジニア / 牧瀬

    芳太郎 タクシーアプリ『GO』データ基盤開発・運用などを担当 Go言語でバックエンド開発もしています 最近はソロキャンプが気になっています。涼しくなってきたの でそろそろ入門したい
  2. © GO Inc. 3 『GO』アプリと地理空間データ 『GO』アプリでは様々な形で地理空間データ を扱っている ▪ タクシーの位置情報 ▪

    道路や交差点がどこにあり、どう繋がっている か ▪ タクシーの営業エリア ▪ お客様がタクシーを呼んだ場所(緯度・経度)の 住所表記 ▪ タクシーの需要がどこに多く発生しているか ▪ etc.
  3. © GO Inc. 4 地理空間データの処理 地理空間データを扱う時、データを適切なサイズに分割して 扱いたい ▪ 地理空間データは大きいことが多いため、一度に全部処理しよ うとするとメモリ上に乗り切らなかったり、CPU負荷が高かっ

    たりするため ▪ 何らかの統計的な処理をする場合に、集計の単位を設けたい ▪ 検索処理などにおいて、高速化のために処理対象を効率的に絞 り込みたい
  4. © GO Inc. 5 地理空間インデックス ▪ 地理空間をどのように分割するか、分割したものをどう指し示す(ア ドレッシング)か ⇒ 地理空間インデックス

    ▪ 地理空間データを扱えるデータベースシステムにおいて、地理空間 データを高速に検索するために作られる索引 ⇒ 地理空間インデックス(これも) ▪ 両者はかなりオーバーラップ している ▪ 今回は主に空間の分割手法 についての話 空間検索の高速化手法 空間の分割手法
  5. © GO Inc. 7 地域メッシュ ▪ 総務省による「統計に用いる標準地域メッシュおよび標準地域メッ シュ・コード」 = JIS

    X 0410 地域メッシュコード ▪ 緯度・経度に基づいて地域をほぼ同じ大きさの網の目(メッシュ)に分 けたもの ▪ 日本の国土全体をカバーしている (日本の外は表現できない) ▪ メッシュの大きさは複数あり、上位のメッシュを分割したものが下位 のメッシュになる (階層構造) ▪ それぞれのメッシュにはコードが割り振られている
  6. © GO Inc. 8 地域メッシュ 1次メッシュ ▪ 1辺 約 80km

    1次メッシュコード ▪ YYXX の 4桁 YY: 緯度コード XX: 経度コード ▪ 例: 5339 = 東京都周辺 5339 5338 5340 5440 5439 5438 5238 5239 5240 約80km 約80km ©OpenStreetMap contributors
  7. © GO Inc. 9 地域メッシュ 2次メッシュ ▪ 1辺 約 10km

    ▪ 1次メッシュを 64分割 2次メッシュコード ▪ 1次メッシュコード + YX の 2桁 Y: 緯度コード(0〜7) X: 経度コード(0〜7) ▪ 例: 533945 =   中野区・新宿区など ©OpenStreetMap contributors 約10km 533945
  8. © GO Inc. 10 地域メッシュ 3次メッシュ ▪ 1辺 約 1km

    ▪ 2次メッシュを 100分割 3次メッシュコード ▪ 2次メッシュコード + YX の 2桁 Y: 緯度コード(0〜9) X: 経度コード(0〜9) ▪ 例: 53394526 =   新宿駅東口周辺   ©OpenStreetMap contributors 約1km
  9. © GO Inc. 11 地域メッシュ ▪ さらに小さい分割もある ▪ 1/2地域メッシュ: 1辺

    約 500m ▪ 1/4地域メッシュ: 1辺 約 250m ▪ 1/8地域メッシュ: 1辺 約 125m
  10. © GO Inc. 12 『GO』での地域メッシュの活用 『GO』のどこで使っているか ▪ 社外から入手している地理空間データの管理や加工 ▪ 地図データ

    (全国の道路の情報、建物の住所、など) ▪ 気象予報データ ▪ 機械学習を利用したシステムのいくつか ▪ 特徴量 ▪ 推論結果 ▪ 一部のデータ分析
  11. © GO Inc. 13 『GO』での地域メッシュの活用 採用理由 ▪ 社外から入手している地理空間データは元々地域メッシュ単位 で分割されていることが多く、取り込みや処理の際にその形式 を維持すると便利なため

    ▪ 特に地図データなどはメモリに載らないほど巨大なため、分割 して処理する必要があるため ▪ 道路データ: 約1400万レコード ▪ 住所データ: 数千万レコード ▪ 分割単位としてサイズが手頃 ▪ 矩形なので理解しやすく、簡単に扱える
  12. © GO Inc. 14 Morton Keys ▪ 四分木(Quadtree)をベースにした空間分割 ▪ 空間を

    4分割し、2進数表記 YX の2ビットを割り当てる (ノードID) ▪ ビットを増やし、階層的に分割できる 10 11 00 01 1 0 0 1 11 00 01 1 0 0 1 1010 1000 1001 1011
  13. © GO Inc. 15 Morton Keys ▪ 実際に利用する時は、緯度経度の範囲に対して四分木の空間分割を適 用する ▪

    地域メッシュと異なり既存の仕様は無いため、我々の都合に合わせた形 で緯度経度にマッピングする 例: ▪ ノードID 01 → 経度 0°〜180°, 緯度 -90°〜0° ▪ ノードID 1001 → 経度 -90°〜0°, 緯度 0°〜45° 11 00 01 -180° 経度 緯度 0° 180° 0° 90° -90° 1010 1000 1001 1011
  14. © GO Inc. 16 Morton Keys 特徴 ▪ 他の地理空間分割手法に比べ、ノードID の処理が高速

    ▪ 実用的な範囲を 64ビット整数で表現でき、文字列との相互 変換も不要 ▪ 座標との相互変換が簡単な計算で行えて、必要なCPUサイ クル数が少ない ▪ 上位ビットを見ればどの上位階層に属しているかわかる ▪ 日本以外もカバーできる
  15. © GO Inc. 17 『GO』でのMorton Keysの活用 ▪ 『GO』のどこで使っているか ▪ 内製逆ジオコーディング

    ▪ 内製 Point-in-Polygon 処理 ▪ 採用理由 ▪ 地域メッシュと比べ、2倍高速に処理できる ▪ 地域メッシュと比べ、分割のサイズが細かく選べる(4倍ず つ)
  16. © GO Inc. 18 逆ジオコーディング 逆ジオコーディングとは? → 緯度経度から対応する住所を求める処理 ▪ 例:

    35.6648, 139.7378 (= 35°39'53.3"N 139°44'16.1"E) →   「東京都港区六本木3丁目2-1」
  17. © GO Inc. 19 逆ジオコーディング 逆ジオコーディングの基本: 座標がどのポリゴンに含まれているか を判定すること (Point-in-Polygon) ▪

    課題: 座標が与えられたとき、数千万件ある住所のポリゴンに 対し、1つ1つ Point-in-Polygon 処理を行っていくと処理量が 膨大になる 東京都港区六本木3丁目 のポリゴン この座標の住所は 六本木3丁目である この座標の住所は 六本木3丁目ではない
  18. © GO Inc. 20 Morton Keys による検索インデックス ▪ Morton key

    によってインデックスを作成する ▪ ノード毎にオーバーラップする住所ポリゴンのIDリストを保持 → チェックする対象のポリゴンの数を大幅に抑えられる 1010 1010 0010 0000 1011 1001 0011 0001 1110 1110 0110 0100 1111 1101 0111 0101 住所ポリゴン ID = 1 Morton keyに対する住所ポリゴンIDのリスト 1001 : { 1 }  1110 : { 1, 2 } 0110 : { 2 } 住所ポリゴン ID = 2
  19. © GO Inc. 21 Morton Keys 利用の詳細 参考 ▪ Goで超高速かつスケーラブルな逆ジオコーディングAPIサー

    バーを作ってみた https://speakerdeck.com/mot_techtalk/godechao-gao-su-katusukeraburunani-z iokodeinguapisabawozuo-tutemita ▪ GIS処理を超超高速化した話 | MoT Lab https://lab.mo-t.com/blog/gis-optimization
  20. © GO Inc. 22 H3 ▪ Uber が開発した地理空間インデックス方式 ▪ https://h3geo.org/

    ▪ 六角形によるセル分割 ▪ 近接するセルの中心までの距離が均等 出典: https://www.uber.com/en-JP/blog/h3/
  21. © GO Inc. 23 H3 ▪ セルは階層構造を持っている ▪ 1つ階層を降りると 7つの子セルに分割される

    ▪ 親の六角形は子の六角形を完全には含まない (階層の違うセル同士で比較したりしなければ問題ない) 出典: https://www.uber.com/en-JP/blog/h3/
  22. © GO Inc. 24 『GO』でのH3の活用 ▪ 『GO』のどこで使っているか ▪ 様々なデータ分析・可視化 ▪

    機械学習を利用したシステムのいくつか ▪ 以前は地域メッシュコードを利用していたが、移行できる箇所では H3 に乗り換えた ▪ 採用理由 ▪ kepler.gl を使うときに可視化しやすい。H3 のセル単位でそのまま可 視化できる ▪ 地域メッシュの1〜3次はサイズの変化が大きい(64倍, 100倍)ため、 中間のサイズが欲しい時に不便。一方 H3 はきめ細かくサイズを選択 できる(7倍) ▪ 公式のライブラリが整備されている。弊社では Python版および JavaScript版(BigQuery UDF として)を利用
  23. © GO Inc. 25 Kepler.gl による H3 の可視化 ▪ Kepler.gl:

    Uber が開発した地理 情報可視化ツール ▪ 点、ポリゴン、ヒートマップ、 H3 など様々な地理データの可視 化ができる ▪ H3 のキー (H3 Index) をカラム として渡して簡単に可視化でき る 出典: https://docs.kepler.gl/docs/user -guides/c-types-of-layers/j-h3
  24. © GO Inc. 26 BigQuery での H3 の利用 ▪ JavaScript

    UDF -- JavaScript UDF を Persistent UDF として定義 CREATE OR REPLACE FUNCTION persistent_udf.geoToH3(lat FLOAT64, lon FLOAT64, res FLOAT64) RETURNS STRING LANGUAGE js AS """ return h3.geoToH3(lat, lon, res); """ OPTIONS ( -- H3 の JavaScript版を https://unpkg.com/h3-js から取得し、GCSに置いておく library="gs://your-bucket-name/javascript_lib_for_bq/h3-js.umd.3.7.2.js" ); -- 緯度経度とresolutionを指定して H3 Index を取得 SELECT persistent_udf.geoToH3(37.3615593, -122.0553238, 7); ⇒ "87283472bffffff"
  25. © GO Inc. 27 まとめ 地理空間インデックス 特徴 GOでの用途 地域メッシュ 外部データとの親和性

    外部データの管理や加工 分析 機械学習 Morton Keys 高速 検索インデックス H3 統計的性質の良さ 可視化 分析 機械学習 『GO』で利用している地理空間インデックス