見出し画像

拠点の視覚化ツール:住所リストをマップに表示する【Python】

概要

物流業界では、拠点の住所が分かっていても、それぞれの位置関係を正確に把握していないことが多いと感じます。そこで、住所リストをマップ上に表示し、各拠点にピンを立てるプログラムを作成しました。このプログラムを使うことで、拠点間の地理的な位置関係を一目で視覚的に確認できます。

インプットデータについて

埼玉県内にある道の駅のリスト

エクセルには、以下のようなデータが含まれています。

  • 駅名: 拠点や施設の名前

  • 所在地: 各拠点の住所

このデータをPythonに読み込ませて、各拠点の住所を基に緯度・経度を取得し、地図にピンを立てるプログラムを作成します。

コードと解説

1. 必要なライブラリのインポート

import pandas as pd
import requests
import folium

解説:

  • Pandas は、Excelファイルを読み込んでデータフレームに変換するために使用します。

  • Requests は、Google Geocoding APIにリクエストを送信して、住所に対応する緯度・経度を取得するために使用します。

  • Folium は、地図にピンを立てるためのライブラリで、緯度・経度に基づいた視覚的なマッピングを実現します。

2. APIキーの設定

# APIキー(Google Cloud Consoleから取得)
API_KEY = "Your_API_key"

解説: ここでは、Google Cloudから取得したAPIキーを設定します。このAPIキーを使用して、Geocoding APIにアクセスし、住所から緯度・経度を取得します。

3. Excelファイルの読み込み

# Excelファイルを読み込む
df = pd.read_excel("address.xlsx")

解説: pd.read_excel() を使って、Excelファイルから住所データを読み込みます。このExcelファイルには、各拠点の住所や関連情報が含まれており、それをデータフレーム形式で処理します。

4. 地図オブジェクトの初期化

# 地図オブジェクトを初期化(初期位置とズームレベルを設定)
m = folium.Map(location=[35.6895, 139.6917], zoom_start=10)

解説: folium.Map() を使用して、地図の初期位置(ここでは東京)とズームレベルを設定します。これにより、地図が表示される範囲や視点を指定します。location パラメータには、地図の中心となる緯度・経度を指定します。

5. 各住所にピンを立てる処理(全体のコード)

# DataFrameの各行に対してピンを立てる
for index, row in df.iterrows():
    address = row['所在地']
    color = row['カラー']
    
    # Geocoding APIで住所から緯度と経度を取得
    response = requests.get(f"https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={API_KEY}")
    geodata = response.json()
    
    if geodata['status'] == 'OK':
        lat = geodata['results'][0]['geometry']['location']['lat']
        lng = geodata['results'][0]['geometry']['location']['lng']
        
        # 地図にピンを立てる
        folium.Marker(
            [lat, lng],
            popup=row['駅名'],
            icon=folium.Icon(color=color)
        ).add_to(m)

# 地図を表示
m.save("address_output.html")

上記で全体のコードを提示していますが、一つ一つ解説していきます。

解説:

iterrows() メソッドを使用して、データフレーム内の各行(拠点の情報)に対して処理を行います。各行には、住所(所在地)とピンの色(カラー)などの情報が含まれています。このループ内で、それぞれの住所に基づいてピンを立てます。

各住所にピンを立てる処理

# DataFrameの各行に対してピンを立てる
for index, row in df.iterrows():
    address = row['所在地']

iterrows() メソッドを使用して、データフレーム内の各行(拠点の情報)に対して処理を行います。各行には、住所(所在地)の情報が含まれています。このループ内で、それぞれの住所に基づいてピンを立てます。

Geocoding APIを使った緯度・経度の取得

    # Geocoding APIで住所から緯度と経度を取得
    response = requests.get(f"https://maps.googleapis.com/maps/api/geocode/json?address={address}&key={API_KEY}")
    geodata = response.json()
    
    if geodata['status'] == 'OK':
        lat = geodata['results'][0]['geometry']['location']['lat']
        lng = geodata['results'][0]['geometry']['location']['lng']

Google Geocoding APIにリクエストを送信し、住所に対応する緯度・経度を取得します。requests.get() でAPIにアクセスし、その結果をJSON形式で取得します。geodata['status'] が 'OK' の場合、緯度(lat)と経度(lng)を geodata から取り出します。

ピンを地図に追加

    # 地図にピンを立てる
    folium.Marker(
        [lat, lng],
        popup=row['駅名'],
        icon=folium.Icon(color=color)
    ).add_to(m)

Foliumの Marker クラスを使用して、取得した緯度・経度の位置にピンを立てます。popup には、ピンをクリックした際に表示される駅名(row['駅名'])を設定し、icon でピンの色を指定します。このピンは、地図オブジェクト m に追加されます。

地図をHTMLファイルに保存

# 地図を保存
m.save("address_output.html")

最後に、地図オブジェクト m をHTMLファイルに保存します。このファイルをブラウザで開くことで、マップ上にピンが立てられた拠点の位置関係を視覚的に確認できます。

アウトプットのHTMLファイル

このプログラムにより、各拠点の位置を地図上で一目で確認できるようになりました。ぜひご活用ください。

いいなと思ったら応援しよう!