【GPSログをGoogleマップに表示】|PythonでNMEAファイルをGPX/KMLに変換して可視化する手順

GPSロガーやドライブレコーダーなどで取得した NMEAログ(.log.txt形式) を、そのまま Google マップで表示できたら便利ですよね。

しかし、Google マップは NMEAファイルを直接読み込むことはできません

そこで本記事では、PythonでNMEAログをGPX/KMLに変換し、Googleマイマップに表示する方法を、誰でも再現できる形で解説します。

Googleマップでログを表示する流れ

  1. NMEAログをPythonで解析
  2. GPX/KML形式に変換して保存
  3. Googleマイマップにインポート
  4. ブラウザ上で軌跡を表示&共有

この手順を踏めば、走行記録や散歩のルートを Google マップ上に重ねて可視化できます。


必要な準備

  • Python(3.9以降推奨)
  • ライブラリ:
pip install gpxpy simplekml

PythonでNMEAログをGPX/KMLに変換するコード

以下のコードを JupyterLab や Python スクリプトに貼り付けて実行してください。

from pathlib import Path
import gpxpy, gpxpy.gpx
import simplekml

# ====== 設定 ======
FOLDER = Path("あなたのパス")  # NMEAログのフォルダ
OUT_GPX = Path("ファイル名.gpx")
OUT_KML = Path("ファイル名.kml")
PATTERNS = ("*.log", "*.txt", "*.nmea")
# ==================

def parse_nmea_latlon(s: str):
    """NMEAの$GPRMC/$GPGGAから(lat, lon)を抽出"""
    if "*" in s:
        s = s.split("*", 1)[0]
    parts = s.split(",")
    if not parts or parts[0] not in ("$GPRMC", "$GPGGA"):
        return None
    try:
        if parts[0] == "$GPRMC":
            if len(parts) < 7 or parts[2] != "A":
                return None
            lat_raw, lat_dir, lon_raw, lon_dir = parts[3], parts[4], parts[5], parts[6]
        else:
            lat_raw, lat_dir, lon_raw, lon_dir = parts[2], parts[3], parts[4], parts[5]

        def dm_to_deg(dm: str, is_lat: bool):
            if is_lat:
                deg, minutes = float(dm[:2]), float(dm[2:])
            else:
                deg, minutes = float(dm[:3]), float(dm[3:])
            return deg + minutes / 60

        lat = dm_to_deg(lat_raw, True)
        lon = dm_to_deg(lon_raw, False)
        if lat_dir == "S": lat = -lat
        if lon_dir == "W": lon = -lon
        return (lat, lon)
    except:
        return None

def read_points_from_file(filepath: Path):
    pts = []
    with filepath.open("r", encoding="utf-8", errors="ignore") as f:
        for line in f:
            pos = parse_nmea_latlon(line)
            if pos: pts.append(pos)
    return pts

# --- NMEA読み込み ---
all_points = []
for pat in PATTERNS:
    for fp in sorted(FOLDER.glob(pat)):
        pts = read_points_from_file(fp)
        if pts:
            all_points.append((fp.name, pts))
print(f"{len(all_points)} ファイルを読み込みました。")

# --- GPX 出力 ---
gpx = gpxpy.gpx.GPX()
for name, pts in all_points:
    trk = gpxpy.gpx.GPXTrack(name=name)
    gpx.tracks.append(trk)
    seg = gpxpy.gpx.GPXTrackSegment()
    trk.segments.append(seg)
    for lat, lon in pts:
        seg.points.append(gpxpy.gpx.GPXTrackPoint(lat, lon))
with OUT_GPX.open("w", encoding="utf-8") as f:
    f.write(gpx.to_xml())
print("Saved GPX:", OUT_GPX)

# --- KML 出力 ---
kml = simplekml.Kml()
for name, pts in all_points:
    kml.newlinestring(name=name, coords=[(lon, lat) for lat, lon in pts])
kml.save(str(OUT_KML))
print("Saved KML:", OUT_KML)

Googleマイマップで表示する方法

Screenshot
  1. ブラウザで Google マイマップ を開く
  2. 「新しい地図を作成」
  3. レイヤの「インポート」をクリック
  4. 先ほど生成した GPXまたはKMLファイルをアップロード

どっちをアップロードするの?

結論から言うと、Googleマイマップにアップロードするなら KML ファイルがおすすめです。

理由は次のとおりです:

  • Googleマイマップのネイティブ形式が KML/KMZ
    → Google Earth / Googleマップ製品群と親和性が高い
  • ✅ KMLは「線(トラック)」「点(マーカー)」の扱いがシンプルで、表示が崩れにくい
  • ✅ 複数ファイルをまとめてもレイヤごとに管理しやすい

一方で GPX は「登山アプリやGarmin系」では標準ですが、Googleマイマップに読み込ませるときに 軌跡が点列としてバラける場合がある のでおすすめ度は低めです。

すると Google マップ上にあなたの移動軌跡が描画されます。
さらに共有設定をすれば、他の人に見せることも可能です。

ただし、Googleマイマップではルート案内できない → 表示専用ですので、ご注意!

まとめ

  • NMEAログはそのままGoogleマップでは扱えない
  • PythonでGPX/KMLに変換すれば Google マイマップで簡単に可視化できる
  • 旅行の記録や運転ログの管理、アウトドアのルート共有に最適

今回のコードを使えば、誰でも数分で「NMEA → GPX/KML → Googleマップ表示」の流れを構築できます。
データ活用の幅、特に友人や家族、プレゼン資料や研究資料としてのシェアの速度が一気に広がりますので、ぜひ試してみてください。