シェル芸人からの挑戦

という連載がSoftware Designで掲載中。シェル芸というか、ワンライナー的なことに関しては大昔からそういうことやってきたこともあって、ちょいとは自信があります。でもこの連載を読んでいると、そういう使い方もあるのかとか、そのコマンドは知らなかったなとか新しい発見多数。特に自分がUNIXコマンドを集中的に覚えていた20年ほど前にはそんな機能なかったよとか、そんなオプションなかったとかってのがいっぱいあって愕然とします。
まぁ知らなくても別の方法で実現できるんですけどね。

今月の連載はWebスクレイピング。駅名と高度の組み合わせを駅データjp(http://ekidata/jp/api)と国土地理院(http://maps.gsi.go.jp/development/api.html)をつかってデータを作ってみましょうってもの。
面白そうなので東海道線の東京〜熱海でやってみました。

駅データから路線データを取得

東海道線の路線IDは11301。こんなリクエストでjsonデータを取得できます。

$ curl -s http://www.ekidata.jp/api/l/11301.json 

データ4行なんですが、必要なデータは3行目だけで、その三行目もなんだかこのあと使うjq的に不要なものが入っているのでsedで整形。

$ curl -s http://www.ekidata.jp/api/l/11301.json | sed -ne '3p' | sed -e 's/xml.data = //' 

国土地理院APIに渡すために整形

駅名,緯度,経度のTSVを作成。

(上記のコマンド) | jq -rc '.station_l[] | [.station_name, .lon, .lat] | @tsv' 

ここまででの出力はこんな感じ。

東京	139.766103	35.681391
新橋	139.758587	35.666195
品川	139.738999	35.62876
川崎	139.697485	35.531311
横浜	139.622704	35.466195
戸塚	139.534282	35.400432
大船	139.531127	35.353466
藤沢	139.487293	35.338882
辻堂	139.447106	35.336847
茅ケ崎	139.407197	35.330741
平塚	139.349063	35.327647
大磯	139.313388	35.311299
二宮	139.256925	35.298644
国府津	139.212932	35.280832
鴨宮	139.180147	35.275744
小田原	139.155772	35.256225
早川	139.145014	35.238875
根府川	139.138504	35.202455
真鶴	139.132148	35.156837
湯河原	139.102142	35.146178
熱海	139.077679	35.103573

国土地理院APIに渡す

xargsとshの引数をつかってリクエスト。ここはSD誌の回答そのまま。レスポンスはjsonなので、またjqをつかってelevationのデータだけ抜き出す。他所様のWebなのでリクエスト毎に1秒お休み。

(上記のコマンド) | xargs -n3 sh -c 'printf "$0 "; curl -so - "http://cyberjapandata2.gsi.go.jp/general/dem/scripts/getelevation.php?lon=$1&lat=$2" | jq -r .elevation; sleep 1'

これで得られたデータがこちら。

東京 3.4
新橋 3.5
品川 2.6
川崎 2.7
横浜 3.9
戸塚 14
大船 10.1
藤沢 13.3
辻堂 12.5
茅ケ崎 8.5
平塚 8
大磯 18.1
二宮 20.9
国府津 21
鴨宮 11.4
小田原 13.7
早川 11.7
根府川 46.3
真鶴 55.4
湯河原 35.7
熱海 71.7

さらにgnulotでグラフを書いてみる

どうせなので高低差がわかるようにグラフにしてみる。
上記の結果を適当なファイル(kekka.txt)に書いて、

$ gnuplot
gnuplot> set style data lines
gnuplot> plot "kekka.txt" using :2:xticlabels(1)

できたのがこちら。

熱海駅って随分高いところにあるんだな。