緯度経度などのデータファイルから,マーカーとイメージポップアップ付きの OpenStreetMap 地図プログラムを生成
1. エグゼクティブサマリー
本記事では,緯度経度を含む CSV データファイルと画像ファイルをもとに,Python の folium ライブラリで OpenStreetMap 上にマーカーとイメージポップアップを配置する地図を生成する手順を説明する.マーカーをクリックすると,画像や Google マップストリートビューへのリンクを含むポップアップが表示される.
2. 前準備(必要ソフトウェアの入手)
ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。
Python 3.12 のインストール(Windows 上) [クリックして展開]
以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。
方法1:winget によるインストール
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
winget install --scope machine --id Python.Python.3.12 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_pip=1 Include_test=0 Include_launcher=1 InstallLauncherAllUsers=1"
--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。
方法2:インストーラーによるインストール
- Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
- ダウンロードしたインストーラーを実行する。
- 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから
pythonコマンドを実行できない。 - 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。
インストールの確認
コマンドプロンプトで以下を実行する。
python --version
バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。
AIエディタ Windsurf のインストール(Windows 上) [クリックして展開]
Pythonプログラムの編集・実行には、AIエディタの利用を推奨する。ここでは、Windsurfのインストールを説明する。Windsurf がインストール済みの場合、この手順は不要である。
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
winget install --scope machine --id Codeium.Windsurf -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/SP- /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /DIR=""C:\Program Files\Windsurf"" /MERGETASKS=!runcode,addtopath,associatewithfiles,!desktopicon"
powershell -Command "$env:Path=[System.Environment]::GetEnvironmentVariable('Path','Machine')+';'+[System.Environment]::GetEnvironmentVariable('Path','User'); windsurf --install-extension MS-CEINTL.vscode-language-pack-ja --force; windsurf --install-extension ms-python.python --force; windsurf --install-extension Codeium.windsurfPyright --force"
--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。
【関連する外部ページ】
Windsurf の公式ページ: https://windsurf.com/
必要なライブラリのインストール [クリックして展開]
管理者権限のコマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。
pip install -U pandas folium
3. 実行のための準備とその確認手順(Windows 前提)
3.1 プログラムファイルの準備
第5章のソースコードをテキストエディタ(メモ帳,Windsurf 等)に貼り付け,map_gen.py として保存する(文字コード:UTF-8).
3.2 実行コマンド
コマンドプロンプトでファイルの保存先ディレクトリに移動し,以下を実行する.
python map_gen.py
3.3 動作確認チェックリスト
| 確認項目 | 期待される結果 |
|---|---|
カレントディレクトリの確認(os.getcwd() の実行) | 現在の作業ディレクトリのパスが表示される |
| 地図表示のみのプログラム実行後 | カレントディレクトリに c.html が生成される |
c.html を Web ブラウザで開く | OpenStreetMap の地図が表示される |
| データファイル使用のプログラム実行後 | カレントディレクトリに c2.html が生成される |
c2.html を Web ブラウザで開く | マーカー付きの地図が表示される |
| マーカーをクリック | 建物名・画像・Google マップストリートビューへのリンクを含むポップアップが表示される |
| マーカーにマウスホバー | 建物名がツールチップとして表示される |
4. 概要・使い方・実行上の注意
4.1 使用するファイル
次のような緯度経度を含むデータファイルと画像ファイルを使う(ここではダウンロードして使う).
4.2 緯度経度を含むデータファイルの準備
- Web ブラウザで次の URL からデータファイルをダウンロードする.
- カレントディレクトリにこのファイルを置く.
* 自前でデータファイルを準備するときは,文字コードを UTF-8 にしておくこと.
4.3 画像ファイルの準備
- Web ブラウザで次の URL を開く.
- このディレクトリにある .zip ファイルをダウンロードして展開(解凍)する.これは複数の画像ファイルが入った .zip ファイルである.
- カレントディレクトリの下に「photo」というサブディレクトリを作成し,そこに画像ファイルを置く.
4.4 カレントディレクトリの確認
次のプログラムを実行すると,カレントディレクトリのパスが表示される.データファイルや画像ファイルは,このディレクトリを基準に配置する.
import os
print(os.getcwd())
4.5 地図表示の確認
まず地図表示のみを確認する.以下のプログラムを実行する.
import folium
lat, lon = 34.4586, 133.2295
m = folium.Map(location=[lat, lon], zoom_start=18)
m.save("c.html")
カレントディレクトリに c.html ができる.
c.html を Web ブラウザで開く.地図が表示されれば OK である.
4.6 データファイルを使ったマーカー付き地図の生成
次に,データファイルの緯度経度を使った表示を行う.以下のプログラムを実行する.
import pandas as pd
import folium
datafile = "hoge.csv"
lat, lon = 34.4586, 133.2295
m = folium.Map(location=[lat, lon], zoom_start=18)
X = pd.read_csv(datafile)
for _, r in X.iterrows():
html = '<a href="https://maps.google.com/maps?q=&layer=c&cbll=%f,%f&cbp=11,0,0,0,0">%s<br/><img width="60" src="%s"></a>' % (r.lat, r.lon, r.building, r.imfile)
folium.Marker([r.lat, r.lon], popup=folium.Popup(html, max_width=200), tooltip=r.building).add_to(m)
m.save("c2.html")
カレントディレクトリに c2.html ができるので,Web ブラウザで開く.マーカー付きの地図が表示されれば OK である.マーカーをクリックすると情報が表示される.
5. ソースコード
5.1 カレントディレクトリの確認
現在の作業ディレクトリを確認する.データファイルや画像ファイルの配置先を特定するために使用する.
import os
print(os.getcwd())
5.2 地図表示の確認用プログラム
folium で OpenStreetMap の地図を生成し,HTML ファイルとして保存する.マーカーなしで地図のみを表示する.
import folium
lat, lon = 34.4586, 133.2295
m = folium.Map(location=[lat, lon], zoom_start=18)
m.save("c.html")
5.3 データファイルを使ったマーカー付き地図生成プログラム
CSV データファイルから緯度・経度・建物名・画像ファイルパスを読み込み,各地点にマーカーとポップアップを配置した地図を生成する.
import pandas as pd
import folium
datafile = "hoge.csv"
lat, lon = 34.4586, 133.2295
m = folium.Map(location=[lat, lon], zoom_start=18)
X = pd.read_csv(datafile)
for _, r in X.iterrows():
html = '<a href="https://maps.google.com/maps?q=&layer=c&cbll=%f,%f&cbp=11,0,0,0,0">%s<br/><img width="60" src="%s"></a>' % (r.lat, r.lon, r.building, r.imfile)
folium.Marker([r.lat, r.lon], popup=folium.Popup(html, max_width=200), tooltip=r.building).add_to(m)
m.save("c2.html")
6. まとめ
6.1 folium による地図生成
Python の folium ライブラリを使い,緯度・経度を指定して OpenStreetMap の地図を生成し,HTML ファイルとして保存できる.生成された HTML は Web ブラウザで直接閲覧できる.
6.2 CSV データからのマーカー自動配置
緯度経度を含む CSV データファイルを pandas で読み込み,各行のデータをもとに地図上にマーカーを自動配置できる.データファイルには lat,lon,building,imfile の列が含まれる.
6.3 ポップアップとツールチップ
マーカーをクリックすると,建物名・画像・Google マップストリートビューへのリンクを含むポップアップが表示される.マーカーにマウスホバーすると建物名がツールチップとして表示される.
6.4 データファイルの文字コード
自前でデータファイルを準備するときは,文字コードを UTF-8 にしておく必要がある.
6.5 ファイル配置
データファイルはカレントディレクトリに,画像ファイルはカレントディレクトリ下の「photo」サブディレクトリに配置する.カレントディレクトリは os.getcwd() で確認できる.