MORITOMOMENT

登山好きエンジニアのテックブログ

プログラミング・アウトドア関連を中心に発信

ヤマレコAPIを用いて百名山の情報を集めてみた

f:id:moritomo7315:20191229223829j:plain

表題の通り百名山の情報をヤマレコ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つです。

www.yamareco.com

ヤマレコAPIのマニュアルはこちらです。

sites.google.com

ヤマレコ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じゃ百名山の情報絞り込めないのかと諦めていましたが、ヤマレコの百名山一覧ページにヒントが隠れていました。

下記リンクはヤマレコで百名山で絞り込んだヤマリストのページとなっております。

www.yamareco.com

このページが作れてるんなら何か方法はあるはず、

パラメータ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個の山データを名前一覧に加工して比較してみましょう。

ここでjqコマンドの使い方について簡単に説明します。 jq .key名でkeyを指定してvalueにアクセスすることができます。今回のレスポンスの構成は
{
  "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
"北岳"
"間ノ岳"
"天城山"
"塩見岳"
"悪沢岳"
"赤石岳"
"聖岳"
"光岳"
"伊吹山"
"大峰山"
"大台ヶ原山"
"剣ヶ峰"
"剣山"
"石鎚山"
"阿蘇山"
"九重山"
"祖母山"
"霧島山"
"開聞岳"
"宮之浦岳"

見事、百名山に絞り込めましたね!

まとめ

今回は百名山の情報をヤマレコAPIを用いて集めてみました。

まとめると下記のようになります。

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をお過ごしくださいー!

ここまで読んでいただきありがとうございますー!