Google Maps API で営業ルートを最適化!複数地点を近い順に自動並び替え

  • URLをコピーしました!
目次

はじめに

営業回りや設備の定期点検、あるいは旅行の計画など……。 「ここに行って、次あそこに行って」と、Google マップとにらめっこしながら手動でルートを組む作業に、多くの時間を奪われていませんか?

「出発地から近い順に、自動で並び替えてくれたらいいのに」

Google Maps APIPython を使えば解決できます。 本記事では、リストアップされた住所を読み込み、「出発地から近い順に並び替えて、Google マップのルート案内 URL を発行する」までを全自動化するツールの作り方を紹介します。

この記事でわかること
  • Google Maps API(Distance Matrix)の基礎知識
  • Python で位置情報を計算し、最適ルートを導き出すコード
  • コピペですぐに使える自動化スクリプトの実装例

使用する技術: Google Maps API とは?

Google Maps API は、Google マップが持つ強力な地図データや経路探索の機能を、外部のプログラムから利用できるようにする仕組みです。 今回のツールでは、主に以下の2つの機能を組み合わせて実現します。

Distance Matrix API

「A 地点から B 地点まで、どれくらい離れているか?」 を計算する API です。単なる直線距離ではなく、道路網に基づいた実際の「移動距離」や「所要時間」を正確に算出できるのが特徴です。今回はこれを使って、出発地と各目的地の距離をチェックします。

Google Maps URLs(Directions)

「計算結果をもとに、実際にナビを開始する」 ための機能です。 Python で計算した「最適な順番」を、Google マップが理解できる URL 形式(Directions リンク)に変換します。この URL をクリックするだけで、PC やスマホの Google マップ アプリが立ち上がり、すぐにナビゲーションを開始できます。

事前準備: API キーとライブラリのインストール

スクリプトを作成する前に、Google のサービスを利用するための準備を行います。

STEP
Google Cloud Platform(GCP)で API キーを取得

Google Maps API を利用するには、Google Cloud Platform (GCP) プロジェクトを作成し、API キーを発行する必要があります。

大まかな流れは以下の通りです。

  1. Google Cloud Console にアクセスし、新しいプロジェクトを作成します。
  2. 「API とサービス」 のライブラリから、以下の API を検索して 「有効」 にします。
    • Distance Matrix API (※今回のスクリプトで必須です)
  3. 「認証情報」から API キー を作成します。
    • ※発行されたキー(AIzaSy... で始まる文字列)は、後のプログラムで使用するため控えておいてください。

Google Maps API の利用には、GCP 側で請求先アカウント(クレジットカード情報など)の紐付けが必要です。ただし、毎月 200 ドル分(約2〜3万円分)の無料枠があるため、個人の学習や小規模な業務利用の範囲であれば、実質無料で使えるケースが大半です。

STEP
Python ライブラリのインストール

次に、Python から Google Maps API を簡単に扱えるようにするための公式クライアントライブラリをインストールします。

コマンドプロンプト(Windows)またはターミナル(Mac/Linux)を開き、以下のコマンドを実行してください。

pip install googlemaps

これで、Python のプログラム内で import googlemaps と記述するだけで、複雑な API 通信をわずか数行で実装できるようになります。

ルート最適化スクリプトの作成

準備が整ったら、スクリプトを作成していきます。 手順は「訪問先リストを作る」「プログラムを実行する」の2ステップだけです。

STEP
目的地のリスト作成(target.txt)

まずは、訪問したい場所のリストをテキストファイルで作成します。 ファイル名は target.txt とし、プログラムと同じフォルダに保存してください。

記述ルール: 住所,場所名 の形式で1行ずつ記述します。

千葉県浦安市舞浜1-1-24,ボン・ヴォヤージュ
千葉県浦安市舞浜1-4,イクスピアリ
千葉県浦安市舞浜29-1,ビビディ・バビディ・ブティック
千葉県浦安市舞浜1-13,東京ディズニーシー
千葉県浦安市舞浜2-50,舞浜アンフィシアター

※Excel などで管理している場合は、CSV 形式で保存するか、テキストエディタにコピペして整形してください。

STEP
Python コード本体(maps_search.py)

次に、メインとなる Python プログラムを作成します。 以下のコードをコピーし、maps_search.py という名前で保存してください。

import googlemaps
import urllib.parse

def main():
    # =========================================================
    #  設定エリア
    # =========================================================
    # 取得した API キーをここに貼り付けてください
    API_KEY = 'YOUR_API_KEY'
    
    # 出発地点の住所
    START_ADDRESS = '千葉県浦安市舞浜1-1'
    
    # 移動手段 (driving:車, walking:徒歩, bicycling:自転車, transit:交通機関)
    TRAVEL_MODE = 'walking'
    
    # 読み込むファイル名
    TARGET_FILE = 'target.txt'
    # =========================================================

    try:
        # Google Maps クライアントの初期化
        gmaps = googlemaps.Client(key=API_KEY)

        # 1. 目的地リストの読み込み
        with open(TARGET_FILE, 'r', encoding='utf-8') as file:
            # 空行を除去しながら読み込む
            lines = [line.strip() for line in file if line.strip()]

        if not lines:
            print("エラー: 目的地ファイルの中身が空です。")
            return

        # 住所と名称の分離
        dest_addresses = []
        dest_names = []
        
        for line in lines:
            # カンマで区切って住所と名称を取得
            parts = line.split(',')
            if len(parts) >= 2:
                dest_addresses.append(parts[0])
                dest_names.append(parts[1])
            else:
                # 名称がない場合は住所をそのまま名称にする
                dest_addresses.append(parts[0])
                dest_names.append(parts[0])

        print(f"[{len(dest_addresses)}] 件の目的地までの距離を計算中...")

        # 2. Distance Matrix API で距離と時間を取得
        # origins=出発地, destinations=目的地のリスト
        matrix_result = gmaps.distance_matrix(
            origins=[START_ADDRESS], 
            destinations=dest_addresses, 
            mode=TRAVEL_MODE
        )

        # APIレスポンスのステータス確認
        if matrix_result['status'] != 'OK':
            print("APIエラーが発生しました。設定や通信環境を確認してください。")
            return

        # 3. 結果の抽出と整理
        results = []
        elements = matrix_result['rows'][0]['elements']
        
        for i, element in enumerate(elements):
            if element['status'] == 'OK':
                # 距離 (メートル) を取得
                distance_val = element['distance']['value']
                results.append({
                    'name': dest_names[i],
                    'address': dest_addresses[i],
                    'distance': distance_val
                })
            else:
                print(f"警告: '{dest_names[i]}' へのルートが見つかりませんでした。")

        # 4. 距離が短い順(昇順)に並び替え
        sorted_results = sorted(results, key=lambda x: x['distance'])

        # 5. 結果の表示と URL 生成
        print("\n--- 最適化された訪問順序(出発地に近い順) ---")
        
        # Google Maps のルート案内 URL のベース
        base_url = "https://www.google.com/maps/dir/"
        
        # URL 用に日本語をエンコード (例: 東京 -> %E6%9D%B1%E4%BA%AC)
        url_parts = [urllib.parse.quote(START_ADDRESS)]
        
        for item in sorted_results:
            print(f"{item['name']}: {item['distance']} meters")
            # 経由地として住所を追加
            url_parts.append(urllib.parse.quote(item['address']))

        # パーツをスラッシュで結合して URL を完成させる
        full_url = base_url + "/".join(url_parts)

        print("\n--- Google Maps Route URL ---")
        print(full_url)

    except Exception as e:
        print(f"予期せぬエラーが発生しました: {e}")

if __name__ == "__main__":
    main()

コードの解説: 仕組みについて

今回紹介したスクリプトには、大きく分けて2つの仕組みが使われています。 ここを理解しておくと、自分好みにカスタマイズする際に役立ちます。

なぜ「近い順」になるのか?(ソートのロジック)

Distance Matrix API から返ってくるデータは、単なる「場所と距離の羅列」であり、順番はバラバラ(またはリストの記述順)です。 これを「近い順」に並び替えているのが、以下のコードです。

# 辞書型でデータをまとめる
results.append({
    'name': dest_names[i],     # 場所名
    'address': dest_addresses[i], # 住所
    'distance': distance_val   # 出発地からの距離 (メートル)
})

# 距離を基準に昇順(小さい順)に並び替える魔法の1行
sorted_results = sorted(results, key=lambda x: x['distance'])
  • 辞書リスト化: まず、場所ごとの情報をひとまとめ(辞書型)にします。
  • sorted 関数: Python 標準の並び替え関数です。
  • key=lambda x: x['distance']: ここがポイントです。「データの何を基準に並べるの?」という命令に対し、「distance(距離)の数字を見て、小さい順に並べて!」と指定しています。

これにより、人間が手作業で比較しなくても、瞬時に一番近い場所が先頭に来るようにデータが整列します。

文字化け回避「URL エンコード」について

Web ブラウザの URL(アドレスバー)は、基本的に「半角英数字」しか理解できません。 そのため、以前のコードのように 千葉県... といった日本語をそのまま URL に混ぜると、環境によってはリンクが正しく開かなかったり、文字化けしてエラーになったりすることがあります。

そこで登場するのが urllib.parse.quote です。

# 日本語「千葉県」などを、URLで使える「%E5%8D%83...」等の記号に変換
url_parts.append(urllib.parse.quote(item['address']))

この処理を通すことで、日本語の住所が機械にとって読みやすい形式(パーセントエンコーディング)に変換されます。 これにより、PC でもスマホでも、OS を問わず確実に Google マップが開く「壊れにくいリンク」を作ることができます。

実行結果と活用のヒント

実際にスクリプトを動かすと、どのような結果が得られるのか見てみます。

コンソール出力結果

ターミナル(またはコマンドプロンプト)でスクリプトを実行すると、API と通信を行い、計算結果が表示されます。

[5] 件の目的地までの距離を計算中...

--- 最適化された訪問順序(出発地に近い順) ---
東京ディズニーシー: 497 meters
舞浜アンフィシアター: 1102 meters
イクスピアリ: 1374 meters
ビビディ・バビディ・ブティック: 1957 meters
ボン・ヴォヤージュ: 2475 meters

--- Google Maps Route URL ---
https://www.google.com/maps/dir/...

バラバラに入力した目的地が、出発地(舞浜1-1)に近い順に見事にソートされました。

Google マップでの挙動

生成された URL をクリックすると、Web ブラウザまたは Google マップ アプリが起動します。

このように、「出発地」→「一番近い場所」→「その次に近い場所」… という経由地が既にセットされた状態で地図が開きます。あとは「ナビ開始」ボタンを押すだけ。 手動で一つひとつ目的地を追加していた苦労はなく、自動でルート作成が完了します。

活用のヒント

移動手段の切り替え(TRAVEL_MODE)

今回のコードでは walking(徒歩)を設定していますが、業務によっては「車」や「電車」を使いたい場合もあるでしょう。 コード内の以下の部分を書き換えるだけで変更可能です。

# driving:車, walking:徒歩, bicycling:自転車, transit:公共交通機関
TRAVEL_MODE = 'driving'

driving にすると、一方通行や渋滞情報も考慮したルート計算になります。

件数が多い場合の注意点

Google Maps の仕様上、1つの URL で設定できる経由地の数には上限があります(通常、出発・到着を含めて最大 10〜25 箇所程度)。 もし 50 件、100 件といった大量のリストを処理したい場合は、リストを分割して URL を生成するか、API の仕様に合わせてコードを拡張する必要があります。

まとめ

本記事では、Google Maps API と Python を活用して、複数の目的地を効率よく回るためのルート作成自動化ツールを紹介しました。

  • 自動化のメリット: 手作業での検索・並び替え時間をゼロにする。
  • API の威力: 正確な距離と所要時間に基づいた、無駄のないルートを導き出せる。
  • 汎用性: 観光だけでなく、営業周り、配送、設備点検など、移動業務に応用可能

以上、最後までお読みいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

インフラ(クラウド/NW/仮想化)から Web 開発まで、技術領域を横断して活動するエンジニア💻 コンシューマー向けエンタメ事業での新規開発・運営経験を活かし、実戦的な技術ノウハウを発信中

[ Certs ] CCIE Lifetime Emeritus / VCAP-DCA ✒️ [ Life ] 技術書・ビジネス書愛好家📖 / 小・中学校で卓球コーチ👟

目次