Python で Google Maps Platform の Distance Matrix API を使って移動時間と距離を計算する

Python で Google Maps Platform の Distance Matrix API を使って移動時間と距離を計算します。Distance Matrix API とは、Google Maps Platform で、移動時間と距離を計算するための API です。

スマホや PC で Google Map を使ってルート検索をしたことがあると思いますが、その時、ルートの候補や、移動時間と距離が出てくると思います。Distance Matrix API は、まさにその API です。

バージョン

  • 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 も触ってみたいと思います。