背景
子供たちと近所をサイクリングした際のサイコンのログを航空写真地図にプロットして どれくらい遠くまで行ったのか見返せたりしたら楽しそうと思うのと、 ソロで長めに走った際のペース配分や次回周辺を散策する際の面白そうな場所を調べるのに 役立つかもと思い、Pythonで取り組んでみた。
TL;DR
Python全般の学んだこと
配列の扱い
for hoge in hoges:
まぁ、割と問題ない
これまでの道のりを表示する際に必要になった、特定のインデックスまで配列要素を参照するには
for i in range(count + 1): tp = locations[i]
と記述することで対応できた。
複数条件のあるif文の書き方
pythonだと&&ではなく、andやorキーワードで連結する模様
長いif文の折り返し方法
if(hoge): とカッコで囲む
if (tp[1] < p[1] + zone*16.0/9 and tp[1] > p[1] - zone*16.0/9 and tp[0] < p[0] + zone and tp[0] > p[0] - zone):
cartopy
日本語でググると割とBasemapなるmatplotlibの拡張ライブラリ?が見つかるが、 どうも開発終了が予定されている模様。そこで、今回はBasemapの後継とされているcartopyを用いることに。
国土地理院の地図を使う
GoogleTilesでurlに国土地理院のタイルのURLを以下の様に指定して出来た。
import cartopy.io.img_tiles as cimgt request = cimgt.GoogleTiles(url="https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg") ax = fig.add_subplot(1, 1, 1, projection=request.crs) ax.add_image(request, level)
余白の消し方
matplotlibで黙ってプロットした結果を保存すると余白がついてしまう。 以下の様に指定することで、余白を取り除けた。
plt.savefig(filename,bbox_inches='tight', pad_inches = 0)
地図上に線を引く
緯度、経度を指定して
ax.plot([old_p[1],tp[1]],[old_p[0],tp[0]], color='red', linestyle='-', transform=ccrs.PlateCarree())
地図上に点を打つ
一度通った道を戻る際に、現在地を表示しないと、分かりずらいことが分かったので、 現在地表示を行った。
ax.plot(p[1],p[0],marker='o', color='w', transform=ccrs.PlateCarree())
地図上に文字列を表示する
緯度、経度を指定して文字列を描画できた。
ax.text(x, y, "文字列",color='red', size=15, ha='center', va='center', transform=ccrs.PlateCarree())
ha,vaで描画位置の基準を設定できる模様。
matplotlib
画像サイズの変更
matplotlibの一般的な描画の場合は、figsize=(w,h)でfigureオブジェクト作成時に 指定してこれでよい様だが、今回のcartopyでは、
ax.set_extent
に指定する緯度経度の範囲でアスペクト比が決まる模様。 解像度の指定を
plt.savefig(filename,bbox_inches='tight', pad_inches = 0,dpi=300)
とdpiを指定することで、画像サイズを変更できた。
ffmpeg
実は、画像のサイズ変更が分からなかったときにデフォルトの状態で ffmpegを使って過去のノウハウ
を駆使しつつ試したら、アスペクト比に文句言われて
を見つけて、これで解決した。
ffmpeg -r 30 -i map%04d.png -vcodec libx264 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" mapWadaPass_v0.3.mp4
関連記事
- 月島駅でオープンiエリア
- 自走で都民の森まで行ったサイコンのログをcartopyに流したら「OSError: Could not find lib c or load any of its variants [].」