Google Maps API を利用して、指定した地点間の移動距離と時間を取得しよう!【Python】
概要
Google Maps API を利用して、指定した地点間の移動距離と時間を取得し、それを Excel ファイルに出力する方法をご紹介します。各ルートの距離や移動時間を事前にリストで把握できるため、マップ化した際にもわかりやすく役立ちます。
インプットデータの用意
まず最初に移動距離と時間のリストを作成します。イメージは下記の通りです。場合によっては数万行あるかもしれません。
この情報を元にGoogle Maps API を活用して、移動距離と時間を求めていきます。
普通にGoogle MAPを利用した際に、表示される移動距離と移動時間を一気に求めます。
データ量が多いと一つ一つ手動で検索して求めるのはなかなか大変かと思いますが、このコードを活用すれば、リストに対してこの赤枠を自動で取得してくれます。
1.必要なライブラリのインポート
import requests
import json
import pandas as pd
import openpyxl as ox
from googlemaps.client import Client
from googlemaps.distance_matrix import distance_matrix
requests: HTTP リクエストを送信するためのライブラリです。Google Maps API からデータを取得するために使用します。
json: JSON データの操作を行う標準ライブラリです。Google Maps API から取得したレスポンスデータを Python のデータ形式に変換します。
pandas: データ操作や分析のためのライブラリです。Excel ファイルからデータを読み込み、重複データの削除などの前処理を行います。
openpyxl: Excel ファイルを読み書きするためのライブラリです。計算結果を Excel シートに書き込み、ファイルとして出力します。
googlemaps.client.Client: Google Maps API を操作するためのクライアントライブラリです。本コードでは使われていませんが、distance_matrix 関数を呼び出す際に使用できます。
2.地理座標を表すクラス (MapCoordinate) の定義:
緯度 (latitude) と経度 (longitude) を属性として持ち、位置情報をフォーマット済みの文字列で返すメソッド position() を持ちます。
class MapCoordinate:
def __init__(self, latitude, longitude):
self.latitude = latitude
self.longitude = longitude
def position(self):
return "{0},{1}".format(self.latitude, self.longitude)
3.ルート情報を設定するクラス (MapRoute) の定義:
出発地点 (src) と目的地 (dest)、移動モード(driving など)を指定し、API 呼び出し用のパラメータを保持するクラスです。
class MapRoute:
mode_driving = "driving"
mode_walking = "walking"
mode_bicycling = "bicycling"
mode_transit = "transit"
def __init__(self, src, dest, mode):
self.src = src
self.dest = dest
self.mode = mode
self.lang = "ja"
self.units = "metric"
self.region = "ja"
4.Google Maps API からの経路情報取得 (getGoogleMapDirection):
Google Maps API キーを使用して、指定した出発地点と目的地の間の距離と時間を取得します。
requests ライブラリを使用して HTTP リクエストを行い、params パラメータにルート情報を設定して API にアクセスします。
APIからのレスポンスが正常(ステータスコードが200)の場合は、取得したデータをJSON形式で返し、エラーが発生した場合はその内容を表示して例外処理を行います。
def getGoogleMapDirection(route):
api_key = "your_api" # APIキーをここに入力してください
url = "https://maps.googleapis.com/maps/api/directions/json"
params = {
'origin': route.src.position(),
'destination': route.dest.position(),
'mode': route.mode,
'language': route.lang,
'units': route.units,
'region': route.region,
'key': api_key
}
response = requests.get(url, params=params)
if response.status_code == 200:
return response.json()
else:
response.raise_for_status()
5.Excel ファイルへの出力設定
openpyxl を使用し、結果を書き込むための Excel ブックとシートを準備します。各列に項目名(From、To、距離、時間)を設定します。
result_book = ox.Workbook()
sheet = result_book.active
sheet["B1"].value = "A" # 発地(From)の列見出し
sheet["C1"].value = "B" # 着地(To)の列見出し
sheet["D1"].value = "distance" # 距離の列見出し
sheet["E1"].value = "time" # 時間の列見出し
6.データの読み込みと前処理
pandas を使用して Excel ファイルからデータを読み込み、重複データがあれば重複を削除します。
df = pd.read_excel("hoge_hoge.xlsx")
df = df[~df.duplicated()]
7.各地点間の距離と時間の計算:
データフレームの各行を処理し、出発地点と目的地を MapCoordinate オブジェクトとして設定し、getGoogleMapDirection でルート情報を取得します。API からの応答を解析し、距離(distance)と時間(atobtime)を抽出します。エラーが発生した場合は、0 を設定します。
# データフレームの各行を処理
for index, row in df.iterrows():
# 出発地と目的地の座標を取得
origin = MapCoordinate(row[1], row[2]) # 出発地
destination = MapCoordinate(row[4], row[5]) # 目的地
# ルート情報を設定
route = MapRoute(origin, destination, MapRoute.mode_driving)
# Google Maps APIからルート情報を取得
direction_data = getGoogleMapDirection(route)
# 距離と時間を初期化
distance = 0
duration = 0
# 距離と時間の情報を取得
try:
distance = direction_data['routes'][0]['legs'][0]['distance']['value']
except (KeyError, IndexError):
# APIのレスポンスが期待通りでない場合、距離を0に設定
pass
try:
duration = direction_data['routes'][0]['legs'][0]['duration']['value']
except (KeyError, IndexError):
# APIのレスポンスが期待通りでない場合、時間を0に設定
pass
# Excelシートにデータを書き込み
sheet[f"B{cell_row_no}"].value = row[0] # 出発地点
sheet[f"C{cell_row_no}"].value = row[3] # 到着地点
sheet[f"D{cell_row_no}"].value = distance # 距離
sheet[f"E{cell_row_no}"].value = duration # 時間
# 次の行に移動
cell_row_no += 1
8.Excel ファイルの保存
result_book.save("hoge_hoge_result.xlsx")
このツールは、出発地点と目的地の緯度経度情報から距離と時間を計算し、Excel に出力する機能を提供しています。
Google Maps API を利用することで、たくさんルートがあった場合でも対応することができます。
是非、活用してみてください。