Uberはなぜ地図を六角形で埋めるのか

Uberはなぜ地図を六角形で埋めるのか

SN

7/11 00:42



出典

H3: Uber’s Hexagonal Hierarchical Spatial Index (2018/06/27)


筆者

Isaac Brodsky

Isaac Brodsky is a software engineer on Uber’s Marketplace Intelligence team.


Uberとは

Uberホームページ

世界を席巻しつつある白タクサービス、宅配のUber Eats、オンデマンドフライトのUberAIRなどで生活を変えようとしている。

日本進出はソフトバンクがサポート

参考:ソフトバンク、ウーバーへの出資完了


H3とは

大小様々な六角形をグリッドとする新しいインデックスシステム(座標システム)

(「大小様々な六角形」、「階層的な六角形」の説明は後ほど)

image.png


本文

※意訳している部分があるので、引用元も参照ください。


なぜH3

地図などの空間データセットを解析する際に、グリッドシステムは重要となります。ここでのグリッドシステムとは、地球の表面をどのようなグリッドに分割する仕組みです。

このことを踏まえ、UberがH3を開発したのは以下を可能にするグリッドシステムを実現するためです。


乗車料金と乗車経路の最適化
空間データの視覚化と探求


H3を使えば地理情報の解析ができます。都市レベルで動的な価格設定をするなどの意思決定に繋がります。Uberは市場の分析、最適化のためにH3を使います。H3はこのためのデザインされ、我々が階層的な六角形を使うことに繋がりました。


オープンソース化

今年(2018年)のはじめ、UberはGithub上でH3をオープンソース化しました。

そして先週、H3 JavaScriptを公開しました。


記事の目的

この記事では「H3の特徴であるグリッドシステムをなぜ使うのか」、「H3のスタートガイド」について話していきます。

image.png


背景

毎日、何百万というイベント(注文)がUberに届きます。車に乗りたい人はリクエストをし、ドライバーは運転を開始します。お腹が減った人はご飯を注文します。それらのイベントはどこかの場所で起こっています。例えば、乗客は自宅から乗車リクエストを送るかもしれませんし、ドライバーはそのリクエストを数マイル離れた社内で承認するかもしれません。

これらのイベントの情報はサービスを通じてUberがユーザー市場を理解し最適化することに役立ちます。例えば、市のある地域では需要が供給を超え、それに応じて値段が変わるかもしれません。もしくは、uberPOOL(乗り合いサービス)のドライバーと2つの乗車リクエストがとても近いことを教えてくれるかもしれません。

Uber市場のデータから情報、洞察を得るには、市内全域のデータを解析する必要があります。なぜなら市は地理的に多様性があり、細かな粒度で分析をしなければいけません。しかし、「イベントが起きた場所を正確に(点で)求めるといった」最高精度の分析は難しい上にコストが高くなります。そのため、エリアの分析がずっと実用的です。

image.png

画像は点情報がエリアの情報に変わっていく様子。(市内の車→六角形内の車→車の数で六角形を色付け)

グリッドシステムはイベントを六角形エリア(セル)に入れるために使われています。データポイントは六角形に詰め込まれているので、六角形に詰め込まれたデータを使えばデータポイントを表現する事が可能となります。例えば、、私達はサービスを展開する市の六角形内にある需要供給を測ることにより、値段の上昇を計算します。六角形は、Uberの市場分析における基礎となるのです。


なぜ六角形か

六角形であることも大切です。市内の利用者はたいてい動いており、六角形はユーザーが市内を移動する際に生じる量子化誤差(情報を連続(アナログ)から離散(デジタル)に変えるときに生じる誤差)を最小化します。また、簡単に半径を近似することも可能にします。

例:Engineering Uber Predictions in Real Time with ELK

六角形以外の選択肢として、以下も可能でした。


多角形

郵便番号を用いたエリア分けはその例ですが、いびつで分析には使いづらい大きさで、さらには私達の意図とは関係なく変更される可能性もあります。(画像はマンハッタンのZIPコード(郵便番号)マップ)

image.png


Uberオペレーターの経験によるマッピング

→街の変化によるアップデートが必要で、エリアの境目を決めるのも大変

(属人的でコストも高い)

グリッドシステムはUberがサービスを展開する市内で比較可能な形と大きさをもっており、属人的な変更も必要ありません。グリッドシステムは道路や市内の地域を並べることはしませんが、一方でグリッドをクラスタリングする(まとめる)ことによって、効率的に地域を表すことができます。クラスタリングをすることによって、分析はより便利なものになります。

image.png


H3

Uberは六角形のグリッドシステムと階層的インデックスシステムのいいどこ取りをするためにH3を開発しました。

地球にグリットシステムを適用する場合、考えなければいけないことは少なくとも2つ:


地図の投影
地図上のグリッド



地図の投影

地球上の位置という3次元の情報を地図上の点という2次元の情報にすること


地球上のグリッド

2次元にした後、地球のグリッドシステムに則りグリッドが加えられます。

様々な投影法・グリッドの組み合わせは無限にあります。メルカトル図法と正方グリッドは有名な例です。この組み合わせは使えないことはないですが、多くの欠点があります。まず、メルカトル図法が生むサイズの歪みは見逃せません。いくつかのセルはかなり異なるエリアを含むでしょう。正方グリッドにも、分析の際に複数の係数のセットが必要であるという欠点があります。この原因となるのは、正方グリッドの幾何学的性質、隣接する図形が2種類あることにあります。辺を共有する部分が4方向と頂点を共有する部分が4方向にあるのです。


選ばれたのは

投影方法としては心射方位図法が選べれました。20面体の中心から表面に向けて投影されていると考えてください。

image.png

20面体への投影は、20の2次平面を生みます。

20面体は2次元に広げることが可能ですが、H3はそのようなことをせず、地球の表面にグリッドを残しておきます。(上画像)

グリッドの形として選ばれたのはもちろん六角形です。下図のように、六角グリッドは隣接するセルへの距離が等しく、全エリアと辺を共有しています。(三角形、四角形を参考)

これは、分析をし勾配を平滑化する際に非常に便利な特性となります。

image.png

H3のグリッドは122のベースセルからなっています。重複を無視すると20面体の1つの面につき10の六角形があることになります。いくつかのセルは複数の面にわたって存在します。(下図の境界にあるセルを参考)

image.png

20面体を六角形のみで埋めることは不可能なため、12の五角形を導入しました。(サッカーボール、五角形:12個、六角形:20個)20面体の頂点に1つずつ存在します。

H3は16段階の解像度に対応しています。解像度が1段階あがるとセルの大きさが1/7になります。六角形を完璧に7つの六角形に分けることはできないため、解像度が上がったセルは「だいたい」親のセルに含まれていることになります。

image.png

これにより、位置の特定が効率的になります。子セルがおおまかにしか親セルにふくまれていないため、位置特定の際にエリアを切り捨てる必要があり、それはエリアの歪みを生みます。

しかし、それ以外の場合では境界は正確に定義されます。


Getting started with H3

H3のインデックスシステムはGithub上で公開されています。ライブラリ自体はC言語で書かれているが、多くの言語に対応しています。はじめての場合Bindingsの利用が推奨されます。Java, JavaScript用のBindingsをUberは公開しており、コミュニティは更に多くの言語に対応するために貢献しています。。PythonとGoのBindingsは近々公開予定。


基本的な関数


geoToH3: 経度緯度情報を64Bit H3インデックスに変換する、解像度の指定も可能。

kRing


など


さらなる情報

H3はUberが市場の定量的解析をすることを可能にしています。オープンソース化された今、あなたも世界を六角形化することが可能です!

「Githubのレポジトリをフォロー」し、「#uberH3のタグをつけてツイート」してH3コミュニティに参加してください!

Qiita - GitHubタグが付けられた新着投稿

githubで初回push時にパスワード間違えて詰んだ話

SN

9/14 10:32



はじめまして。

タイトル通りです。

当方お恥ずかしながら、かなりの高確率でIDとPasswordを紛失するのですが

今回はそれでかなり痛い目を見たので自戒を兼ねて。


なにがおこったか

CUIでpush時、出て...

【GitHub】Fork my repository〜自分のリポジトリをForkする〜

SN

9/13 22:34

世の中の色々なリポジトリをforkして作業することは多いと思うが、自分のリポジトリをforkしたい場合の手順を記載していきます。

方法は2つあります。 下記を参考に両方試してみます。


github 自分のリポジト...

GitHubに自分のPCをssh接続するための方法

SN

9/13 21:53

作業履歴を見ていてくれるナイスガイ、Gitさんを使えるようにする為の難しかった所です。


- なぜこの手順が必要か

webサービスであるGitHubが、今作業しているPC端末を特定して、接続する為に必要です。

G...

いまさらGit for Windowsのインストール、GitHubに接続してみた。

SN

9/13 16:20



はじめに

「いまさらだけどGitを基本から分かりやすくまとめてみた」を見て、Gitを一から始めたくなったので、Windows10でGitForWindowsのインストールして、GitHubに接続してみました。

その際の手順です...

お役所化したGithub【Github Repository設定アンチパターン】

SN

9/13 13:24

レビュ済みの変更をmasterにmergeするためにたらい回しにされたので、アンチパターンとして共有します


前提



git flowのようにdev branchを利用している
dev branchは複数並列で存在する

branch protection ...

Github — Show Outdated をすべて開くブックマークレット (2018-09-13)

SN

9/13 12:27

Bookmarklet to expand all collapsed comments in a GitHub pull request (places where it says "discussed an outdated diff") より

javascript:Array.from(document.getElementsByClassName('outdated-comme...

【超初心者向け・Git&GitHub入門】誰もが最初にぶつかるGitとGitHubの初期設定からワークフローまでの流れ

SN

9/12 20:39

初心者の人が誰でもぶつかるであろう(全くの初心者だった自分がたくさんの時間を使ったため)、GitとGitHubの初期設定からワークフローの流れをメモ的に共有しておきます。

【参考URL】

・GitHubでSSH接続す...

Git と GitHub の違い

SN

9/12 16:43

GitHubの挙動が難しい。

GitHubのコマンド一覧が欲しい。

そう呟いてた自分に鋭い指摘が入りました。

「GitHubじゃなくて、それ、Gitなんだよなぁ。」

なるほど。

今日何度も見たGitHubのページの...

WebのLGTM画像メイカーなら addtext.com がおすすめ

SN

9/12 13:05



サイト

https://addtext.com/


良いところ


Webサービスだ
操作が簡単
文字サイズ・位置などを調整可能
LGTM以外の文字も入れられる



悪いところ


動作は遅め
設定を記憶してくれないので、毎回フォント...

git commit 時に書くコミットメッセージ1行目の表示文字数上限を調べてみた

SN

9/12 00:21



はじめに

みなさまはたまに不思議なところで折り返されているコミットメッセージを見かけることはないでしょうか?

例えばこんなのです。

https://github.com/JPSERN/TestRepo/commit/5254212a0b71077372...

もりくまtech成長日記その1

SN

9/11 17:31

はじめまして。

プログラミングで何かモノを作れるようになりたいもりくまと申します。

ここから初心者としてつまづいた所、進捗を出すのに苦しんだ所などを書き残すことで、少しでも後から始める人の救いに...

Bitbucket→GitHubへリポジトリお引越しメモ

SN

9/11 15:03



はじめに

現在、bitbucketを利用していたが、GitHubへお引越しをする必要があるためメモ。


前提条件


bitbucketアカウントを既に持っており、bitbucketでソース管理をしている。
GitHubの登録が済んでいる...

30分でできるRuby on RailsとGitHubやエディタまわりの環境構築

SN

9/11 00:03



はじめに

Ruby on Railsで開発を行うエンジニアになって3ヶ月、環境構築をするとなると、その機会自体あまり多くないのもあって未だにいろいろな記事を行ったり来たりと非常に労力と時間を消費する。そこで、R...

iOSアプリをOSSにして�一週間、良かったこと・悪かったこと

SN

9/10 18:56



リリース前のiOSアプリをオープンソースとして公開

こんにちは。株式会社aboonの代表、清原と申します。一週間前、qiitaで下の記事を書きました。この件のこともあって、アプリをオープンソースとして公開して...

#29/100DaysOfCode【 フィードバックの整理をしてみた・Git環境を構築してみた】

SN

9/10 18:21



概要

今日気をつけること

①ブログを見直してみると結局何が知りたいのかあまりわかりにくいので、

【質問は恥ではないし役に立つ】

のフォーマットを参考にしてわからないことを書く。あくまで互助会...

bitbucket/github, git, docker, linux(ubuntu)悪戦苦闘

SN

9/10 15:18



導入(introduction)

bitbucket, githubによるソースコード管理と、dockerによるubuntu仮想環境の利用と、docker hubによる共有の作業の技術と課題を記録する。


背景(back ground)

公開できる作業はgithubで...

VuePressでGitHub Pagesにリッチなドキュメントを作る

SN

9/9 16:12



概要

GitHubでソースコード、ドキュメント両方を管理し、自動的にデプロイする仕組みを作ります。

ドキュメントの作成にはVuePressを、CIサービスとしてTravis CIを用います。

背景

自作ライブラリやア...

git で特定のブランチだけ複数のリモートリポジトリに push する

SN

9/9 13:38



経緯

普段プライベートリポジトリで開発しているものを,master ブランチだけ公開したくなりました.


編集

もっとスマートな方法があるのかもしれませんが,以下のように .git/config を編集したらできまし...

Slack用BotをHeroku+hubot+Githubで作成してみた

SN

9/9 00:09



環境


サーバー:Heroku
ローカルPC:macOS
Bot用フレームワーク:hubot
ソースコード管理:Github



Slack側設定



Slack App Directoryにアクセス

hubotを検索し、ワークスペースにインストール
設定画面...

GitHubに二段階認証を設定した後にGit操作できない時の解決策

SN

9/8 01:05

この記事では非公開のOrganizationを使った例を載せていますが、個人のリポジトリでもほとんどやることは同じです。(おそらくステップ5が不要なくらい)


問題

GitHubに二段階認証を設定した後、普通にgit clo...

【初心者向け】GitHub Flow:具体的な流れと注意点

SN

9/8 00:52

作業の名前が独特でよく分からなかったので、整理してまとめました。

・リモートにあるmasterブランチから最新のコードを取ってくるのが「プル」

・その逆で、ローカルからリモートへコードを更新するのが「...

AWS IoTを使用してGitHubのコードをraspberry piに自動デプロイする

SN

9/7 16:39



概要

これまでは、GitHubにpushしたコードをraspberry piからgit pullしていたが、

この作業が面倒なので、pushしたら自動でraspberry piに反映させるというものを作りました。

C言語のコードも利用す...

ubuntuでgithubへpushする

SN

9/6 22:17

linux,UbuntuにはsourcetreeやTortoiseGitなどがない。

CUIでやってみる。

# インストール
sudo apt install git

# 入ったか確認
git --version

# コミットしたディレクトリに移動してinitする
git init

...

Git の使い方 超入門

SN

9/6 18:17



Gitの使い方


Branchの切り方


GitのWebページ


Project⇒Branches⇒New branch
Brance name を入力すればOK


ローカル環境(tortoiseGitを使う)


クローンを作って



- 右クリック⇒切換え


【自分用】新参者のエンジニアがgithubの基本的な使い方をサクッとまとめてみた( ´Д`)

SN

9/6 17:50



この記事の目的( ´Д`)

この記事はgithubの使い方が怪しい筆者が様々な記事を参考にして学んだことをまとめています( ´Д`)

この記事を執筆した時点ではあまりgithubを使うメリットがわかっていないのですが、...

GitHubを楽しく使おう

SN

9/6 15:11



なにこれ

普段お世話になっているgithubをもっと便利に使うために思っているところを雑に書く。

会社でまとめた内容が割とウケが良かったので知見の棚卸し。


設定編


ブランチの保護(削除対策編)

人...

学生Pythonエンジニアが学割で無敵になる話

SN

9/6 00:15



はじめに

Pythonを使っている学生のみなさま、いかがお過ごしでしょうか。

今回はPythonを使って開発をする上で捗るソフトやツール、且つ学割があるものを集めてみました。

Pythonを最近触り始めたばかり...

GitHub学んだ事まとめ

SN

9/5 15:23

未だ複数人で作業をしたことがないので、いまいち理解できた気がしないGit。めっちゃ苦手意識あります。

備忘録として、学んだ事等を下記へまとめます。

【参考】サルでもわかるGit入門


Gitを利用した複数人...

GitHub 上でサクッと空のディレクトリを作成して commit する

SN

9/5 14:40



やり方



ローカルでディレクトリ作って commit して push して~というのが面倒なときはお試しください。

プロジェクトブランチに共用のディレクトリだけを先に用意する、みたいなときにも使えるので...

メモ:同一端末で複数のGitHubアカウントをレポ毎に別に使い分ける設定

SN

9/5 12:44

$ cd ~/.ssh

$ ls

id_rsa id_rsa.pub

既存のファイル名以外のファイル名を指定してSSH鍵生成

$ ssh-keygen -t rsa -C [メールアドレス] -f [ファイル名]

$ cat ~/.ssh/id_rsa_sub....

PR:bitflyer

bitFlyer ビットコインを始めるなら安心・安全な取引所で