Processingから駅すぱあとWebAPIを使ってみる話。

[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)、25日目の今日は[Processing]("https://processing.org")から駅すぱあとWebAPIを使ってみる話をしてみようと思います。

 * [Processing]("https://processing.org")
 * [Processing(Wikipedia)](Processing)

Processingはビジュアルデザインに主眼を置いた初学者向けのプログラミング言語＋開発環境なのですが、Javaのクラス(Swingとか!)を呼び出せたり、WebAPIを呼び出す機能も用意されています。

そこで今回は、Processingから駅すぱあとWebAPIを呼び出すサンプルを作成してみました。

## 簡単なAPIを呼び出してみる

まずは[1日目の記事](http://qiita.com/valsitoh/items/37e18cb76944cc7d05fe#webapi%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)にあった、`/dataversion`を呼び出してみます。

HTTPリクエストの送出・レスポンスの取得は`processing.data.loadJSONObject()`で行えます。取得したJSONオブジェクトの要素を`getJSONObject()`で辿り、値を`getString()`で取得するという流れになります。

```java
void setup() {
  size(200, 200);
}
void draw() {
  background(255);
  fill(0);
  
  String api_url = "http://api.ekispert.jp/v1/json/dataversion?key=<アクセスキーを入力>";
  
  JSONObject res = loadJSONObject(api_url);
  String api_version    = res.getJSONObject("ResultSet").getString("apiVersion");
  String engine_version = res.getJSONObject("ResultSet").getString("engineVersion");
  
  text("API Version   : " + api_version,    10, 50);
  text("Engine Version: " + engine_version, 10, 60);
}
```

実行結果は以下のようになります。

![スクリーンショット 2016-12-25 22.47.55.png](https://qiita-image-store.s3.amazonaws.com/0/152217/4306ffd1-fc15-0459-d470-3028b3122103.png)

## 経路探索結果を取得してみる

もうちょっと実用的な使い方をしてみたいので、[4日目の記事](http://qiita.com/valsitoh/items/79a8902a2e7ad547015d)のような感じで`/search/course/plain`による[平均待ち時間探索](http://docs.ekispert.com/v1/api/search/course/plain.html)をProcessingから呼び出してみます。

ソースコードは以下のようになります。JavaScriptだと`JSON.parse()`で取得したオブジェクトから要素名で辿るだけで良かったのですが、Processingの場合は少々面倒な感じですね...。
単一の要素の場合と配列で帰ってくる要素の取得を`getJSONObject(String)`と`getJSONArray().getJSONObject(int)`でちゃんと意識しないといけないところが大変ですね。

```java
void setup() {
  size(200, 200);
}
void draw() {
  background(255);
  fill(0);
  
  String api_url = "http://api.ekispert.jp/v1/json/search/course/plain?key=<アクセスキーを入力>&from=22828&to=22671";
  
  JSONObject res = loadJSONObject(api_url);
  JSONObject course = res.getJSONObject("ResultSet").getJSONArray("Course").getJSONObject(0);
  JSONArray  point = course.getJSONObject("Route").getJSONArray("Point");

  String from = point.getJSONObject(0).getJSONObject("Station").getString("Name");
  String to   = point.getJSONObject(1).getJSONObject("Station").getString("Name");
  
  String line = course.getJSONObject("Route").getJSONArray("Line").getJSONObject(0).getString("Name");
  String price = course.getJSONArray("Price").getJSONObject(0).getString("Oneway");

  int y = 30;
  text("□ " + from, 10, y); y += 15;
  text("│ " + line, 10, y); y += 15;
  text("│ " + price + "円", 10, y); y += 15;
  text("□ " + to,   10, y);
}
```

実行結果は以下のようになります。無事に探索結果が取得できています。

![スクリーンショット 2016-12-25 23.20.22.png](https://qiita-image-store.s3.amazonaws.com/0/152217/de7f2fc0-6774-61f6-3acc-fce8d7ea4b52.png)

## まとめ

Processingで駅すぱあとWebAPIを利用するサンプルを紹介してみました。WebAPIの形で機能を提供しているので様々なツールとの連携が比較的容易です（意外とJSONのパース方法が異なる感じではありますが...）。
他にもWebAPIを利用できる環境・ツールがあれば試してみたいと思います。

## おわりに

今年から始めてみた[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)ですが、無事に完走することができました。
これも記事を投稿してくださった[hmaruyama](http://qiita.com/hmaruyama)さん、[valitoh](http://qiita.com/valitoh)さん、[t_ryusuke](http://qiita.com/t_ryusuke)さん、[aosho235](http://qiita.com/aosho235)さん、[nakano348](http://qiita.com/nakano348)さん、[uchimanajet7](http://qiita.com/uchimanajet7)さん(投稿日順です)のご協力によるものです。本当にありがとうございます。

来年もAdvent Calendarを開催できればと思いますので、どうか何卒よろしくお願いいたします。