[Python] Google Maps APIによる車通勤時間の取得



この記事で分かること

  • 「PythonでGoogle Maps APIを用いて車通勤時間を調べたい人」に向けた記事です。

  • 複数の出発点から目的地までの所要時間・移動距離を調べるのに便利です。

  • matplotlibで可視化も容易です。

ライブラリインポート、変数・関数定義

#%%
import numpy as np
import matplotlib.cm as cm
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "MS Gothic"
import requests

#%%
def ido_keido(ido,keido):
    return str(ido) + "," + str(keido)

# %%
def map(origin, destination):
    API_KEY = "" # APY KEYを適宜入れてください
    url = "https://maps.googleapis.com/maps/api/directions/json?"\
        +f"origin={origin}&"\
        +f"destination={destination}&"\
        +f"departure_time=now&"\ 
        +f"key={API_KEY}"

    res = requests.get(url)
    result = res.json()

    if result['status'] == 'OK':
        routes = result["routes"][0]
        legs = routes["legs"][0]
        distance = legs["distance"]["value"]/1000 # km
        duration = legs["duration_in_traffic"]["value"]/60 # min #departure_time=nowによる現在の情報
        #duration = legs["duration"]["value"]/60 # min # 時間によらない情報
        return distance,duration
    else:
        print(f"ルートが見つかりませんでした。")
        return None

関数map(origin, destination) 出発地、目的地を引数にとって、移動距離と所要時間を返す関数です。

出発地、目的地は日本語でOKです。
また、関数ido_keido(ido,keido)により緯度・経度をmap()の引数にすることもできます。
(次のセクションで例を出します)

ここでは、変数urlにdeparture_time=nowをつけ、またlegs["duration_in_traffic"]["value"]/60として、duration_in_trafficを指定することで現時点での情報を取得し、返しています

時間によらない結果が欲しい場合は、legs["duration"]["value"]/60とすればOKです。
(+f"destination={destination}&"\ の行をコメントアウトしても構いません)

※Google Maps APIの登録については外部関連サイトを参照ください

動作テスト

さっそく使ってみましょう。

ここでは名古屋市のマンションからデンソーまでの距離と時間を取得してみます。

origin = "プレミスト泉レジデンス"
destination= "デンソー先端技術研究所"
distance,duration = map(origin, destination)
print(distance,duration)
#(19.332, 30.85) # 移動距離(km), 所要時間(min)

google mapで手動で取得したものと同じ結果が得られました。
手動もスクリプトもdeparture_time=nowで現時点の情報を取得しているためです。


関数ido_keido(ido,keido)を用いると緯度・経度を直接指定することもできます。
位置が微妙にずれてますがほぼ同じ結果になります。

#%%
map(ido_keido(35.176825, 136.915061), ido_keido(35.123035, 137.075654))
# (19.417, 29.9) # 移動距離(km), 所要時間(min)

複数の出発点を調べてプロット

出発地点を複数用意して、それぞれの結果をプロットしてみます。
for文を使って各出発点の移動距離・所要時間をリストlist_dist, list_duraに入れるスクリプトです。

#%%
origins = ["プレミスト泉レジデンス",
        "プラウドタワー覚王山",
        "プラウド一社パークフロント",
        "グランドメゾン桜山菊園町",
        "グランドメゾン熱田の杜C棟",
        "プラセシオン徳重"
        "ソフィア共和 ",
        ]
destination= "デンソー先端技術研究所"

#%%
list_dist = []
list_dura = []
for origin in origins:
    distance,duration = map(origin,destination)
    list_dist.append(distance)
    list_dura.append(duration)

結果をいくつかプロットしてみましょう。各出発点の所要時間を棒グラフで描きます。

# %%
fig,ax = plt.subplots()
for n, origin in enumerate(origins):
    distance,duration = list_dist[n],list_dura[n]
    ax.bar(origin,duration, label=origin)
ax.set_ylabel("時間 (min)")
plt.xticks(rotation=35)


移動距離と所要時間をプロットする例です。

#%%
fig,ax = plt.subplots(figsize=(5,5))
for n, origin in enumerate(origins):
    distance,duration = list_dist[n],list_dura[n]
    ax.scatter(distance,duration, label=origin)
plt.legend(bbox_to_anchor=(1.05, 1),loc='upper left')
ax.set_xlabel("距離 (km)")
ax.set_ylabel("時間 (min)")
ax.set_title(f"{destination}")


この記事が気に入ったらサポートをしてみませんか?