YAMAP が yamap.co.jp から yamap.com に変わって gpx データがダウンロードできるようになった. 実は前から出来るリンクがあったのかもしれないが、とにかく、できる.
YAMAP は一つの活動記録について yamap.com/activities/2986402 といったページを作ってくれて、この末尾の数字、仮にIDと呼ぶが、これを使って、 api.yamap.com/activities/2986402/points.xml という gpx データへのリンクが表現されている. ただし GPS の記録がなかった場合は当然 gpx データはない.
例えば私の今までの活動記録の gpx データは
curl -s 'https://yamap.com/users/698019?tab=activities#tabs' |
grep -o 'href="/activities/[0-9]*"' | grep -oE '[0-9]+' |
sort | uniq |
while read id; do
wget -O yamap_${id}.gpx https://api.yamap.com/activities/${id}/points.xml
done
でダウンロードできる (これは簡単にwebスクレイピングしてるだけで、たぶん 15 個より多く活動記録がある場合はページングしないといけない).
gpx データとは GPS データの XML 表現らしい. これを読むための tkrajina/gpxpy という Python ライブラリを見つけたので使う. pip install gpxpy
で入った.
gpx データは本来、tracks, waypoints, routes という三種類のデータが入れられるようだが、 YAMAP のそれの場合は tracks だけが入ってる.
from glob import glob
import gpxpy
import gpxpy.gpx
X = []
Y = []
Z = []
for f in glob('*.gpx'):
gpx = gpxpy.parse(open(f))
for track in gpx.tracks:
for segment in track.segments:
for point in segment.points:
X.append(point.longitude)
Y.append(point.latitude)
Z.append(point.elevation)
# plot
import visdom
vis = visdom.Visdom()
vis.scatter(list(zip(X, Y, Z)), opts={
'title': '3d',
'markersize': 2,
'xlabel': 'longitude',
'ylabel': 'latitude',
'zlabel': 'elevation',
})
vis.scatter(list(zip(X, Y)), opts={
'title': '2d',
'markersize': 2,
'xlabel': 'longitude',
'ylabel': 'latitude',
})
人 \(P\) が今まで歩いた経路 (緯度経度で表現される二次元空間の中の図形のこと) を \(X(P)\) とする. 人 \(P, Q\) について, \(X(P), X(Q)\) を比べることで, \(P\) と \(Q\) の活動範囲の近さを測ることができる. 例えば都内近郊で日帰りで行ける山を活動範囲にしているだとか. ここで, \(X(Q) - X(P)\) が \(P\) にとって、行ける範囲にあって新規開拓の可能性がある山である. それに属する \(Q\) の活動記録を \(P\) に提案する.