APIKEYは各自取得して試してみてほしい。
2地点間のデータをゲットできるだけなので、複数の経路がある場合に対しては、緯度経度のデータをあらかじめ作っておいて、繰り返しリクエストする必要がある。
import json, urllib
from datetime import datetime as dt
# APIキー (自分で取るのが望ましい)
APIKEY = ""
# 出発地
# 県庁前
Lat1 = "35.665292"
Lon1 = "138.567933"
# 目的地
# 気象台東
Lat2 = "35.667866"
Lon2 = "138.555587"
# 出発時間
now = dt.now()
departure_time_unix = int(dt.now().timestamp())
url = ("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric" +
"&departure_time=" + str(departure_time_unix) + # 出発予定時刻(Unixtime(UTC))
"&traffic_model=" + "best_guess" + # 最適な旅行時間
"&origins=" + str(Lat1) + "," + str(Lon1) + # 出発地緯度経度
"&destinations=" + str(Lat2) + "," + str(Lon2) + # 到着地緯度経度
"&key=" + APIKEY)
req = urllib.request.Request(url)
res = urllib.request.urlopen(req)
json_data = res.read().decode('utf8')
url_obj = urllib.request.urlopen(url)
# 日本語文字など多国言語文字コードはutf8が標準
json_data = url_obj.read().decode('utf8')
# json形式のデータを辞書に変換
json_dict = json.loads(json_data)
# データの内容を確かめる
json_dict
# 必要な項目だけを取りだす
data1 = json_dict['rows'][0]['elements'][0]
print(now.strftime("%Y/%m/%d %H:%M:%S") + ","
+ str(data1['distance']['value']) + ","
+ str(data1['duration']['value']) + ','
+ str(data1['duration_in_traffic']['value']))
テストとして、飯田通り・県庁前ー気象台東間の双方向データを取ってみる (もっと簡潔に書けるのだがとりあえず。)
12/05の昼ころより、20分間隔でデータを取り始めている。 そのデータは、8topsの/ssd/toyoki/googleData/iida/iidaBothTrafficByGoogle.csv に置いてある。(簡単には、下の方にあるスクリプトにより、jupyterでも閲覧できる。)
以下は、古い初期バージョンである。
より洗練されたコードについては、城東通りや白州エリアの流動分析のノートブックを参照してほしい。</span>
下の飯田通のデータ表示については、活きている。
#!/usr/bin/env python3
import json
import urllib.request
from datetime import datetime as dt
import csv
def getTraffic(url):
req = urllib.request.Request(url)
try:
with urllib.request.urlopen(req) as res:
json_data = res.read().decode('utf8')
json_dict = json.loads(json_data)
data1 = json_dict['rows'][0]['elements'][0]
return data1
except urllib.error.HTTPError as e:
# Status codeでエラーハンドリング
if e.code >= 400:
print(e.reason)
else:
raise e
# APIキー (自分で取るのが望ましい)
APIKEY = ""
# ####双方向####
# 気象台東(1)
Lat1 = "35.667866"
Lon1 = "138.555587"
# 県庁前 (2)
Lat2 = "35.665292"
Lon2 = "138.567933"
# 出発時間
now = dt.now()
departure_time_unix = int(dt.now().timestamp())
url1 = ("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric" +
# 出発予定時刻(Unixtime(UTC))
"&departure_time=" + str(departure_time_unix) +
"&traffic_model=" + "best_guess" + # 最適な旅行時間
"&origins=" + str(Lat1) + "," + str(Lon1) + # 出発地緯度経度
"&destinations=" + str(Lat2) + "," + str(Lon2) + # 到着地緯度経度
"&key=" + APIKEY)
url2 = ("https://maps.googleapis.com/maps/api/distancematrix/json?units=metric" +
# 出発予定時刻(Unixtime(UTC))
"&departure_time=" + str(departure_time_unix) +
"&traffic_model=" + "best_guess" + # 最適な旅行時間
"&origins=" + str(Lat2) + "," + str(Lon2) + # 出発地緯度経度
"&destinations=" + str(Lat1) + "," + str(Lon1) + # 到着地緯度経度
"&key=" + APIKEY)
data1 = getTraffic(url1)
data2 = getTraffic(url2)
# ファイルへの追加
with open("/ssd/toyoki/googleData/iida/iidaBothTrafficByGoogle.csv", "a") as f:
writer = csv.writer(f)
writer.writerow([now.strftime("%Y/%m/%d %H:%M:%S"),
str(data1['distance']['value']),
str(data1['duration']['value']),
str(data1['duration_in_traffic']['value']),
str(data2['duration']['value']),
str(data2['duration_in_traffic']['value'])])
# 8tops上で採取しているデータの閲覧
import pandas as pd
df = pd.read_csv("/ssd/toyoki/googleData/iida/iidaBothTrafficByGoogle.csv",sep=",",skipinitialspace=True)
df.head()
df.tail()
df.plot(x='date', y=['east_bound','west_bound'], figsize=(16,8))
# これまでに得られた日にちについて時刻ごとに平均した値 (平日、休日を分けたほうが良いのだが)
df['date_obj'] = pd.to_datetime(df['date']) # dateは文字列なので、datetime型の列を新設
df['hour_min'] = df['date_obj'].dt.strftime("%H:%M") # 時分の文字列の列を新設
# groupbyによる平均値計算mean()を行うとマルチインデックスのデータ構造になる
# reset_index()によりマルチインデックスが解除になる
mean_df = df.groupby('hour_min').mean().reset_index()
mean_df
# 取得期間を平均した日変位データmean_dfをプロット
import matplotlib.pyplot as plt
plt.rcParams["font.size"] = 14
fig, ax = plt.subplots(figsize=(10, 5))
mean_df.plot(x='hour_min', y=['east_bound','west_bound'], lw=2, ax=ax)
ax.set_title("県庁前 - 気象台東 所要時間(秒)")
# 移動平均 (1:00のデータを0:40, 1:00, 1:20の平均値とする)
# 1:00 - 2:00 の平均値としては (a_0 + 2a_1 + 2a_2 + a_3)/6のような計算が望ましい
tmp = mean_df.set_index('hour_min')
mean_df1 = tmp.rolling(3, center=True, min_periods=1).mean().reset_index()
mean_df1.head()
mean_df1.plot(x='hour_min', y=['east_bound','west_bound'], figsize=(16,8),fontsize=14)