ヤマレコAPIを用いて百名山の情報を集めてみた
表題の通り百名山の情報をヤマレコAPIを用いて集めてみました。
現在個人で使用することを目的とした百名山アプリを開発しています。 そこで百名山の情報をどこかから集めたいと思ってたところヤマレコAPIを見つけました。
今回はヤマレコAPIを用いた百名山の情報を取得する方法を備忘録として残しておきます。
この記事を読む前に
APIのレスポンス確認にターミナル(mac標準TerminalやiTerm2などのこと)とjqコマンドを使用します。
jqコマンドはjson形式のデータをパースして整形かつシンタックスハイライトしてくれる便利コマンドです。またkeyを指定して必要なvalueだけに絞り込めたりと便利なので、まだの方はぜひインストールしてください。
前提
- macOS Mojave
- jqコマンドでレスポンス確認できる
まだjqコマンドをインストールしてない方へ
jqコマンドはbrewでインストールできます。
brew install jq
brewをインストールしてない方はググってインストールしましょう笑
jqコマンドの使い方については、またAPIレスポンスを確認するときに説明します。
ヤマレコAPIについて
ヤマレコAPIとはヤマレコが提供しているAPIで、ヤマレコのデータにアクセスしたり、ヤマレコの機能をAPI経由で使用するモバイルアプリ開発をおこなうことができます。
ちなみにヤマレコは登山ルートを作成したり共有したりと登山愛好家が好むサービスの1つです。
ヤマレコAPIのマニュアルはこちらです。
ヤマレコAPIをつかってみる
さて、本題に入ります。
上記マニュアルの中で百名山の情報を取得できそうなAPIは地名データの検索(searchPoi)です。
searchPoiの仕様(各パラメータに指定する値はhttps://sites.google.com/site/apiforyamareco/api/api_otherを参照ください。)
パラメータ名 | 説明 |
---|---|
page | 一覧のページ番号。1ページあたり20件の記録が取得できる。 |
name | 検索したい地名の名称。 |
type_id | 検索したい地名のデータ種別 |
area_id | 検索したい地名のエリアID |
ptid | 表示したい地名のID |
各パラメータの説明がありますが、
これだけでは各パラメータがどんなことを意味してるのかわからないので他のAPIを使用してみてデータを確かめることにします。
下記からは百名山の情報を取得するために試行錯誤したことを参考程度に記載するので、結果の知りたい方はヤマレコAPIで百名山の情報を絞り込む方法を参照ください。
area_idってなんだろ
パラメータでarea_id
を指定できるが、
具体的にどんな値を使用できるかわからないのでエリアリストの取得(getArealist)で確認してみます。
ターミナルでcurlコマンドでgetArealist
を叩きます。
getArealistの結果1 (クリックで折りたたみを展開)
$ curl https://api.yamareco.com/api/v1/getArealist {"arealist":[{"area_id":"100","area":"\u5317\u6d77\u9053"},{"area_id":"101","area":"\u9053\u6771\u30fb\u77e5\u5e8a"},{"area_id":"102","area":"\u5927\u96ea\u5c71"},{"area_id":"103","area":"\u5341\u52dd\u9023\u5cf0"},{"area_id":"104","area":"\u82a6\u5225\u30fb\u5915\u5f35"},{"area_id":"105","area":"\u65e5\u9ad8\u5c71\u8108"},{"area_id":"106","area":"\u7a4d\u4e39\u30fb\u30cb\u30bb\u30b3\u30fb\u7f8a\u8e44\u5c71"}, . . .
はい、
なんかUnicodeになっていて読めないし、整形されてないのでみにくいです。
そこでjqコマンドを使用します。
getArealistの結果2 (クリックで折りたたみを展開)
$ curl https://api.yamareco.com/api/v1/getArealist | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 4800 100 4800 0 0 10983 0 --:--:-- --:--:-- --:--:-- 10983 { "arealist": [ { "area_id": "100", "area": "北海道" }, { "area_id": "101", "area": "道東・知床" }, { "area_id": "102", "area": "大雪山" }, { "area_id": "103", "area": "十勝連峰" }, . . .
jqコマンドにより、unicode文字も読めるようになり、かつjsonも整形されましたね。getArelist
のレスポンスをみるとarea_id
は山のある地域名・地帯名?に対応してるidみたいです。
今回の目的は百名山を絞り出したいのでarea_id
は関係なさそうです。
type_idってなんだろ
次に百名山を絞りこめそうなパラメータとして気になるのが、type_id
です。type_id
についても詳しい記述がないので、値を指定してレスポンスをみることにより何を意味するのか確認することとします。
searchPoiの結果 (クリックで折りたたみを展開)
$ curl -X POST https://api.yamareco.com/api/v1/searchPoi -d "page=1&type_id=1" | jq . # 参考になるレスポンスだけ抜粋 { "ptid": "17", "name": "月山", "yomi": "がっさん", "name_en": "Mt. Gassan", "elevation": "1984", "lat": "38.549028", "lon": "140.026917", "detail": "", "area": "206", "types": [ { "type_id": "1", "name": "山頂", "detail": "" }, { "type_id": "6", "name": "山小屋", "detail": "" }, { "type_id": "14", "name": "トイレ", "detail": "" }, { "type_id": "7", "name": "水場", "detail": "" }, { "type_id": "8", "name": "食事", "detail": "" }, { "type_id": "11", "name": "展望ポイント", "detail": "" } ], "photo_url": "https://yamareco.info/modules/yamainfo/upimg/pt/c6ac7ecb1c91c93dfea4460d5d6f2d8b.JPG", "page_url": "http://www.yamareco.com/modules/yamainfo/ptinfo.php?ptid=17" },
レスポンスの内容からしてtype_id
は山にある設備とかポイントなどを意味してそうなので、これも特に百名山を絞り込むには関係なさそうですね。
ヤマレコAPIで百名山の情報を絞り込む方法
上記の試行錯誤の結果、searchPoi
じゃ百名山の情報絞り込めないのかと諦めていましたが、ヤマレコの百名山一覧ページにヒントが隠れていました。
下記リンクはヤマレコで百名山で絞り込んだヤマリストのページとなっております。
このページが作れてるんなら何か方法はあるはず、
パラメータgroupidの検証
urlをみると、groupid=1
で絞り込みをおこなっています。
上記ページのurl https://www.yamareco.com/modules/yamainfo/ptlist.php?groupid=1
APIリファレンスにはgroupidが指定できるとは書いてなかったですが試しに叩いてみます。
groupidを追加したsearchPoiの結果 (クリックで折りたたみを展開)
$ curl -X POST https://api.yamareco.com/api/v1/searchPoi -d "page=1&type_id=0&groupid=1" | jq . % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 20104 0 20078 100 26 45425 58 --:--:-- --:--:-- --:--:-- 45381 { "err": 0, "poilist": [ { "ptid": "1", "name": "利尻山", "yomi": "りしりざん", "name_en": "Mt. Rishirizan", "elevation": "1721", "lat": "45.178583", "lon": "141.242028", "detail": "", "area": "109", "types": [ { "type_id": "1", "name": "山頂", "detail": "" }, { "type_id": "14", "name": "トイレ", "detail": "携帯トイレブース有り ※携帯トイレ必須" } ], "photo_url": "https://yamareco.org/modules/yamainfo/upimg/pt/c0a89f6b8d8dd5faaa137b9a52a437e1.JPG", "page_url": "http://www.yamareco.com/modules/yamainfo/ptinfo.php?ptid=1" }, { "ptid": "2", "name": "羅臼岳", "yomi": "らうすだけ", "name_en": "Mt. Rausudake", "elevation": "1661", "lat": "44.075778", "lon": "145.122333", "detail": "", "area": "101", "types": [ { "type_id": "1", "name": "山頂", "detail": "" }, { "type_id": "11", "name": "展望ポイント", "detail": "" } ], "photo_url": "https://yamareco.org/modules/yamainfo/upimg/pt/e6034fb1754e32a5351d63827166dea7.JPG", "page_url": "http://www.yamareco.com/modules/yamainfo/ptinfo.php?ptid=2" }, . . . { "ptid": "20", "name": "西吾妻山", "yomi": "にしあづまやま", "name_en": "Mt. Nishiadumayama", "elevation": "2035", "lat": "37.738278", "lon": "140.140833", "detail": "日本百名山・吾妻山(吾妻連峰)の最高峰。\r\n山頂は樹林に囲まれ展望は無い。", "area": "208", "types": [ { "type_id": "1", "name": "山頂", "detail": "" } ], "photo_url": "https://yamareco.org/modules/yamainfo/upimg/pt/d21657cd97bcf40432bcd8df1ee98220.JPG", "page_url": "http://www.yamareco.com/modules/yamainfo/ptinfo.php?ptid=20" } ] }
まず与えたパラメータの意味を述べておくと、
- page=1: 20個表示
- type_id=0: typeを検索条件に入れない
- groupid: 百名山?←検証対象
次にレスポンスからgroupid=1
が百名山を指すか検証です。
レスポンスとして返ってきた20個の山データのうち、1個目(利尻山)と20個目(西吾妻山)が百名山のデータであるかhttps://www.yamareco.com/modules/yamainfo/ptlist.php?groupid=1で確認します。
あってますね。 それではjqコマンドで20個の山データを名前一覧に加工して比較してみましょう。
{ "err": 0, "poilist": [ { { "ptid": "1", "name": "利尻山", "yomi": "りしりざん", "name_en": "Mt. Rishirizan", "elevation": "1721", "lat": "45.178583", "lon": "141.242028", "detail": "", "area": "109", "types": [ { "type_id": "1", "name": "山頂", "detail": "" }, { "type_id": "14", "name": "トイレ", "detail": "携帯トイレブース有り ※携帯トイレ必須" } ], "photo_url": "https://yamareco.org/modules/yamainfo/upimg/pt/c0a89f6b8d8dd5faaa137b9a52a437e1.JPG", "page_url": "http://www.yamareco.com/modules/yamainfo/ptinfo.php?ptid=1" }, . . . ] }となってます。今回は山データにアクセスしたいのでkeyはpoilistとなります。 pilistのvalueは配列になっており、その要素もkey-value形式になっています。 なので例えば利尻山というvalueだけに絞り込みたい場合は、
jq '.poilist[0].name'のようにアクセスします。.poilist[0]は配列poilistの先頭要素を表し、それもkey-value形式になっているので、さらに.nameでkeyを指定してvalueを取り出す感じです。
仕切り直して、jqコマンドで20個の山データを名前一覧に加工して比較してみます。
groupidを追加したsearchPoiの結果 (クリックで折りたたみを展開)
$ curl -X POST https://api.yamareco.com/api/v1/searchPoi -d "page=1&type_id=0&groupid=1" | jq '.poilist[].name' % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 20105 0 20079 100 26 59581 77 --:--:-- --:--:-- --:--:-- 59658 "利尻山" "羅臼岳" "斜里岳" "雌阿寒岳" "羊蹄山" "大雪山" "トムラウシ山" "十勝岳" "幌尻岳" "岩木山" "八甲田大岳" "八幡平" "岩手山" "早池峰山" "蔵王山" "鳥海山" "月山" "大朝日岳" "飯豊山" "西吾妻山"
うん、あってますね。
100個のデータがあってるか検証
百名山ということなので、山は100個あります。ですので、groupid=1
かつpage
が1~5のデータが百名山になりますので。
一旦名前だけ取得してみましょう。
百名山の名前だけ取得する (クリックで折りたたみを展開)
$for i in `seq 1 5` do curl -X POST https://api.yamareco.com/api/v1/searchPoi -d "page=$i&type_id=0&groupid=1" | jq '.poilist[].name' done % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 20124 0 20098 100 26 57259 74 --:--:-- --:--:-- --:--:-- 57170 "利尻山" "羅臼岳" "斜里岳" "雌阿寒岳" "羊蹄山" "大雪山" "トムラウシ山" "十勝岳" "幌尻岳" "岩木山" "八甲田大岳" "八幡平" "岩手山" "早池峰山" "蔵王山" "鳥海山" "月山" "大朝日岳" "飯豊山" "西吾妻山" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 19644 0 19618 100 26 56863 75 --:--:-- --:--:-- --:--:-- 56939 "安達太良山" "磐梯山" "那須岳" "男体山" "奥白根山" "会津駒ヶ岳" "越後駒ヶ岳" "平ヶ岳" "巻機山" "燧ヶ岳" "至仏山" "谷川岳" "武尊山" "苗場山" "筑波山" "皇海山" "赤城山" "両神山" "雲取山" "丹沢山" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 22093 0 22067 100 26 55305 65 --:--:-- --:--:-- --:--:-- 55232 "甲武信ヶ岳" "金峰山" "瑞牆山" "大菩薩嶺" "雨飾山" "妙高山" "火打山" "高妻山" "草津白根山" "四阿山" "浅間山" "白馬岳" "五竜岳" "鹿島槍ヶ岳" "剱岳" "立山" "薬師岳" "黒部五郎岳" "水晶岳" "鷲羽岳" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 25895 0 25869 100 26 41127 41 --:--:-- --:--:-- --:--:-- 41168 "白山" "荒島岳" "富士山" "美ヶ原" "霧ヶ峰" "蓼科山" "赤岳" "槍ヶ岳" "穂高岳" "常念岳" "笠ヶ岳" "焼岳" "乗鞍岳" "御嶽山" "木曽駒ヶ岳" "空木岳" "恵那山" "甲斐駒ヶ岳" "仙丈ヶ岳" "鳳凰山" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 17251 0 17225 100 26 40339 60 --:--:-- --:--:-- --:--:-- 40306 "北岳" "間ノ岳" "天城山" "塩見岳" "悪沢岳" "赤石岳" "聖岳" "光岳" "伊吹山" "大峰山" "大台ヶ原山" "剣ヶ峰" "剣山" "石鎚山" "阿蘇山" "九重山" "祖母山" "霧島山" "開聞岳" "宮之浦岳"
見事、百名山に絞り込めましたね!
まとめ
まとめると下記のようになります。
値 | |
---|---|
method | POST |
url | https://api.yamareco.com/api/v1/searchPoi |
リクエストパラメータ名 | 値 |
---|---|
page | 1~5 |
type_id | 0 |
groupid | 1 |
レスポンスパラメータは上記で紹介したAPIマニュアルを参照ください。
上記のリクエストパラメータとjqコマンドを組み合わせて百名山の欲しい情報のみを抽出しましょう!
補足ですが、groupid=2を指定すると二百名山のデータが得られます。なのでgroupidを使うことで他にもたくさんの情報にアクセスできますね。
Good MounTech Lifeをお過ごしくださいー!
ここまで読んでいただきありがとうございますー!