GPXファイルとは?開き方・作り方とKML変換、アプリへの取り込み
登山アプリからルートを渡されたとき、GPSロガーからデータを取り出したとき、拡張子が .gpx のファイルが手元に残ります。開こうとしても、パソコンは何で開けばいいか聞いてくるだけで、中身が見えません。
このファイルは、移動した道のりを記録した、ただのテキストです。仕組みが分かれば、開くことも、作ることも、別の形式に変えることも、アプリに取り込むこともできます。
この記事では、GPXとは何かから始めて、開き方、作り方、KMLへの変換、地図アプリへの取り込み、そして自分のログから作る方法まで、順番に説明します。
GPXファイルとは
GPXは、位置の記録をやりとりするための共通の形式です。GPS Exchange Formatの頭文字で、2002年に決められました。
特定の会社のものではないため、登山アプリ、自転車の計測器、カーナビ、地図サイト、GPSロガーと、位置を扱うほとんどの道具がこれを読み書きできます。ある機器で記録した道のりを、別のソフトで開けるのはこのおかげです。
中身はテキストです。メモ帳でも開けます。開くと、こんな行が並んでいます。
<trkpt lat="35.668720" lon="139.759460">
<ele>45.2</ele>
<time>2026-08-17T08:51:20Z</time>
</trkpt>
緯度、経度、標高、時刻の4つが1点ぶんです。この点が、記録した秒数だけ並んでいます。1時間歩いて1秒ごとに記録すれば、3,600個の点が入っています。ファイルが数メガバイトになることもありますが、中身は全部この繰り返しです。
GPXが持つ3つの入れ物
GPXには、性質の違う3種類のデータが入ります。混同すると、取り込んだのに表示されない、という事故が起きます。
| 種類 | タグ | 中身 | 例 |
|---|---|---|---|
| トラック | trk | 実際に通った道のり。時刻つきの点の列 | 歩いた記録、走行の記録 |
| ルート | rte | これから通る予定の道。曲がる地点の列 | 計画したコース |
| ウェイポイント | wpt | 単独の地点 | 山頂、水場、駐車場 |
登山アプリで「計画を取り込む」と「活動の記録を取り込む」が別の機能になっているのは、この違いのためです。トラックしか入っていないファイルを計画として読ませようとしても、うまく入らないことがあります。
ファイルをテキストエディタで開いて、trk と rte と wpt のどれが入っているかを見れば、原因が分かります。
開き方
用途によって、開く道具が変わります。
中身を確かめたいだけなら、メモ帳やテキストエディタで開きます。位置の数字がそのまま見えます。壊れていないかを確かめたいとき、これがいちばん速い方法です。
地図の上で見たいときは、ブラウザで開ける地図サービスに読み込ませます。グーグルアース、地理院地図、各種の登山地図サイトが対応しています。ファイルを画面へ落とすだけで、道のりが線で描かれます。
スマートフォンで見たいときは、登山や自転車のアプリに取り込みます。方法は後の節で説明します。
編集したいときは、専用のソフトを使います。不要な部分を切る、複数のファイルをつなぐ、といった作業ができます。
作り方
GPXを手に入れる道は4つあります。
記録する機器から取り出す方法。GPSロガー、登山アプリ、自転車の計測器、スマートウォッチは、記録を GPX で書き出せます。書き出しの項目は、アプリによって「エクスポート」「共有」「データの出力」など名前が違います。
地図サイトで描く方法。通る予定の道をブラウザ上でなぞって、GPXとして保存します。計画を作ってから出かけるときの方法です。
他の形式から変換する方法。KMLやCSVから変えます。次の節で説明します。
自分で書く方法。テキストなので、プログラムで生成できます。緯度と経度の列さえあれば作れます。この記事の最後に、GPSの生ログから作る方法を載せました。
KMLとの違いと、変換
KMLは、グーグルが地図の表示に使う形式です。GPXと似ていますが、目的が違います。
| GPX | KML | |
|---|---|---|
| 得意なこと | 移動の記録をやりとりする | 地図の上での見せ方を決める |
| 時刻 | 各点に必ず持てる | 持てるが必須ではない |
| 見た目の指定 | ほぼ無い | 線の色、太さ、アイコンを指定できる |
| 主に読む先 | 登山アプリ、計測器、カーナビ | グーグルアース、グーグルマイマップ |
移動の記録として保存するなら GPX、地図で見せることが目的なら KML、と考えると迷いません。
変換には GPSBabel という道具が広く使われています。無料で、ウィンドウズでもマックでもリナックスでも動きます。画面から操作もできますし、命令行からも呼べます。
gpsbabel -i gpx -f route.gpx -o kml -F route.kml
前半が入力の形式とファイル、後半が出力の形式とファイルです。gpx と kml を入れ替えれば、逆向きにも変換できます。
ブラウザで変換できるサービスもあります。ただし位置の記録は、どこへ行ったかがそのまま分かるデータです。他人の管理する場所へ上げる前に、その点を考えてください。
グーグルマップに表示する
グーグルのマイマップを使うと、記録した道のりを地図に重ねて、他の人と共有できます。
- ブラウザでグーグルマイマップを開きます
- 新しい地図を作成します
- レイヤの「インポート」を押します
- ファイルを選びます
ここで、GPXとKMLのどちらを上げるかで結果が変わります。マイマップが元から扱う形式はKMLのほうなので、KMLに変換してから上げると表示が安定します。GPXをそのまま上げると、線であるべき道のりが点の集まりとしてばらけることがあります。
なお、マイマップは表示のための道具です。取り込んだ道のりを使って経路案内をすることはできません。
登山アプリに取り込む
計画したコースをアプリで持ち歩きたい、という使い方が最も多い場面です。主要な登山アプリはGPXの取り込みに対応しています。
手順はどのアプリもおおむね同じです。ファイルを端末に保存し、アプリの取り込みの画面から選ぶか、ファイルアプリからアプリを指定して開きます。パソコン側の画面から取り込んで、アプリと同期させる方式のものもあります。
うまく入らないときの原因は、たいてい次のどれかです。
取り込めるのが計画のルートだけで、活動の記録は取り込めない設定になっている。この区別があるアプリでは、ファイルに trk しか入っていないと計画として読めません。
無料の範囲では取り込みが使えない。取り込みや書き出しを有料の機能にしているアプリがあります。
点の数が多すぎる。1秒ごとに何時間も記録したファイルは点が数万になり、上限を超えることがあります。この場合は編集ソフトで間引きます。5秒に1点まで減らしても、地図上の見た目はほとんど変わりません。
それぞれのアプリで扱いが違うので、取り込みの説明は公式の案内を確認してください。
編集する、つなぐ
記録した道のりには、余計な部分が入りがちです。出発前に起動したまま駐車場で待っていた時間、帰りに立ち寄った店、電波が途切れて位置が飛んだ区間です。
こうした部分は、GPXの編集に対応したソフトで切り取れます。地図上で範囲を選んで削除する、という操作です。
複数のファイルをつなぐこともできます。途中で電池が切れて記録が2つに分かれた場合や、日をまたいだ縦走の記録をひとつにまとめたい場合です。GPSBabelでも、複数の入力を指定してつなげます。
時刻がずれている場合の補正もできます。機器の時計が協定世界時のままで、日本時間と9時間ずれている、というのはよくある話です。
GPSの生ログからGPXを作る
GPSロガーやドライブレコーダーが残すのは、GPXではなくNMEAという形式のことがあります。拡張子は .nmea や .log や .txt で、中身は次のような文字列の羅列です。
$GPGGA,085120.00,3540.1234,N,13945.5678,E,1,08,0.9,45.2,M,36.1,M,,*54
このままでは地図で開けないので、GPXかKMLに変換します。GPSBabelでも変換できますが、点を間引きたい、特定の時間帯だけ取り出したい、といった細かい加工をしたい場合は、自分で書いたほうが早くなります。
パイソンなら、gpxpy と simplekml という部品を使います。
pip install gpxpy simplekml
from pathlib import Path
import gpxpy, gpxpy.gpx
import simplekml
FOLDER = Path("ログのあるフォルダ")
OUT_GPX = Path("track.gpx")
OUT_KML = Path("track.kml")
PATTERNS = ("*.log", "*.txt", "*.nmea")
def dm_to_deg(dm: str, is_lat: bool) -> float:
"""NMEAの度分表記を、十進の度に直す"""
n = 2 if is_lat else 3
return float(dm[:n]) + float(dm[n:]) / 60
def parse_nmea_latlon(s: str):
"""GGA または RMC の行から (緯度, 経度) を取り出す"""
if "*" in s:
s = s.split("*", 1)[0]
parts = s.split(",")
if not parts:
return None
kind = parts[0][3:] if len(parts[0]) >= 6 else ""
try:
if kind == "RMC":
# 2番目が A なら有効、V なら無効
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]
elif kind == "GGA":
# 6番目が 0 なら測位できていない
if len(parts) < 7 or parts[6] == "0":
return None
lat_raw, lat_dir, lon_raw, lon_dir = parts[2], parts[3], parts[4], parts[5]
else:
return None
if not lat_raw or not lon_raw:
return None
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 ValueError:
return None
def read_points(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
all_points = []
for pat in PATTERNS:
for fp in sorted(FOLDER.glob(pat)):
pts = read_points(fp)
if pts:
all_points.append((fp.name, pts))
print(f"{len(all_points)} ファイル、{sum(len(p) for _, p in all_points)} 点")
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))
OUT_GPX.write_text(gpx.to_xml(), encoding="utf-8")
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("書き出しました:", OUT_GPX, OUT_KML)
3文字目から5文字目で種類を判定しているのは、いまの受信機が GPGGA ではなく GNGGA で出力することが多いためです。先頭が GP の行だけを拾う書き方をすると、新しい機器では一点も取れません。
点を間引きたい場合は、読み込みのところで数を数えて、5点に1点だけ使うようにします。時間帯で絞りたい場合は、GGA や RMC の時刻の項目を見て範囲を判定します。
まとめ
GPXは、位置の記録をやりとりするための共通のテキスト形式です。中身は緯度、経度、標高、時刻の並びで、メモ帳でも開けます。
入れ物が3種類あることを覚えておくと、取り込みでつまずいたときに原因を探せます。実際に通った道のりがトラック、これから通る予定がルート、単独の地点がウェイポイントです。
地図で見せたいならKMLへ変換し、アプリで持ち歩きたいならGPXのまま取り込みます。変換にはGPSBabelが使えます。
GPSの生ログしか手元にない場合も、緯度と経度を取り出してしまえば、あとは形を整えるだけです。