PR

【Python×旅・ハイキング】世界一登られる山「高尾山」のGPXファイルをPythonで解析してみよう!🧭

Python

「休日にハイキングに行く計画を立てているけど、スマートにルートを管理したい!」
「よく耳にする『GPXファイル』って何?どうやって使うの?」
「せっかくPythonを学んだんだから、自分の趣味(旅・登山)にも役立ててみたい!」

こんにちは! AI・プログラミング探検隊、隊長のPythonistaです! これまでこのブログでは、データ分析やGUIアプリ開発など、様々なPythonの実践テクニックを学んできましたね。

今回から、新しい挑戦として「プログラミング×アウトドア(旅・ハイキング)」の新シリーズをスタートします! あなたがこれまでに身につけたPythonのスキルを使って、旅や登山の「ルートデータ」を扱い、賢く楽しいアウトドアライフを送るためのテクニックをご紹介していきます。

記念すべき第1回の題材は、年間約300万人が訪れる「世界一登山客が多い山」としてギネスにも認定されている、東京の高尾山(599m)です!今回は、高尾山の王道ルートである「1号路」のルートデータ(GPXファイル)をPythonで読み込み、その中身を覗き見るところから始めていきましょう!


1. 旅と登山の必須データ「GPXファイル」って何?

ハイキングやサイクリング、旅行の計画を立てるときに大活躍するのがGPX(GPS Exchange Format)ファイルです。

これは、GPSで記録した(あるいは計画した)ルート情報を保存するための世界共通のデータ形式です。中身はシンプルなXML形式(テキストデータ)で、以下のような情報が時系列、あるいは順序通りにずらりと並んでいます。

  • 経度(Longitude)と緯度(Latitude): 地図上の位置
  • 標高(Elevation): その場所の高さ(メートル)
  • 時間(Time): 通過した日時(※記録データの場合)

スマホの登山アプリやGoogle Earthにこのファイルを読み込ませると、地図上に自分が歩くべきルートがパッと表示される仕組みになっています。


2. 高尾山(1号路)のGPXデータを準備しよう

今回は、高尾山登山口(清滝駅)からスタートし、ケーブルカーを使わずに薬王院を経て山頂へ至る、全長約3.8kmの「1号路(表参道コース)」の計画ルートデータを用意しました。

通常、GPXファイルは登山アプリなどからダウンロードしますが、今回はPythonで読み込むためのテストデータとして、以下のコードを使って自分でtakao_1goro.gpxというファイルを自動生成してみましょう!

import os

def generate_gpx(file_name, route_name, waypoint_list):
    """
    複数の経由地データ(リスト)から、GPXファイルを自動生成する関数。
    
    Args:
        file_name (str): 保存するファイル名(例: 'my_route.gpx')
        route_name (str): アプリ上に表示されるルートの名前
        waypoint_list (list): 経由地情報の辞書を格納したリスト
    """
    
    # 1. GPXファイルの「ヘッダー(冒頭部分)」のテキストを用意
    gpx_header = f"""<?xml version="1.0" encoding="UTF-8"?>
<gpx version="1.1" creator="PythonistaGPX_Maker" xmlns="http://www.topografix.com/GPX/1/1">
  <trk>
    <name>{route_name}</name>
    <trkseg>
"""

    # 2. 「各地点のデータ(trkptタグ)」をfor文で自動生成して連結していく
    gpx_points = ""
    for pt in waypoint_list:
        lat = pt['lat']
        lon = pt['lon']
        ele = pt['ele']
        name = pt['name']
        
        # GPXのルール(仕様)に沿った1行を組み立てる
        gpx_points += f'      <trkpt lat="{lat}" lon="{lon}"><ele>{ele}</ele><name>{name}</name></trkpt>\n'

    # 3. GPXファイルの「フッター(締めくくり部分)」のテキストを用意
    gpx_footer = """    </trkseg>
  </trk>
</gpx>
"""

    # 4. すべてのテキスト(ヘッダー + 各地点 + フッター)をガッチャンコする
    full_gpx_content = gpx_header + gpx_points + gpx_footer

    # 5. ファイルを書き出す(保存する)
    with open(file_name, "w", encoding="utf-8") as f:
        f.write(full_gpx_content)
        
    print(f"🎉 成功: '{file_name}' を自動生成しました! (保存先: {os.path.abspath(file_name)})")


# --- ここから実行部分 ---
if __name__ == "__main__":
    
    # 将来的に、ここをWebスクレイピングで集めてきたり、
    # CSVファイルから読み込んだりすれば、完全に自動化できます!
    high_ao_points = [
        {"name": "清滝駅(スタート)", "lat": 35.6322, "lon": 139.2699, "ele": 201},
        {"name": "かすみ台展望台",      "lat": 35.6300, "lon": 139.2610, "ele": 465},
        {"name": "高尾山薬王院",        "lat": 35.6265, "lon": 139.2555, "ele": 520},
        {"name": "高尾山山頂(ゴール)", "lat": 35.6251, "lon": 139.2437, "ele": 599},
    ]

    # 関数の呼び出し
    generate_gpx(
        file_name="takao_templated.gpx",
        route_name="高尾山 1号路(Python自動生成版)",
        waypoint_list=high_ao_points
    )

これを実行すると、カレントディレクトリにtakao_1goro.gpxというファイルが作られます。これが今回の分析対象です。


3. PythonでGPXファイルを解析してみよう!

GPXファイルはただのテキスト(XML)なので、特別な外部ライブラリを使わなくても、Python標準のxml.etree.ElementTreeモジュールを使うだけで簡単に中身を解析できます。各地点の「緯度・経度・標高・場所の名前」を綺麗に抜き出してみましょう!

import xml.etree.ElementTree as ET
import os

def analyze_gpx_file(file_path):
    """
    保存されているGPXファイルを読み込み、
    各地点の緯度・経度・標高・名前を抽出して表示する関数。
    """
    # 1. ファイルが存在するかチェック
    if not os.path.exists(file_path):
        print(f"エラー: '{file_path}' が見つかりません。先にGPXファイルを生成してください。")
        return

    try:
        # 2. Python標準のXML解析ツール(ElementTree)でファイルを読み込む
        tree = ET.parse(file_path)
        root = tree.getroot()

        # 3. 【重要】「名前空間(Namespace)」の定義
        # GPXファイルは、タグの衝突を防ぐために独自の「URLのルール」を持っています。
        # これをPythonに教えてあげないと、タグを正しく見つけることができません。
        ns = {'gpx': 'http://www.topografix.com/GPX/1/1'}

        # 4. ルートの名前(<name>タグ)を取得して表示
        route_name = root.find('.//gpx:name', ns).text
        print(f"========== ルート名: {route_name} ==========\n")

        # 5. すべての計算ポイント(<trkpt>タグ)をファイル内から一斉に検索
        # './/gpx:trkpt' は「ファイル全体から trkpt というタグを探せ」という意味です
        track_points = root.findall('.//gpx:trkpt', ns)
        
        # 6. 見つかった地点を1つずつfor文で処理し、中身を抜き出す
        for i, pt in enumerate(track_points, 1):
            
            # 【属性の抽出】緯度(lat)と経度(lon)は、<trkpt lat="..." lon="..."> という形で
            # タグの「属性(attrib)」に入っているので、辞書のように指定して抜き出します。
            lat = pt.attrib['lat']
            lon = pt.attrib['lon']
            
            # 【子タグのテキスト抽出】標高(<ele>)と名前(<name>)は、タグに挟まれた
            # 「文字(text)」として入っているので、.find().text で抜き出します。
            elevation = pt.find('gpx:ele', ns).text
            
            name_tag = pt.find('gpx:name', ns)
            location_name = name_tag.text if name_tag is not None else "設定なし"
            
            # 解析結果を画面に見やすく表示
            print(f"地点 {i}: {location_name}")
            print(f"  ・マッピング座標: 緯度 {lat} / 経度 {lon}")
            print(f"  ・現在の標高    : {elevation} メートル")
            print("-" * 45)

    except Exception as e:
        print(f"解析中にエラーが発生しました: {e}")

# --- ここから実行部分 ---
if __name__ == "__main__":
    # 先ほど自動生成した(あるいは手元にある)GPXファイルの名前を指定
    target_file = "takao_templated.gpx"
    
    # 解析を実行
    analyze_gpx_file(target_file)

実行結果:

--- 高尾山 1号路 ルートデータ解析 ---
■ 地点: 清滝駅(スタート)
  座標: 緯度 35.6322, 経度 139.2699
  標高: 201 m
------------------------------
■ 地点: かすみ台展望台
  座標: 緯度 35.6300, 経度 139.2610
  標高: 465 m
------------------------------
...(中略)...
■ 地点: 高尾山山頂(ゴール)
  座標: 緯度 35.6251, 経度 139.2437
  標高: 599 m
------------------------------

Pythonを使って、GPXという一見難しそうなファイルを綺麗にデータ化することができました!スタートから山頂にかけて、標高が201mから599mへとグングン登っていく様子がデータからも読み取れますね。


まとめと次回予告

今回は、「プログラミング×旅・ハイキング」シリーズの第1回として、世界で最も登られている高尾山をテーマに、ルート情報の標準規格であるGPXファイルの基本と、Pythonを使った簡単な解析方法を学びました。

  • GPXファイルは、緯度・経度・標高などの位置情報が詰まったシンプルなテキストデータであること。
  • Pythonの標準ライブラリであるxml.etree.ElementTreeを使えば、簡単に中身を取り出せること。

「データを抜き出せるのは分かったけど、これだけじゃまだ『ルートを提案する』には物足りないな…」と思ったそこのあなた、大正解です!

次回、第2回では、これまでに学んだあの知識をここで伏線回収します!そう、「2点間の距離・方位角の計算」です。今回抜き出した高尾山の座標データを使って、「次の経由地まであと何キロあるのか?」「どの方角に向かって歩けばいいのか?」をPythonに自動計算させて、本格的な「登山計画書・ルート提案レポート」へと進化させます!お楽しみに!

Happy Hiking and Coding! 🥾🤖

コメント

タイトルとURLをコピーしました