Python で Google Maps Platform の Distance Matrix API を使って移動時間と距離を計算します。Distance Matrix API とは、Google Maps Platform で、移動時間と距離を計算するための API です。
スマホや PC で Google Map を使ってルート検索をしたことがあると思いますが、その時、ルートの候補や、移動時間と距離が出てくると思います。Distance Matrix API は、まさにその API です。
Contents
バージョン
- Python 3.5.4
- requests 2.21.0
インストール
まず最初に開発環境を作ります。
venv のインストール
python -m venv venv source venv/bin/activate
Python の仮想環境 venv をインストールし、アクティベートします。
requests のインストール
pip install requests
venv をアクティベートしたら、そこに requests パッケージをインストールします。
Google Maps Platform の有効化
次に、Google Maps Platform を有効化します。
https://cloud.google.com/maps-platform/routes/?apis=routes にアクセスし、「始める」をクリックすると、Google Maps Platform の有効化ウィザードが起動しますので、真ん中の「ルート」を選択し API Key を発行します。
API Key の発行には、クレジットカードの登録が必要になるかもしれません。
実装
import csv import json import requests # 入力するCSVファイル(文字コードはshift_jis) input_csvfile = 'input.csv' # 出力するCSVファイル(文字コードはshift_jis) output_csvfile = 'output.csv' # Google Map API Key apikey = 'YOUR_API_KEY' # Google Map Distance Matrix API URL api = 'https://maps.googleapis.com/maps/api/distancematrix/json' # Google Map Distance Matrix API mode mode = 'driving' # 入力するCSVファイルと出力するCSVファイルをオープン with open(input_csvfile, encoding='shift_jis') as input_csvfile_fp, open(output_csvfile, 'w', encoding='shift_jis') as output_csvfile_fp: ''' 以下の繰り返し 1. 入力CSVファイルを読み込み 2. Google Map APIにリクエスト 3. 出力CSVファイルに書き込み ''' csvfile_reader = csv.DictReader(input_csvfile_fp) for row in csvfile_reader: origins = row['src_latitude'] + ','+row['src_longitude'] destinations = row['dest_latitude']+','+row['dest_longitude'] params = { 'key': apikey, 'mode': mode, 'departure_time': 'now', 'origins': origins, 'destinations': destinations, } # Google Map APIにリクエスト raw_response = requests.get(api, params) parsed_response = json.loads(raw_response.text) # Top Level Statusのチェック # https://developers.google.com/maps/documentation/distance-matrix/intro#StatusCodes if parsed_response['status'] != 'OK': continue # 出力CSVファイルに書き込み fieldnames = ['origins', 'destinations', 'mode', 'status', 'distance', 'duration_in_traffic', 'duration'] csvfile_writer = csv.DictWriter(output_csvfile_fp, fieldnames=fieldnames) for row in parsed_response['rows']: for element in row['elements']: # Element Level Statusのチェック # https://developers.google.com/maps/documentation/distance-matrix/intro#StatusCodes if element['status'] == 'OK': distance = element['distance']['text'] duration_in_traffic = element['duration_in_traffic']['text'] duration = element['duration']['text'] else: distance = None duration_in_traffic = None duration = None print(origins, destinations, mode, element['status'], distance, duration_in_traffic, duration) csvfile_writer.writerow({ 'origins': origins, 'destinations': destinations, 'mode': mode, 'status': element['status'], 'distance': distance, 'duration_in_traffic': duration_in_traffic, 'duration': duration })
それでは実装に入ります。
作成したプログラムは、スタートとゴールの緯度経度が入っている CSV ファイル(input.csv)を元に API リクエストし、移動時間と距離を CSV ファイル(output.csv)に出力するプログラムです。
移動手段パラメータは車(driving)固定で、移動開始時刻パラメータは現在の時刻(now)固定にしています。
実装していて、つまづいたところとしては、API レスポンスが可変なので、結果を固定で扱いたい場合はステータスをチェックして、補う必要がある点(52から59行目のところ)です。あとは、特に問題なく実装できました。
動作確認
python DistanceMatrix.py 34.8472,135.607 35.6605,139.735 driving OK 475 km 5 hours 50 mins 5 hours 53 mins 34.7013,134.889 34.5795,135.471 driving OK 76.4 km 1 hour 10 mins 1 hour 16 mins 33.5176,133.535 33.5919,130.406 driving OK 577 km 7 hours 10 mins 7 hours 12 mins
cat output.csv "34.8472,135.607","35.6605,139.735",driving,OK,475 km,5 hours 50 mins,5 hours 53 mins "34.7013,134.889","34.5795,135.471",driving,OK,76.4 km,1 hour 10 mins,1 hour 16 mins "33.5176,133.535","33.5919,130.406",driving,OK,577 km,7 hours 10 mins,7 hours 12 mins
プログラムを実行すると、出力と同時に CSV ファイルへ書き込みます。
まとめ
Python で Google Maps Platform の Distance Matrix API を使って移動時間と距離を計算しました。他にも様々なパラメータがありますので、どんなことができるのか、ドキュメントをチェックしてみると面白いと思います。
また、Distance Matrix API の他にも、Google Maps Platform は様々な API を提供していますので、他の API も触ってみたいと思います。