【実用コード】Pythonを使ってGPSログファイルを使って、軌道を描画する方法

ジオセンス社のM5F9Pファームを使って記録すると、GPSポイントで、ログファイルを自動生成してくれます。

このログファイルはそのまま次のサンプルコードにパスを入れると、PythonライブラリのFoliumを使って綺麗に描画可能。

Foliumの使い方はこちらの記事を参考にしてください。

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

import folium

# ---- ファイルパスを指定 ----
file_path = "/あなたのログファイルパス.log"

# ---- NMEAから座標を抽出する関数 ----
def parse_nmea_latlon(nmea_sentence):
    parts = nmea_sentence.strip().split(",")
    if parts[0] not in ["$GPRMC", "$GPGGA"]:
        return None
    try:
        # GPRMCの場合
        if parts[0] == "$GPRMC":
            lat_raw, lat_dir = parts[3], parts[4]
            lon_raw, lon_dir = parts[5], parts[6]
        # GPGGAの場合
        else:
            lat_raw, lat_dir = parts[2], parts[3]
            lon_raw, lon_dir = parts[4], parts[5]

        if not lat_raw or not lon_raw:
            return None

        # 緯度 (ddmm.mmmm → dd.ddddd)
        lat = float(lat_raw[:2]) + float(lat_raw[2:]) / 60.0
        if lat_dir == "S":
            lat = -lat
        # 経度 (dddmm.mmmm → dd.ddddd)
        lon = float(lon_raw[:3]) + float(lon_raw[3:]) / 60.0
        if lon_dir == "W":
            lon = -lon

        return (lat, lon)
    except:
        return None

# ---- ファイルを読み込み座標抽出 ----
points = []
with open(file_path, "r") as f:
    for line in f:
        pos = parse_nmea_latlon(line)
        if pos:
            points.append(pos)

if not points:
    raise ValueError("NMEAログから座標が抽出できませんでした。")

# ---- 地図を生成 ----
center = [sum(p[0] for p in points)/len(points),
          sum(p[1] for p in points)/len(points)]
m = folium.Map(location=center, zoom_start=18)

# 青い点で描写
for lat, lon in points:
    folium.CircleMarker(location=(lat, lon),
                        radius=3,
                        color="blue",
                        fill=True,
                        fill_color="blue").add_to(m)

# 軌跡を線で結ぶ(オプション)
folium.PolyLine(points, color="blue", weight=2.5, opacity=0.8).add_to(m)

# ---- Jupyterで表示(または保存) ----
m.save("gps_track_map.html")
m

軌跡を描画

PolyLine を追加すれば軌跡として点を結ぶことができます。

Folium における PolyLine とは

PolyLine は「複数の緯度・経度を順につなげて線分を描画する」オブジェクトです。

点のリスト [(lat1, lon1), (lat2, lon2), ...] を渡すと、その順序で直線をつないで描写されます。

線の色 (color)、太さ (weight)、透明度 (opacity) などを指定できます。

実は前回のコードにもオプションで PolyLine を入れていましたが、今回は明示的に「点(青いサークル)」と「軌跡(線)」を両方描く例を整理しました。

import folium

# ---- ファイルパスを指定 ----
file_path = "あなたのパス.log"

# ---- NMEAから座標を抽出する関数 ----
def parse_nmea_latlon(nmea_sentence):
    parts = nmea_sentence.strip().split(",")
    if parts[0] not in ["$GPRMC", "$GPGGA"]:
        return None
    try:
        # GPRMCの場合
        if parts[0] == "$GPRMC":
            lat_raw, lat_dir = parts[3], parts[4]
            lon_raw, lon_dir = parts[5], parts[6]
        # GPGGAの場合
        else:
            lat_raw, lat_dir = parts[2], parts[3]
            lon_raw, lon_dir = parts[4], parts[5]

        if not lat_raw or not lon_raw:
            return None

        # 緯度 (ddmm.mmmm → dd.ddddd)
        lat = float(lat_raw[:2]) + float(lat_raw[2:]) / 60.0
        if lat_dir == "S":
            lat = -lat
        # 経度 (dddmm.mmmm → dd.ddddd)
        lon = float(lon_raw[:3]) + float(lon_raw[3:]) / 60.0
        if lon_dir == "W":
            lon = -lon

        return (lat, lon)
    except:
        return None

# ---- ファイルを読み込み座標抽出 ----
points = []
with open(file_path, "r") as f:
    for line in f:
        pos = parse_nmea_latlon(line)
        if pos:
            points.append(pos)

if not points:
    raise ValueError("NMEAログから座標が抽出できませんでした。")

# ---- 地図を生成 ----
center = [sum(p[0] for p in points)/len(points),
          sum(p[1] for p in points)/len(points)]
m = folium.Map(location=center, zoom_start=18)

# ---- 青い点で描写 ----
for lat, lon in points:
    folium.CircleMarker(location=(lat, lon),
                        radius=3,
                        color="blue",
                        fill=True,
                        fill_color="blue").add_to(m)

# ---- 軌跡を線で結ぶ ----
folium.PolyLine(points, color="blue", weight=2.5, opacity=0.8).add_to(m)

# ---- Jupyterで表示(または保存) ----
m.save("gps_track_map.html")
m

Foliumの他の機能リスト

機能 クラス / プラグイン名 概要 主な引数
基本折れ線 folium.PolyLine 複数の座標点を結ぶ直線や曲線を描画 locations, color, weight, opacity, popup, tooltip
値に応じた折れ線 folium.plugins.ColorLine 値の系列に基づいて線をグラデーション表示 positions, colors, colormap, weight
アニメーション線 folium.plugins.AntPath 破線が動くようなアニメーションを表示 locations, color, weight, delay, dash_array
多角形 folium.Polygon 閉じた多角形領域を描画 locations, color, weight, fill_color, fill_opacity
矩形 folium.Rectangle 二点の座標で矩形を描画 bounds, color, fill, popup, tooltip
folium.Circle 指定中心と半径で円を描画 location, radius, color, fill_color, popup
円マーカー folium.CircleMarker 半径をピクセル指定する円マーカー location, radius, color, fill_color
GeoJSON描画 folium.GeoJson GeoJSONの線・面データを表示 data, style_function, popup, tooltip
TopoJSON描画 folium.TopoJson TopoJSON形式の線・面を表示 data, object_path, style_function
コロプレス図 folium.Choropleth 値に応じて領域を塗り分け geo_data, data, key_on, fill_color, legend_name
時系列GeoJSON folium.plugins.TimestampedGeoJson 時間情報を持つGeoJSONをアニメーション表示 data, transition_time, loop, auto_play
描画ツール folium.plugins.Draw 地図上で線や多角形をインタラクティブに描画 export, position, draw_options
距離計測 folium.plugins.MeasureControl 地図上で距離や面積を計測 primary_length_unit, primary_area_unit
マウス位置表示 folium.plugins.MousePosition カーソル位置の座標を表示 position, separator, prefix

GPSログ活用アイディア 5選

移動経路の速度・加速度分析

  • 各時刻の座標から速度や加速度を計算。
  • ヒートマップとして「どの場所で速度が遅かったか」を可視化可能。
  • 例:車や徒歩の移動ログで、渋滞区間や休憩ポイントが一目でわかる。

標高変化プロファイル(登山やサイクリング向け)

  • GGAセンテンスから高度を抽出し、時間・距離に対して標高グラフを作成。
  • 上り下りの傾斜を解析して「どこがきつい登りか」を定量化。

軌跡クラスタリング(行動パターン抽出)

  • 複数日のログをまとめ、機械学習クラスタリングで行動パターンを可視化。
  • 「よく行く場所」や「滞在時間の長いエリア」が地図上に浮かび上がる。
  • 例:日常の生活動線の把握、営業ルートの最適化。

滞在地点(Stay Point)の自動検出

  • 移動速度がしきい値以下で、一定時間以上滞在している場所を抽出。
  • 例:カフェやレストランで休憩した場所をGPSだけで特定できる。
  • 観光や行動記録のまとめに役立つ。

3D可視化(Google Earth / matplotlib 3Dプロット)

  • 緯度・経度・高度を3Dで描画し、Google EarthにKMLでエクスポート。
  • 例:飛行ログやドローンの飛行経路を3Dで追体験。
朝比奈幸太郎

音楽家:朝比奈幸太郎

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

Share on: