PR

【Python×旅・ハイキング 第3回】ついにビジュアル化!foliumライブラリで高尾山のルートをWeb地図上に描こう 🗺️

Python

「データが計算できるのは分かったけど、やっぱり地図の上に線を引いて見たい!」
「よくニュースやWebサイトで見かける、拡大・縮小できるインタラクティブな地図って自分で作れるの?」
「Pythonで地図データを扱うのって、専門知識がないと難しい?」

こんにちは! Pythonプログラミング探検隊、隊長のPythonistaです! 前回の第2回では、高尾山のGPXデータから区間距離や方位角、高低差を自動計算し、文字ベースの「登山計画レポート」を作りました。データの裏にあるルートの険しさが数値で見えて、とても面白かったですね。

しかし、人間は視覚的な生き物。「百聞は一見に如かず」です。せっかく位置情報(緯度・経度)を持っているのなら、それを実際の地図の上に綺麗に描いて、ブラウザで眺めてみたくありませんか?

そこで第3回となる今回は、Pythonの強力な地図可視化ライブラリfolium(フォリウム)を導入します!これを使うと、わずか数行のコードで、Googleマップのようにグリグリ動かせる本格的なWeb地図を生成し、そこに高尾山の登山ルートを鮮やかな赤い線で描き、さらにチェックポイントにピンを立てることができます。あなたのコードが、ついに美しいビジュアルとなって画面に広がりますよ!


1. 地図可視化の救世主:`folium` ライブラリとは?

Pythonで地図を扱うライブラリはいくつかありますが、その中でもfoliumは、手軽さと美しさを兼ね備えた決定版です。

背景の地図データには、世界中の有志が作成しているオープンな地図「OpenStreetMap」などを自動で読み込んでくれるため、私たちが地図の画像を用意する必要はありません。また、出力結果を.htmlという形式で保存できるため、完成した地図をそのままブラウザで開いたり、自分のブログに埋め込んだり、友人にシェアしたりすることが簡単にできます。

ライブラリのインストール

まずは、ターミナルやコマンドプロンプトで以下のコマンドを実行して、foliumをインストールしておきましょう。

pip install folium

2. 実践!ルート地図可視化スクリプト

それでは、前回のGPXパース処理に、foliumによる地図描画ロジックを組み合わせた完成版のスクリプトです。第1回・第2回で使用した takao_templated.gpx と同じフォルダに保存して実行してみてください!

import xml.etree.ElementTree as ET
import folium
import os

def create_hiking_map(file_path, output_html):
    """
    GPXファイルを読み込み、foliumを使って
    インタラクティブなWeb地図(ルート線とピン付き)を生成する関数。
    """
    # 1. ファイルが存在するかチェック
    if not os.path.exists(file_path):
        print(f"エラー: '{file_path}' が見つかりません。")
        print("先に第1回のGPX自動生成スクリプトを実行して、ファイルを準備してください。")
        return

    # 2. GPXファイルをパースして、全地点のデータを取得
    tree = ET.parse(file_path)
    root = tree.getroot()
    ns = {'gpx': 'http://www.topografix.com/GPX/1/1'}
    track_points = root.findall('.//gpx:trkpt', ns)

    points_data = []
    route_coordinates = []  # foliumのPolyLineに渡すための[緯度, 経度]のリスト

    for pt in track_points:
        lat = float(pt.attrib['lat'])
        lon = float(pt.attrib['lon'])
        ele = float(pt.find('gpx:ele', ns).text)
        name_tag = pt.find('gpx:name', ns)
        name = name_tag.text if name_tag is not None else "経由地"
        
        # データを辞書型にして保存
        points_data.append({'name': name, 'lat': lat, 'lon': lon, 'ele': ele})
        # 地図の線引き用に[緯度, 経度]のペアをリストに追加
        route_coordinates.append([lat, lon])

    # 3. 地図の基準となる中心座標を設定(スタート地点:清滝駅の座標)
    start_lat = points_data[0]['lat']
    start_lon = points_data[0]['lon']

    # 4. foliumでベースとなる地図オブジェクトを作成
    # zoom_start は初期の拡大率(1〜18程度、数字が大きいほど拡大されます)
    mymap = folium.Map(location=[start_lat, start_lon], zoom_start=15)

    # 5. 各チェックポイントにピン(マーカー)を立てる
    for pt in points_data:
        # ピンをクリックしたときに表示される文字(HTMLタグで改行を入れる)
        popup_text = f"<b>{pt['name']}</b><br>標高: {pt['ele']:.0f}m"
        
        folium.Marker(
            location=[pt['lat'], pt['lon']],
            popup=folium.Popup(popup_text, max_width=200),
            tooltip=pt['name']  # マウスカーソルを乗せたときにポップアップする文字
        ).add_to(mymap)

    # 6. 点と点を結ぶ軌跡の線(ポリライン)を地図上に描く
    folium.PolyLine(
        locations=route_coordinates,
        color='red',          # 線の色
        weight=5,             # 線の太さ
        opacity=0.8           # 線の不透明度(0.0 〜 1.0)
    ).add_to(mymap)

    # 7. 地図をHTMLファイルとして保存
    mymap.save(output_html)
    print(f"🎉 成功: 地図アプリ '{output_html}' を生成しました!")
    print(f"保存先: {os.path.abspath(output_html)}")
    print("ファイルをダブルクリックしてブラウザ(ChromeやEdgeなど)で開いてみてください。")

if __name__ == "__main__":
    # 解析・可視化対象のGPXファイル名
    target_gpx = "takao_templated.gpx"
    # 出力するHTMLファイル名
    output_webpage = "takao_route_map.html"
    
    # 地図作成関数の実行
    create_hiking_map(target_gpx, output_webpage)

3. 魔法のコードの仕組みを解説

このスクリプトを実行すると、新しくtakao_route_map.htmlというファイルが作られます。それをダブルクリックしてブラウザ(ChromeやEdgeなど)で開くと、見慣れたWeb地図の上に高尾山のルートが綺麗に描かれているはずです!

【スクリーンショット推奨箇所: ブラウザで開いた完成版の地図画像。OpenStreetMapの上に、赤い太線といくつかの青いピンが立っている様子】

この短いコードで、なぜこれほど本格的な地図が作れるのか、ポイントとなる3つの関数を解説します。

  • folium.Map(location=[緯度, 経度], zoom_start=15): 地図の初期位置と拡大率を決める関数です。今回はスタート地点である清滝駅を中心に設定しました。
  • folium.Marker(...): 地図上にピンを立てるお馴染みの機能です。popupオプションにHTMLタグ(<br>で改行など)を交えた文字列を渡すことで、ピンをクリックしたときに場所の名前と標高がポップアップする、心憎い演出を実装しています。
  • folium.PolyLine(locations=リスト, color='red'): これがルート描画の主役です![[緯度1, 経度1], [緯度2, 経度2], ...]という座標のリストを渡すだけで、それらの点を順番に繋ぐ美しい一本の線を地図上に引き下ろしてくれます。

4. 発展:あなただけの「マイマップ」へ

今回は分かりやすくするためにシンプルなOpenStreetMapを使いましたが、folium.Map()tiles='OpenTopoMap'というオプションを追加すると、**等高線が入った地形図**に背景を切り替えることも可能です。登山やハイキングのルートを眺めるなら、地形の凹凸がわかる地形図の方が圧倒的にワクワクしますよね!ぜひ試してみてください。


まとめと次回予告

今回は、「プログラミング×旅・ハイキング」シリーズの第3回として、Pythonのfoliumライブラリを使い、高尾山のルートデータを本格的なWeb地図アプリケーションとして視覚化しました。

  • foliumを使えば、外部から地図画像を用意することなく、動的なWeb地図を簡単に作れること。
  • 座標のリストをPolyLineに渡すだけで、ルートの軌跡を描画できること。
  • Markerを使うことで、クリックすると情報が飛び出すインタラクティブなピンを配置できること。

これで、位置情報(平面)の可視化は完璧です!しかし、登山やハイキングにはもう一つの重要な次元があります。そう、「高さ(垂直方向)」です。

「このルート、全体でどれくらい登るんだろう?」「どこが一番の急坂なのかな?」という立体的な疑問を解決したくなりますよね。

そこで次回、第4回(最終回・断面図編)では、Pythonのグラフ描画ライブラリの王様matplotlib(マットプロットリブ)を召喚します!GPXファイルに含まれる標高データを読み込み、**ルート全体の「標高断面図(高低差プロファイルグラフ)」**を自動生成します。平面の地図と、垂直のグラフ。この2つが揃うことで、あなたのPython登山計画システムは完全体へと進化します。最後の冒険も、どうぞお楽しみに!

Happy Mapping and See You on the Next Trail! 🗺️🏃‍♂️

コメント

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