[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}")
この記事が気に入ったらサポートをしてみませんか?