Wed Feb 20 2019

YAMAP から gpx データがダウンロードできる

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\) に提案する.