山座同定APIを使ってみる

山座同定APIを使ってみる

2016年8月10日、NTTドコモは「山座同定API」というAPIをリリースしました。もちろんその翌日、2016年8月11日は初めての「山の日」という祝日を意識してのものかと思います。本記事ではこの「山座同定API」の利用法について紹介します。  
  
# 山座同定  
山座同定とはWikipediaによると、  
> 山座同定（さんざどうてい）とは、展望できる山の名称を地図（地形図）や方位磁針などの使用によって明らかとすること。 
 
とあります。なお、山座同定は調べた限り、英語には定訳とされる言葉がないようです。もしご存じの方はこっそり教えて下さい。  
  
# 利用シーン  
山座同定の定義にもある通り、山を展望しながらこの山は何山なのかを識別することが想定されています。スマートフォンのアプリケーションとしてその場で識別する使い方です。しかし、過去に撮っている写真に写っている山を対象にすることもできます。先日、高尾山に登って撮影した写真を利用して山座同定してみましょう。  
  
  
# 対象とする写真  
iPhone 6S plusで撮影した写真です。  
![対象画像](https://gist.github.com/odasatoshi/a8aaeb4f25f83c3ce010f732fa522192/raw/96673d342503f749fb907156f3fd699f8f493265/IMG_0177.JPG "対象画像")

  
iPhoneの場合、カメラアプリが位置情報などを使うことを許可していると、様々な情報が入ります。特にGPS内に入っている緯度、経度、方位角などの情報を今回は使います。

![GPS画像](https://i.gyazo.com/66f2b4a8a2d7bab72110dc7a4e0da527.png "GPS画像")
  
  
# レンダリング  
まずは、この位置から見えるはずの稜線をレンダリングしてみましょう。  
APIのリファレンスを見ると、稜線をレンダリングするために必要な情報は以下のとおりです。一つづつ見ていきます。  
  
- lat   緯度。10進数の北緯で記述します。  
- lon   経度。10進数の東経で記述します。  
- azimuth       方位角(北を0度として時計回り)。  
- altura        仰俯角(水平方向を0度として、真上が90度、真下が-90度)。  
- angleOfView   画角。  
- APIKEY        APIにアクセスするアプリの認証に利用する。  
  
まず、画像のメタ情報には、北緯35度37分28.428秒という60進表記で位置情報が入っているようです。これを10進数表記に直さなくてはなりません。
> Latitude: 35° 37' 28.428" N 
> Longitude: 139° 14' 34.95" E

なので、
35 + 37/60 + 28.428/3600 = 35.62456333...
139 + 14/60 + 34.95/3600 = 139.2430417...
簡単ですね。

次に、方位角です。方位角は、217.738と書いてあります。南南西といったところでしょうか。

次に仰俯角です。水平に比べてどれぐらい上を向いているか（下を向いているか）です。画像のメタ情報にはないようです。写真を見た感じほんのり下を向いている気がしますが、ほぼ水平だと思うことにしましょう。スマートフォンで独自アプリであれば写真をとった時のチルトを取得すれば正確な値が出るかと思います。設定する値は0です。 

そして、画角。画角は、焦点距離と画像の横幅の情報があれば計算可能です。iPhone6Sのアウトカメラの場合は、73度だそうです。

最後にAPI Key。
これは、Docomo Developer SupportのAPI利用申請・管理から行うことが出来ます。
16進で86文字もあるので、かなり長いです。 

curl -XGET -G "https://api.apigw.smt.docomo.ne.jp/mountainIdentification/v1/ridgeRendering?APIKEY=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" \
     -d lat=35.62456333 \
     -d lon=139.2430417 \
     -d azimuth=217.738 \
     -d altura=1.0 \
     -d angleOfView=73.0
     
     
すると、
> {"jobId":"00000000000000000000000000000000000000000000000000","ridge":[235,234,234,234,233,233,233,232,232,232,232,232,232,232,232,232,231,231,231,230,231,231,231,231,231,231,232,232,232,233,23
3,233,233,233,233,234,234,234,235,235,235,235,235,235,235,236,236,236,236,236,236,236,237,237,237,237,237,238,238,238,238,238,238,238,239,239,239,239,239,239,239,239,239,240,240,240,240,240,240
,240,240,239,239,239,239,238,238,238,238,238,238,238,238,237,237,237,237,237,236,236,236,236,235,235,235,234,234,234,234,235,235,235,234,234,234,233,233,233,233,233,233,234,234,234,235,235,235,
235,235,235,235,234,234,234,233,233,233,232,232,232,232,232,232,232,232,232,232,232,232,233,233,232,232,232,232,232,231,231,231,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,230,2
30,230,230,230,230,229,229,229,229,229,228,228,228,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,226,226,226,225,225,225,225,225,225,226,226,227,227,227,227,227,227,22
7,227,226,226,226,225,226,226,226,225,225,225,225,225,225,225,225,225,225,225,226,226,225,225,226,226,226,226,225,225,225,224,225,225,226,226,226,226,226,226,226,226,226,225,225,225,224,224,224
,224,224,224,224,224,225,225,225,225,226,226,227,227,227,228,228,228,228,228,228,228,228,228,228,227,228,228,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,226,226,226,
226,226,226,226,227,227,227,227,227,227,227,227,227,227,227,227,227,227,227,228,228,228,228,229,229,229,229,229,230,230,230,230,230,231,231,231,232,232,232,232,233,233,233,233,233,233,233,233,2
33,233,233,234,234,235,235,235,235,234,234,234,235,235,235,235,236,236,235,235,235,234,234,234,234,234,234,234,234,233,233,233,233,233,233,233,233,232,232,232,232,231,231,231,230,230,230,230,23
0,229,229,229,228,228,228,227,227,227,227,227,228,228,228,229,229,229,230,230,230,231,231,231,231,231,231,231,230,230,230,230,231,231,231,231,231,231,231,231,231,231,231,230,230,230,229,229,228
,228,228,227,227,227,226,226,226,225,225,224,224,224,224,224,224,224,224,224,224,224,225,225,226,226,227,227,227,228,228,229,229,229,230,230,230,230,231,231,231,232,232,232,232,232,232,232,232,
232,232,232,232,232,233,233,233,233,233,233,233,233,233,233,232,232,232,232,232,233,232,232,232,232,232,232,231,232,232,232,232,232,232,232,231,231,231,231,232,232,232,232,232,233,233,233,233,2
32,233,233,233,233,233,233,233,233,234,234,234,234,234,234,235,235,235,235,236,236,236,236,236,236,236,236,236,236,236,236,236,235,235,236,236,236,236,236,236,236,236,237,237,237,237,237,237,23
8,238,238,238,238,238,238,238,239,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,237,237,237,237],"summit":[{"x":20,"y":231,"id":0,"name":"\u5927\u5C71"},{"x":274,"y":2
24,"id":1,"name":"\u4E39\u6CA2\u5C71<\u86ED\u30F6\u5CB3>"},{"x":211,"y":226,"id":2,"name":"\u4E39\u6CA2\u5C71"},{"x":189,"y":229,"id":3,"name":"\u4E39\u6CA2\u5C71<\u5854\u30CE\u5CB3\uFF08\u5854
\u30F6>"},{"x":425,"y":228,"id":4,"name":"\u5927\u5BA4\u5C71"},{"x":511,"y":232,"id":5,"name":"\u5FA1\u6B63\u4F53\u5C71"},{"x":479,"y":225,"id":6,"name":"\u5BCC\u58EB\u5C71<\u5263\u30F6\u5CEF>"},{"x":592,"y":237,"id":7,"name":"\u6BDB\u7121\u5C71"}],"ridgeWidth":640,"ridgeHeight":480}

描画してみました。

![描画してみる](https://i.gyazo.com/e68ea2cd46cfa8c57634e90b56a7b959.png "描画してみる")


稜線が表示されているようです。
これだけだと、よく分からないので山頂の情報も付与してみます。
山頂の情報は"summit"に書かれている
{"x":20,"y":231,"id":0,"name":"\u5927\u5C71"},
{"x":274,"y":224,"id":1,"name":"\u4E39\u6CA2\u5C71<\u86ED\u30F6\u5CB3>"},
{"x":211,"y":226,"id":2,"name":"\u4E39\u6CA2\u5C71"},
{"x":189,"y":229,"id":3,"name":"\u4E39\u6CA2\u5C71<\u5854\u30CE\u5CB3\uFF08\u5854\u30F6>"},
{"x":425,"y":228,"id":4,"name":"\u5927\u5BA4\u5C71"},
{"x":511,"y":232,"id":5,"name":"\u5FA1\u6B63\u4F53\u5C71"},
{"x":479,"y":225,"id":6,"name":"\u5BCC\u58EB\u5C71<\u5263\u30F6\u5CEF>"},
{"x":592,"y":237,"id":7,"name":"\u6BDB\u7121\u5C71"}
山頂情報を重畳してみましょう。


![頂上重畳](https://i.gyazo.com/e29adb07efcb01c30eb78a75d3dbe2d4.png "頂上重畳")

| 頂点ID  | 山の名前 |
|:-------|------------:|
|0       |  大山|
|1       |  丹沢山<蛭ヶ岳>|
|2       |  丹沢山|
|3       |  丹沢山<塔ノ岳>|
|4  |  大室山|
|5  |  御正体山|
|6  |  富士山<剣ヶ峯>|
|7  |  毛無山|

これを重畳すると、
![重畳](https://i.gyazo.com/2d8468056e6feec0d327f06a5a5f1810.png "重畳")

どうでしょうか？仰角を適当に入力したので、稜線が下にズレています。
6が富士山なので遠くまで晴れていればこの辺りに富士山が見えるようです。

# 関連スクリプト

最後に、関連スクリプトと利用したファイルを以下のgistにまとめておきます
https://gist.github.com/odasatoshi/a8aaeb4f25f83c3ce010f732fa522192