今回は、Androidの地図アプリ OsmAndを使って
- 経路座標の取得
- Pythonによるそのデータ加工
を行います。オフラインで簡単に座標データが取得できます。
実行環境
- Androidスマホ (全工程で使用)
- 座標データ取得用
- Android地図アプリ 「OsmAnd」
- 座標データ加工用とブログ記事作成用
- Termux F-Droid版
- Python 3.10
- JupyterNotebook
はじめに
Pythonで地図を作成する時に使われるポピュラーなライブラリ foliumは、Open Street MapというWikipediaの地図版のような誰でも自由に編集できる地図が使われています。
元々はJavaScriptの地図ライブラリ LeafletをPythonで使えるようにしたものが foliumです。地図はhtmlで出力・保存できます。JupyterNotebook上で作成すれば直ぐに地図が表示できますし、Webページにしたり貼り付けたりが可能です。
OsmAndによる座標データの取得
foliumで地図作成したいとき、地図座標のデータが欲しいことがあります。
(foliumじゃなくても座標や地図が欲しい)
散歩や、自転車・バイク等でのツーリング経路の座標が数秒おきに取得できればなぁ、とか。地域の動植物の調査やマーケティング調査などに利用したい、とか。
座標データの取得はGoogleマップでも可能かも知れませんが、OsmAndというAndroid地図アプリを使うと、オフラインのまま経路座標の取得ができます。
OsmAndはGoogleプレイからダウンロード・インストールできます。
OsmAndアプリは folium と同じく Open Street Mapが使われており、 無料で使えます。煩わしい広告もでません。 そしてかなり多機能です。音声ナビゲーション機能なども付いている。
オプションで有料版もあります。さらなる機能の追加など。
- リンク
OsmAnd — Maps & GPS Offline - Apps on Google Play
OsmAndの使い方(ザックリ)
ザックリと書きます。
オフラインで地図を表示させるので、表示したい地域の地図をダウンロードする必要があります。
- マップダウンロード
OsmAndアプリの左下にあるボタンを押す
- オフラインマップをダウンロード保存する
Googleマップでも同じですが、オフラインマップは容量が大きいです。一地域で数百MBほどある。
日本のある地域のオフラインマップを保存したいときは、「アジア → 日本 → 地域選択」で進む。
九州をダウンロードした。
- 保存されると色が変わる
九州が黄緑色に変化しています。
- 未保存地域は表示できない
関東地域はまだ保存していないので詳細地図を表示できません。促されています。
- ダウンロード済み地域の地図を表示
マッパーと呼ばれるボランティアが地図情報を日々追加しています。Wikipediaのように、登録すれば誰でもマッパーになれ、OpenStreetMap地図の編集ができます。地図情報の追加具合によって、地図の充実度に地域差があります。
- 旅程・経路記録
マップ左下のボタンから「プラグイン」→「旅程・経路記録」を押す
「ON」にすると、その左側に「設定」ボタンが表示されます。これで経路記録が可能になりました。
経路記録は、スマホのGPSをオンにして使います。5秒間隔でGPS座標を取得・保存され、時刻と共に gpxファイルに記録されます。
gpxファイルは拡張子が「.gpx」のファイルですが、中身は XML形式のテキストファイルです。
経路データ(gpxファイル)の取得
上で経路・行程の表示やデータの保存・取得が可能になりましたが、具体的な経路記録方法は省略します。
記録した経路データの gpxファイルは、
- 「アプリ左下ボタン」→
- 「プラグイン」→
- 「旅程・経路記録」で「ON」にする→
- 表示される「設定ボタン」→
- 画面一番下の「📁使用した経路」→
ここまで進むと次の画面になります。
また同じ名前の「📁使用した経路」ボタン → 「経路データの縦3点リーダーボタン」を押すと、次の画面に。
「共有」で gpxファイルを何らかの手段で入手します。ドライブに保存するとか、自分宛にメール送信するとか。
というのは、OsmAndのフォルダが開けない為にそのような手段でやっているのですが、他の方法があれば教えてください。
- 経路地図
OsmAndアプリで取得した経路地図を表示させると
赤い線で経路が表示されています。
以上で、OsmAndアプリで取得した経路座標データの保存とそのファイル(gpxファイル)取得までザックリ書いた。
あとはgpxファイルをfolium用に加工していきます。
Pythonによる経路座標データ(gpxファイル)の編集
ここからはJupyterNotebookを使って経路座標データファイル(gpxファイル)を、folium用に加工する作業に移ります。
- 経路座標データファイル
# OsmAndで取得した経路座標データファイル fname = "2022-02-06_15-27_Sun.gpx"
- Pythonでファイルを開く
withopen(fname, mode='r') as f: r = f.read() print(r)
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<gpx version="1.1" creator="OsmAnd 4.1.11" xmlns="http://www.topografix.com/GPX/1/1" xmlns:osmand="https://osmand.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>
<name>2022-02-06_15-27_Sun</name>
</metadata>
<trk>
<trkseg>
<trkpt lat="33.3027671" lon="130.5579563">
<ele>84.2</ele>
<time>2022-02-06T06:27:19Z</time>
<hdop>7.2</hdop>
<extensions>
<osmand:speed>0.6</osmand:speed>
</extensions>
</trkpt>
<trkpt lat="33.3027594" lon="130.5579148">
<ele>92.9</ele>
<time>2022-02-06T06:27:25Z</time>
<hdop>3.9</hdop>
<extensions>
<osmand:speed>0.4</osmand:speed>
</extensions>
</trkpt>
(中略 同じようなデータが続く)
</extensions>
</gpx>
経路座標のファイルは 拡張子が「.gpx」になっていますが、中身は上で見て分かるように XMLファイルです。
- 座標の書かれた行だけ取得
「<trkpt lat=」から始まる行に座標が記録されている。この行だけを抜き出します。標準ライブラリの re (正規表現ライブラリ)を使っています。
import re # 5個だけ取り出してみる re.findall(r'<trkpt.*>', r)[0:5]
['<trkpt lat="33.3027671" lon="130.5579563">',
'<trkpt lat="33.3027594" lon="130.5579148">',
'<trkpt lat="33.3027713" lon="130.557914">',
'<trkpt lat="33.302769" lon="130.5579141">',
'<trkpt lat="33.3027669" lon="130.5579148">']
座標の緯度、経度を2次元のリスト形式で取得できれば、foliumで経路地図が作成できる。
上のデータから、さらに不要な部分を削除し、リスト形式に整形していきます。
import re # 座標データ行のみ取得 origin = re.findall(r'<trkpt.*>', r) # 上のリストから、座標のみ取得for i in origin: print(re.findall(r'lat=".*" ', i)) print(re.findall(r'lon=".*"', i)) print('-'*20)
['lat="33.3027671"']
['lon="130.5579563"']
--------------------
['lat="33.3027594"']
['lon="130.5579148"']
--------------------
['lat="33.3027713"']
['lon="130.557914"']
--------------------
['lat="33.302769"']
['lon="130.5579141"']
--------------------
['lat="33.3027669"']
['lon="130.5579148"']
--------------------
['lat="33.3027651"']
['lon="130.5579129"']
(以下省略)
- 座標だけ取得
import re # 座標データ行のみ取得 origin = re.findall(r'<trkpt.*>', r) # 上のリストから、座標のみ取得 strlist = [re.findall('\d{1,8}\.\d{1,8}',i) for i in origin] strlist[0:3]
[['33.3027671', '130.5579563'],
['33.3027594', '130.5579148'],
['33.3027713', '130.557914']]
- 数字が文字列型になっているので、float型に変換する
data = [[float(j) for j in i] for i in strlist] # 5個だけ表示 data[0:5]
[[33.3027671, 130.5579563],
[33.3027594, 130.5579148],
[33.3027713, 130.557914],
[33.302769, 130.5579141],
[33.3027669, 130.5579148]]
座標データをファイルに保存
上で加工した座標データは2次元のリスト型です。これを CSVファイルで保存しておきましょうかね。Pandasを使えば保存も読み込みも楽です。
import pandas as pd # 座標データをCSVファイルで保存 savename = "locations.csv" df = pd.DataFrame(data) df
0 | 1 | |
---|---|---|
0 | 33.302767 | 130.557956 |
1 | 33.302759 | 130.557915 |
2 | 33.302771 | 130.557914 |
3 | 33.302769 | 130.557914 |
4 | 33.302767 | 130.557915 |
... | ... | ... |
115 | 33.301906 | 130.564784 |
116 | 33.301955 | 130.564830 |
117 | 33.301985 | 130.564841 |
118 | 33.302007 | 130.564844 |
119 | 33.302034 | 130.564849 |
120 rows × 2 columns
df.to_csv(savename, index=None)
- 保存されたか確認
!ls |grep locations.csv
locations.csv
- 読み込めるか確認
# 座標データファイルを読み込み
df_read = pd.read_csv(savename)
df_read
0 | 1 | |
---|---|---|
0 | 33.302767 | 130.557956 |
1 | 33.302759 | 130.557915 |
2 | 33.302771 | 130.557914 |
3 | 33.302769 | 130.557914 |
4 | 33.302767 | 130.557915 |
... | ... | ... |
115 | 33.301906 | 130.564784 |
116 | 33.301955 | 130.564830 |
117 | 33.301985 | 130.564841 |
118 | 33.302007 | 130.564844 |
119 | 33.302034 | 130.564849 |
120 rows × 2 columns
保存と読み込みの確認ができました。
おわりに
データの整形はLinuxコマンドやVimエディタを使うともう少し簡単にできるかも。grepや sedコマンドなど。
OsmAndの旅程・経路記録はデフォルトで5秒間隔の記録になっています。1分で12行、10分で120行、1時間だと720行の座標データになります。
foliumで数十もの座標を表示させようとすると、かなりデカいhtmlになります。データ量に気をつけて。
次回は、今回作った経路座標データからfoliumのAntPathというプラグインで経路地図を作ってみます。
【追記】
作ってみました。【foliumプラグインAntPath】OsmAndアプリで取得した経路座標データから経路地図を作成 - よちよちpython
【追記おわり】
以上です。
【参考 関連】