non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

cartopyでGPSデータを国土地理院のタイル地図にプロットして動画を作成して学んだこと

こんばんは。先日次男のPCR検査に行って来た@kjunichiです。ちなみに検査結果は陰性でした。この際に初めてタクシーをスマホから呼ぶアプリを入れました。

背景

子供たちと近所をサイクリングした際のサイコンのログを航空写真地図にプロットして どれくらい遠くまで行ったのか見返せたりしたら楽しそうと思うのと、 ソロで長めに走った際のペース配分や次回周辺を散策する際の面白そうな場所を調べるのに 役立つかもと思い、Pythonで取り組んでみた。

TL;DR

www.youtube.com

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を使って過去のノウハウ

abrakatabura.hatenablog.com

を駆使しつつ試したら、アスペクト比に文句言われて

qiita.com

を見つけて、これで解決した。

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

関連記事

3年前の記事