シェル芸人からの挑戦
という連載が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)
できたのがこちら。
熱海駅って随分高いところにあるんだな。