グーグルマップの「所要時間」を得るための情報を分解する

  • グーグルマップのルート検索・所要時間情報はかなり正確
  • グーグルマップの利用者で位置情報を提供している人の情報をリアルタイムで収集し、その人が歩いているのか、車に乗っているのかなども判断したうえで、各道路の進み具合を計算し(それを色で表示し)、それらの積分値として所要時間を出すらしい
  • 指定の日時での出発・到着に関する調べ物も可能で、その場合は(おそらく、過去の同一条件日(時刻や曜日)での情報を同様に集計して返してきているようだ。日時指定の場合は幅をもって所要時間が返ってくるので、情報を分布として収集してそのクオンタイルなどを出しているのだと思われる
  • じゃあ、その検索を「自動化」するかもしれないとして、どうやったらできるかのための情報収集をしてみることにする
  • 例えば、銀閣寺から金閣寺までの所要時間情報を取りたいとする
  • グーグルクロームGUIでその作業をやれば以下のようになる

f:id:ryamada:20220121151802p:plain

  • このURLを引っ張り出してくると…
https://www.google.co.jp/maps/dir/%E6%9D%B1%E5%B1%B1%E6%85%88%E7%85%A7%E5%AF%BA%E3%80%81%E3%80%92606-8402+%E4%BA%AC%E9%83%BD%E5%BA%9C%E4%BA%AC%E9%83%BD%E5%B8%82%E5%B7%A6%E4%BA%AC%E5%8C%BA%E9%8A%80%E9%96%A3%E5%AF%BA%E7%94%BA%EF%BC%92/%E9%87%91%E9%96%A3%E5%AF%BA%E3%80%81%E3%80%92603-8361+%E4%BA%AC%E9%83%BD%E5%BA%9C%E4%BA%AC%E9%83%BD%E5%B8%82%E5%8C%97%E5%8C%BA%E9%87%91%E9%96%A3%E5%AF%BA%E7%94%BA%EF%BC%91/@35.0347898,135.728705,13z/data=!3m1!4b1!4m14!4m13!1m5!1m1!1s0x600109050b426fe1:0x258aca1ce888abc9!2m2!1d135.7982058!2d35.0270213!1m5!1m1!1s0x6001a820c0eb46bd:0xee4272b1c22645f!2m2!1d135.7292431!2d35.03937!3e0!5m1!1e1?hl=ja
  • いかにも、エンコーディングで読めなくなっているっぽい部分が大量にある
  • これらはあってもなくても多分大丈夫だろうと予想がつく
  • 実際、この文字化けらしき部分を取り除いて、以下のようにしても、地図は得られる
https://www.google.co.jp/maps/dir//@35.0347898,135.728705,13z/data=!3m1!4b1!4m14!4m13!1m5!1m1!1s0x600109050b426fe1:0x258aca1ce888abc9!2m2!1d135.7982058!2d35.0270213!1m5!1m1!1s0x6001a820c0eb46bd:0xee4272b1c22645f!2m2!1d135.7292431!2d35.03937!3e0!5m1!1e1?hl=ja
  • さて。余計な部分を削ったので、さらに調べることとする
  • 大事なのは、「地点」を特定する情報で、それは緯度経度。その情報が
@35.0347898,135.728705,13z
d135.7982058!2d35.0270213
d135.7292431!2d35.03937
  • の当たりなのは、京都市の緯度が北緯35度くらいで経度が統計135度くらいであることを知っているから
  • ちなみに、地図を表示して、経路を表示するために必要な位置特定情報は(1)地図の描画位置を決めるための情報と、(2)経路の始点情報と(3)経路の終点情報
  • 上の3つの緯度・経度情報のうち、@で始まる方が描画位置のための情報で、残り2つが経路の始点終点のそれであることは、始点終点の緯度経度を調べればわかる
  • ただし、この数字を変えただけでは、地図等の表示が変わらないので、何かしら数字ではないところの情報を使って全体として何かをコントロールしている模様だが、今はそこには興味がないので放っておく
  • ちなみに
@35.0347898,135.728705,13z
  • の 13z は表示時の拡縮パラメタになっており、数字が大きいほど狭い範囲をズームインして表示させる
  • ルート検索のオプションで、出発時刻を「2022年1月1日午前9時」にしてやると、以下のように変わる
https://www.google.co.jp/maps/dir/''/''/@35.0345774,135.728705,13z/data=!3m1!4b1!4m18!4m17!1m5!1m1!1s0x600109050b426fe1:0x258aca1ce888abc9!2m2!1d135.7982058!2d35.0270213!1m5!1m1!1s0x6001a820c0eb46bd:0xee4272b1c22645f!2m2!1d135.7292431!2d35.03937!2m3!6e0!7e2!8j1641027600!3e0!5m1!1e1?hl=ja
  • 丁寧に比べると
35.03937!3e0!5m1!1e1
35.03937!2m3!6e0!7e2!8j1641027600!3e0!5m1!1e1
  • に変わっていることがわかる
  • 35.03937! は緯度情報で共通で、後半の !3e0!5m1!1e1 も共通である。違っているのは、次の文字列が挿入されていること
2m3!6e0!7e2!8j1641027600
  • 今、出発時刻を1分、遅らせると
35.03937!2m3!6e0!7e2!8j1641027660!3e0!5m1!1e1
  • となる。変わったのは
1641027600
1641027660
  • と、+60 されたこと。1分後倒しにして、+60されたということは、これは「60秒」のことと予想がつく
  • 実際、60 x 60 x 24 = 86400 秒を足すと、24時間=1日後倒しになる。
  • さて、今度は、出発時刻を指定する代わりに到着時刻を指定することにする。到着時刻を2022年1月1日の午前9時にすると
35.03937!2m3!6e1!7e2!8j1641027600!3e0!5m1!1e1
  • となる。1641027600は元に戻り、代わりに次のような変化がある。0 --> 1である。これが「出発=0」「到着=1」
6e0
6e1
  • ひとまず、こんな感じで、出発・到着時刻は文字列レベルでパラメタライズできることが分かった
  • もし、コマンドラインで情報を取って集計したりするのであれば、今度は出力側の表示情報(例えば、所要時間)をどうやってGUIからテキストに落とすのかを考えればよさそう・・・(ブラウザに表示されている内容のhtml文書をテキスト表示してみたが、そこには情報は埋まっていないようなので、ひとまず、この調査はここでいったん、終了)