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

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

 『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』アプリの地理空間データを
    扱う工夫
    2023.10.16
    牧瀬 芳太郎
    GO株式会社

    View full-size slide

  2. © GO Inc. 2
    2
    自己紹介
    GO株式会社
    ソフトウェアエンジニア / 牧瀬 芳太郎
    タクシーアプリ『GO』データ基盤開発・運用などを担当
    Go言語でバックエンド開発もしています
    最近はソロキャンプが気になっています。涼しくなってきたの
    でそろそろ入門したい

    View full-size slide

  3. © GO Inc. 3
    『GO』アプリと地理空間データ
    『GO』アプリでは様々な形で地理空間データ
    を扱っている
    ▪ タクシーの位置情報
    ▪ 道路や交差点がどこにあり、どう繋がっている

    ▪ タクシーの営業エリア
    ▪ お客様がタクシーを呼んだ場所(緯度・経度)の
    住所表記
    ▪ タクシーの需要がどこに多く発生しているか
    ▪ etc.

    View full-size slide

  4. © GO Inc. 4
    地理空間データの処理
    地理空間データを扱う時、データを適切なサイズに分割して
    扱いたい
    ▪ 地理空間データは大きいことが多いため、一度に全部処理しよ
    うとするとメモリ上に乗り切らなかったり、CPU負荷が高かっ
    たりするため
    ▪ 何らかの統計的な処理をする場合に、集計の単位を設けたい
    ▪ 検索処理などにおいて、高速化のために処理対象を効率的に絞
    り込みたい

    View full-size slide

  5. © GO Inc. 5
    地理空間インデックス
    ▪ 地理空間をどのように分割するか、分割したものをどう指し示す(ア
    ドレッシング)か
    ⇒ 地理空間インデックス
    ▪ 地理空間データを扱えるデータベースシステムにおいて、地理空間
    データを高速に検索するために作られる索引
    ⇒ 地理空間インデックス(これも)
    ▪ 両者はかなりオーバーラップ
    している
    ▪ 今回は主に空間の分割手法
    についての話
    空間検索の高速化手法
    空間の分割手法

    View full-size slide

  6. © GO Inc. 6
    『GO』で利用している地理空間インデックス
    ▪ 地域メッシュ
    ▪ Morton Keys
    ▪ H3

    View full-size slide

  7. © GO Inc. 7
    地域メッシュ
    ▪ 総務省による「統計に用いる標準地域メッシュおよび標準地域メッ
    シュ・コード」
    = JIS X 0410 地域メッシュコード
    ▪ 緯度・経度に基づいて地域をほぼ同じ大きさの網の目(メッシュ)に分
    けたもの
    ▪ 日本の国土全体をカバーしている (日本の外は表現できない)
    ▪ メッシュの大きさは複数あり、上位のメッシュを分割したものが下位
    のメッシュになる (階層構造)
    ▪ それぞれのメッシュにはコードが割り振られている

    View full-size slide

  8. © 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  11. © GO Inc. 11
    地域メッシュ
    ▪ さらに小さい分割もある

    1/2地域メッシュ: 1辺 約 500m

    1/4地域メッシュ: 1辺 約 250m

    1/8地域メッシュ: 1辺 約 125m

    View full-size slide

  12. © GO Inc. 12
    『GO』での地域メッシュの活用
    『GO』のどこで使っているか
    ▪ 社外から入手している地理空間データの管理や加工
    ▪ 地図データ (全国の道路の情報、建物の住所、など)
    ▪ 気象予報データ
    ▪ 機械学習を利用したシステムのいくつか
    ▪ 特徴量
    ▪ 推論結果
    ▪ 一部のデータ分析

    View full-size slide

  13. © GO Inc. 13
    『GO』での地域メッシュの活用
    採用理由
    ▪ 社外から入手している地理空間データは元々地域メッシュ単位
    で分割されていることが多く、取り込みや処理の際にその形式
    を維持すると便利なため
    ▪ 特に地図データなどはメモリに載らないほど巨大なため、分割
    して処理する必要があるため

    道路データ: 約1400万レコード

    住所データ: 数千万レコード
    ▪ 分割単位としてサイズが手頃
    ▪ 矩形なので理解しやすく、簡単に扱える

    View full-size slide

  14. © 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

    View full-size slide

  15. © GO Inc. 15
    Morton Keys

    実際に利用する時は、緯度経度の範囲に対して四分木の空間分割を適
    用する

    地域メッシュと異なり既存の仕様は無いため、我々の都合に合わせた形
    で緯度経度にマッピングする
    例:
    ▪ ノードID 01
    → 経度 0°〜180°, 緯度 -90°〜0°
    ▪ ノードID 1001
    → 経度 -90°〜0°, 緯度 0°〜45°
    11
    00 01
    -180°
    経度
    緯度
    0° 180°

    90°
    -90°
    1010
    1000 1001
    1011

    View full-size slide

  16. © GO Inc. 16
    Morton Keys
    特徴
    ▪ 他の地理空間分割手法に比べ、ノードID の処理が高速
    ▪ 実用的な範囲を 64ビット整数で表現でき、文字列との相互
    変換も不要
    ▪ 座標との相互変換が簡単な計算で行えて、必要なCPUサイ
    クル数が少ない
    ▪ 上位ビットを見ればどの上位階層に属しているかわかる
    ▪ 日本以外もカバーできる

    View full-size slide

  17. © GO Inc. 17
    『GO』でのMorton Keysの活用
    ▪ 『GO』のどこで使っているか
    ▪ 内製逆ジオコーディング
    ▪ 内製 Point-in-Polygon 処理
    ▪ 採用理由

    地域メッシュと比べ、2倍高速に処理できる

    地域メッシュと比べ、分割のサイズが細かく選べる(4倍ず
    つ)

    View full-size slide

  18. © GO Inc. 18
    逆ジオコーディング
    逆ジオコーディングとは?
    → 緯度経度から対応する住所を求める処理
    ▪ 例: 35.6648, 139.7378 (= 35°39'53.3"N 139°44'16.1"E) →
      「東京都港区六本木3丁目2-1」

    View full-size slide

  19. © GO Inc. 19
    逆ジオコーディング
    逆ジオコーディングの基本: 座標がどのポリゴンに含まれているか
    を判定すること (Point-in-Polygon)
    ▪ 課題: 座標が与えられたとき、数千万件ある住所のポリゴンに
    対し、1つ1つ Point-in-Polygon 処理を行っていくと処理量が
    膨大になる
    東京都港区六本木3丁目
    のポリゴン
    この座標の住所は
    六本木3丁目である
    この座標の住所は
    六本木3丁目ではない

    View full-size slide

  20. © 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

    View full-size slide

  21. © 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

    View full-size slide

  22. © GO Inc. 22
    H3
    ▪ Uber が開発した地理空間インデックス方式
    ▪ https://h3geo.org/
    ▪ 六角形によるセル分割
    ▪ 近接するセルの中心までの距離が均等
    出典:
    https://www.uber.com/en-JP/blog/h3/

    View full-size slide

  23. © GO Inc. 23
    H3
    ▪ セルは階層構造を持っている
    ▪ 1つ階層を降りると 7つの子セルに分割される
    ▪ 親の六角形は子の六角形を完全には含まない
    (階層の違うセル同士で比較したりしなければ問題ない)
    出典:
    https://www.uber.com/en-JP/blog/h3/

    View full-size slide

  24. © GO Inc. 24
    『GO』でのH3の活用
    ▪ 『GO』のどこで使っているか

    様々なデータ分析・可視化

    機械学習を利用したシステムのいくつか

    以前は地域メッシュコードを利用していたが、移行できる箇所では H3
    に乗り換えた
    ▪ 採用理由

    kepler.gl を使うときに可視化しやすい。H3 のセル単位でそのまま可
    視化できる

    地域メッシュの1〜3次はサイズの変化が大きい(64倍, 100倍)ため、
    中間のサイズが欲しい時に不便。一方 H3 はきめ細かくサイズを選択
    できる(7倍)

    公式のライブラリが整備されている。弊社では Python版および
    JavaScript版(BigQuery UDF として)を利用

    View full-size slide

  25. © 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

    View full-size slide

  26. © 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"

    View full-size slide

  27. © GO Inc. 27
    まとめ
    地理空間インデックス 特徴 GOでの用途
    地域メッシュ 外部データとの親和性 外部データの管理や加工
    分析
    機械学習
    Morton Keys 高速 検索インデックス
    H3 統計的性質の良さ
    可視化
    分析
    機械学習
    『GO』で利用している地理空間インデックス

    View full-size slide

  28. © GO Inc.
    文章・画像等の内容の無断転載及び複製等の行為はご遠慮ください

    View full-size slide