Pythonで移動距離を自動計算!geopyを使ったGPSログ処理の基本【旅・物流・災害にも】

GPSで記録した移動ルートの「総距離」を自動的に算出したいと思ったことはありませんか?
たとえば旅のログ、物流車両の走行距離、あるいは災害時の避難経路など。

Pythonには、そのニーズにぴったりのライブラリがあります。
それが今回紹介する geopy(ジオパイ) です。

本記事では、geopy を使って「緯度・経度から2地点間の距離を自動計算する方法」と、それを応用して 移動ログから合計距離を算出する方法 をわかりやすく解説します。

pip install geopy

geopyとは?

geopy は、地球上の2地点間の距離を正確に計算するためのPythonライブラリです。
緯度・経度の座標データから、地球の球体形状(楕円体)を考慮して、現実に近い直線距離(測地線距離)を求めることができます。

✅ 地図上の「まっすぐな距離」を求めるのに最適なライブラリ

geopyでできること

  • 緯度・経度から直線距離を算出(km/mi単位)
  • 距離の計算方法を選択可能(Vincenty法・Great-circle法など)
  • 経路全体の合計距離(ルート上の全ステップを加算)
  • 複数地点間の距離行列(物流の最適ルート探索に応用)

🧭 緯度・経度から移動距離を自動計算する方法(geopy × pandas)

本章では、GPSログ(CSV形式)から「移動距離の合計」を計算するPythonスクリプトを紹介します。

pandasは計算系のライブラリで、ファイナンスにもよく使われますし、科学系にも頻繁に使われますので、すべての仮想環境に入れておいてもいいくらいですね。

pip install pandas geopy

たとえば以下のようなCSVファイルを想定します

time,lat,lon
2025-07-30 09:00:00,43.2431,143.5642
2025-07-30 09:01:00,43.2438,143.5655
2025-07-30 09:02:00,43.2450,143.5662

GPSログから合計移動距離を計算するサンプルコードです。

"""
CSV形式のGPSログを読み込み、geopyで2点間距離を順に計算し、合計移動距離を求めるスクリプト。

使用ライブラリ:
- pandas:CSVデータ処理
- geopy:緯度経度から直線距離を測定

ファイル形式:
CSV(列: time, lat, lon)
"""

import pandas as pd
from geopy.distance import geodesic

def calculate_total_distance(csv_path: str) -> float:
    # GPSログの読み込み
    df = pd.read_csv(csv_path)

    # 緯度・経度列の存在確認
    if not {'lat', 'lon'}.issubset(df.columns):
        raise ValueError("CSVファイルに 'lat' および 'lon' 列が含まれていません。")

    # 距離合計用の変数(キロメートル単位)
    total_distance_km = 0.0

    # 行を順にペアで比較し、距離を足し合わせる
    for i in range(1, len(df)):
        prev = (df.loc[i - 1, 'lat'], df.loc[i - 1, 'lon'])
        curr = (df.loc[i, 'lat'], df.loc[i, 'lon'])
        total_distance_km += geodesic(prev, curr).km

    return total_distance_km

# 実行例
if __name__ == "__main__":
    distance = calculate_total_distance("gps_log.csv")
    print(f"移動合計距離: {distance:.2f} km")
  1. CSVファイルをpandasで読み込み
  2. 1行ずつ隣り合う緯度経度ペアを取り出す
  3. geodesic()で距離を計算して合計
  4. 最終的な移動距離(km)を出力

2地点間の直線距離を計測するサンプル

"""
geopyライブラリを使って、指定した2地点の緯度・経度から直線距離(地球の曲率を考慮した測地線距離)を求めるサンプルコード。

- 地点1: 北海道足寄町
- 地点2: 兵庫県神戸市垂水区
"""

from geopy.distance import geodesic

# 地点の緯度・経度(例:足寄町、神戸市垂水区)
location1 = (43.2431, 143.5642)  # 北海道足寄町
location2 = (34.6409, 135.0585)  # 兵庫県神戸市垂水区

# 測地線距離を計算(キロメートル単位)
distance_km = geodesic(location1, location2).km

# 結果表示
print(f"足寄町から垂水区までの直線距離: {distance_km:.2f} km")

すると、足寄町から垂水区までの直線距離: 1120.64 kmと表示されると思います。

✅ 直線距離を計測できることのメリットと応用例

🧭 そもそも「直線距離」とは?

直線距離(geodesic distance)は、地球の曲率を考慮して2地点間を最短で結んだ距離のことです。
これはGoogleマップなどで「まっすぐ結んだ線」としてよく使われており、実際の移動距離(道路距離)とは異なります。

✅ なぜ直線距離の計算が重要なのか?

利点説明
🎯 最短経路の見積もりルートが未確定でも、おおよその距離を瞬時に把握できる
📊 距離ベースで分析できる「近さ」に基づいた相関分析やクラスタリングが可能
🔄 反復処理が速い地図APIと違い、外部リクエスト不要でローカル処理が高速
💰 経費や時間の概算に最適燃料費・移動時間・人件費などの粗い試算に役立つ
🗺️ 地理的ヒートマップやマップ可視化と連携可能Folium等と組み合わせて直感的な可視化が可能

✅ 活用分野ごとの応用例

🚚 1. 物流・配車・宅配

  • 倉庫から顧客住所までの最短距離で「配達優先度」や「費用感」を算出
  • 各営業所間の距離マトリクスを生成して配車効率化
  • ドローン配送や無人搬送車(AGV)の動作領域制御

🧳 2. 旅行・登山・アウトドア

  • GPSロガーで記録した出発点〜目的地間の移動距離を「旅の記録」として可視化
  • 複数地点間の旅程を直線でつないで旅ルートの全体感を確認
  • 「次の目的地まであと〇km」という位置感覚の提供

⛑️ 3. 災害対応・避難支援

  • 最寄り避難所までの最短ルート評価
  • 災害直後に「最短距離で助けが届く範囲」の算出
  • 災害ドローンの飛行範囲シミュレーション

🎹 4. 音楽家・イベント運営者

  • 機材輸送距離から搬入経路や運搬コストの見積もり
  • イベント拠点間の距離を事前に把握し、スケジュールや搬送効率化
  • 「前の現場から今回の現場まで〇km」という舞台裏エピソードにも使える

🌍 5. 研究・教育分野

  • 学生フィールドワークでの「距離感」をデータとして持たせる
  • 地理情報処理・空間分析(GIS)の入門教材
  • 生物の行動圏(動物が移動した範囲)の可視化や定量化

🛒 6. 店舗・サービス分析

  • 顧客と店舗の直線距離から「来店確率」や「商圏の推定」
  • 競合店との距離分析で市場の被り・空白地帯の把握
  • SNSの位置情報ポストとリアル店舗の距離関連分析

✅ 直線距離 × 他ライブラリの連携で広がる可能性

組み合わせ応用
pandasCSVの緯度経度データを一括処理
folium地図上に距離をビジュアル化
streamlit距離をリアルタイムでダッシュボード表示
matplotlib距離のヒストグラム・散布図などを作成
scikit-learn距離を特徴量としてクラスタリングや回帰分析

✅ まとめ

直線距離の自動計算は、旅や業務、研究まで幅広く応用できる基本中の基本。
geopyを使えば、Pythonコード数行でこの距離を正確に取得できます。

「場所の関係性を数値で語れる」 というのは、空間データ処理における大きな武器です。

foliumとの連携も可能!

先日紹介した folium で可視化したGPSログと、geopy を組み合わせれば:

  1. 地図上にルートを表示(folium)
  2. 同時にルートの総距離を表示(geopy)

という風に、視覚+数値の両面からの分析が可能になります。

Python × FoliumでGPSデータを地図上に表示する方法|リアルタイム可視化は?

朝比奈幸太郎

音楽家:朝比奈幸太郎

神戸生まれ。2025 年、40 年近く住んだ神戸を離れ北海道・十勝へ移住。
録音エンジニア五島昭彦氏より金田式バランス電流伝送 DC 録音技術を承継し、 ヴィンテージ機材で高品位録音を実践。
ヒーリング音響ブランド「Curanz Sounds」でソルフェジオ周波数音源を配信。
“音の文化を未来へ”届ける活動を展開中。