「駅すぱあとWebサービス」個人的推し機能3選(範囲探索・住所情報からの周辺駅検索・バス路線時刻表)

ヴァル研究所アドベントカレンダー2018の8日目です。

![EWS_mini.png](https://qiita-image-store.s3.amazonaws.com/0/159912/99c27cb1-ae66-0e28-56ee-ae42d88fa636.png)

経路探索サービス「駅すぱあと」の持つ機能や情報をWebAPIで利用できるサービス「駅すぱあとWebサービス」には、たくさんの機能があります。
地理・交通好きな自分が個人的にグッと機能を3つ紹介します。

# 駅すぱあとWebサービスってなに?
「駅すぱあとWebサービス」は、経路探索サービス「駅すぱあと」の持つ機能や情報をWebAPIで利用できるサービスです。
**経路探索**はもちろん、以下のような機能を簡単に使うことができます。

* 条件を指定した経路探索
* 定期券関連の機能(「定期券を使ったら運賃はXX円」みたいな)
* 範囲探索(「◯◯駅からX分の駅」みたいな)
* 駅や路線の情報の取得(名称、位置、路線など)
* 時刻表の取得
* 鉄道運行情報の取得
などなど

なんでもござれです。
詳しい情報やアクセスキーのお申し込みは[こちら](https://ekiworld.net/service/lp/webservice/)から

申し込み不要で「駅すぱあとWebサービス」を体験できる「API Tester」というツールもあります。↓
[アクセスキー要らず!!API Testerで 駅すぱあとWebサービスに簡単入門する](https://qiita.com/kumatira/items/5771a8a637963aab91f9)

# 推し機能(1)  範囲探索
まずは「範囲探索」という機能です。「〇〇駅からXX分で行ける駅」の一覧を求めることができます。
やってみましょう!!

## リクエスト

例えば新宿駅(駅コード:22741)から180分以内に行ける駅を取得してみましょう。
範囲探索機能を示すパス `/v1/{format}/search/multipleRange` に以下のリクエストを投げます。各パラメータは以下の通り指定します。各パラメータについての詳しい説明は[ドキュメント](http://docs.ekispert.com/v1/api/search/multipleRange.html)をご覧ください。

|パラメータ|値 |備考|
|:-----------------|:------------------|:------------------|
|format|JSON|JSON or XML|
|baseList|22741|起点となる駅の駅コードを指定。駅コードは[駅簡易情報機能](http://docs.ekispert.com/v1/api/station/light.html)などで取得できる。複数でもOK|
|upperMinute|180|所要時間の上限値。分単位。10〜200|


```http:request
https://api.ekispert.jp/v1/json/search/multipleRange?baseList=22741&upperMinute=180&key={your_accessskey}
```

## レスポンス
レスポンスはこんな感じ


```json:response
{
  ResultSet: {
    apiVersion: "1.27.0.0",
    engineVersion: "201812_02a",
    Point: [
      {
        Station: {
          code: "29342",
          Name: "新宿(東京メトロ)",
          Type: "train"
        },
        Prefecture: {
          code: "13",
          Name: "東京都"
        },
        Cost: {
          baseIndex: "1",
          Minute: "2",
          TransferCount: "0"
        }
      },
     (中略)
      {
        Station: {
          code: "24721",
          Name: "富山",
          Type: "train"
        },
        Prefecture: {
          code: "16",
          Name: "富山県"
        },
        Cost: {
          baseIndex: "1",
          Minute: "180",
          TransferCount: "1"
        }
      }
    ],
    Base: {
      Point: {
        Station: {
          code: "22741",
          Name: "新宿",
          Type: "train"
        },
        Prefecture: {
          code: "13",
          Name: "東京都"
        }
      }
    }
  }
}
```

`$.ResultSet.Point`要素に駅を示す要素がたくさん入っています。
`$.ResultSet.Point.[*].Station.name`にはその駅の駅名が、`$.ResultSet.Point.[*].Cost.Minute`にはそこまでの所要時間が返っています。

わかりづらいので[駅すぱあと路線図](http://rosenzu.strikingly.com/)にプロットしてみました:eyes:
(こちらも簡単に体験できるページがあります。きになる方は→ [今から、すぐに、始める駅すぱあと路線図](https://qiita.com/zaki_taka4/items/8370b02450c2f46943de))

<img width="1310" alt="スクリーンショット 2018-12-09 17.04.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/159912/8cfb2786-5333-73a6-50d1-56c1dab2d7fd.png">

関東周辺はピンが多すぎて気持ち悪いことになっていますが、新宿から180分あるとかなりの範囲に行くことができることがわかりますね。一番近いのは東京メトロの新宿駅、一番遠いのは富山駅のようです。新幹線や特急の停車駅は飛び石のようにピンが立っているのも面白いですね

baseListに複数の値を指定すれば、「XX駅とYY駅の両方からNN分以内の駅」なども取得できます。いろんなことができそうな機能なので推しの一つです。

# 推し機能(2) 住所情報からの周辺駅検索
こちらはその名の通り、住所をリクエストするとその周辺の駅の情報を取得できる機能です。

## リクエスト
弊社の大阪営業所住所を例に、住所情報からの周辺駅検索機能を示すパス`/v1/{format}/address/station`に以下のリクエストを投げます。
各パラメータについては[ドキュメント](http://docs.ekispert.com/v1/api/address/station.html)をご覧ください。

|パラメータ|値 |備考|
|:-----------------|:------------------|:------------------|
|format|JSON|JSON or XML|
|address|大阪府大阪市北区大深町3番1号,500|住所情報。カンマの後に半径(m)をつけることができる。半径をつけない場合は一番近い1つを返す。|
|type|train|取得する駅の種類。busなどが指定できる。何も指定しない場合は、全ての種類が対象。|

```http:request
https://api.ekispert.jp/v1/json/address/station?address=大阪府大阪市北区大深町3番1号,500&type=train&key={your_accessskey}
```

## レスポンス
レスポンスはこんな感じ

```json:response
{
  ResultSet: {
    apiVersion: "1.27.0.0",
    engineVersion: "201812_02a",
    Point: [
      {
        Station: {
          code: "25848",
          Name: "梅田(阪急線)",
          Type: "train",
          Yomi: "うめだ"
        },
        Prefecture: {
          code: "27",
          Name: "大阪府"
        },
        GeoPoint: {
          longi: "135.30.4.9",
          lati: "34.42.7.69",
          longi_d: "135.501138",
          gcs: "tokyo",
          lati_d: "34.702139"
        },
        Distance: "338"
      },
    (中略)
      {
        Station: {
          code: "25847",
          Name: "梅田(阪神線)",
          Type: "train",
          Yomi: "うめだ"
        },
        Prefecture: {
          code: "27",
          Name: "大阪府"
        },
        GeoPoint: {
          longi: "135.29.59.0",
          lati: "34.41.53.0",
          longi_d: "135.499722",
          gcs: "tokyo",
          lati_d: "34.698056"
        },
        Distance: "494"
      }
    ],
    Base: {
      Point: {
        Name: "大阪府大阪市北区大深町３－１,500"
      }
    }
  }
}
```

`$.ResultSet.Point.[*].Station.Name`にはその駅の駅名が、`$.ResultSet.Point.[*]. Distance `にはそこまでの距離が返っています。
一番近いのは阪急電車の梅田駅、一番遠いのは阪神電車の梅田駅とわかります。営業所のが入っているグランフロント大阪があるのは、梅田の北側なので当然といえば当然ですね。

こんな感じで住所から最寄駅を簡単に取ることができます。筆者はターミナル駅を歩くのが好きで、リクエストをしてはレスポンスをみてニヤニヤできるので推し機能に入れました。

# 推し機能(3) バス路線時刻表
最後は少しマイナーな「バス路線時刻表」機能です。バスの路線図をみているとこのようになっていることはないでしょうか？

<img width="259" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/159912/7c0d0e7d-88d2-3ca5-09b3-2837fbd414db.png">

バスは複数の系統が同じ場所を走っていることが多く、1つの系統について時刻表を取得してもあまり意味が無いケースがあります。
「バス路線時刻表」機能では、あるバス停間(XX駅→YY市役所 のような)について、複数の系統を束ねた時刻表を取得することができます!!

## リクエスト

「渋谷駅前(東側)／都営バス(駅コード：35656)」から「ＥＸシアター六本木前／都営バス(駅コード:36668)」を例に、バス路線時刻表機能を示すパス`/v1/json/bus/timetable`へ以下の通りリクエストしてみましょう。

各パラメータについては[ドキュメント](http://docs.ekispert.com/v1/api/bus/timetable.html)をご覧ください。

|パラメータ|値 |備考|
|:-----------------|:------------------|:------------------|
|format|JSON|JSON or XML|
|from|35656|区間の起点。「渋谷駅前(東側)／都営バス」。駅コードは[駅簡易情報機能](http://docs.ekispert.com/v1/api/station/light.html)などで取得できる。|
|to|36668|区間の終点。「ＥＸシアター六本木前／都営バス」。|

```http:request
https://api.ekispert.jp/v1/json/bus/timetable?from=35656&to=36668&key={your_accessskey}
```

##  レスポンス
レスポンスはこんな感じです。

```json:response
{
  ResultSet: {
    apiVersion: "1.27.0.0",
    engineVersion: "201812_02a",
    TimeTable: {
      Station: {
        Name: "渋谷駅前(東側)／都営バス"
      },
      Line: [
        {
          trainID: "0",
          Name: "都０１(渋谷駅前－新橋駅前)",
          ArrivalState: {
            no: "4",
            Datetime: {
              text: "06:38:00+09:00",
              operation: "today"
            }
          },
          (略)
        },
        {
          trainID: "1",
          Name: "渋８８",
          ArrivalState: {
            no: "4",
            Datetime: {
              text: "06:40:00+09:00",
              operation: "today"
            }
          },
          (略)
        },
        (中略)
        {
          trainID: "266",
          Name: "深夜０１※深夜バス(渋谷駅－新橋駅)",
          ArrivalState: {
            no: "4",
            Datetime: {
              text: "00:16:00+09:00",
              operation: "yesterday"
            }
          },
          (略)
        }
      ]
    }
  }
}
```

`$.ResultSet.TimeTable.Line`要素にはバス1本1本を表す要素がたくさん入っています。`$.ResultSet.TimeTable.Line[*].Name`要素にはそのバスの系統名が返っています。確かにいろんな系統を束ねて時刻表を取得することができていますね!!

# まとめ
ということで「[範囲探索](http://docs.ekispert.com/v1/api/search/multipleRange.html)」・「[住所情報からの周辺駅検索](http://docs.ekispert.com/v1/api/address/station.html)」・「[バス路線時刻表](http://docs.ekispert.com/v1/api/bus/timetable.html)」という3つの推し機能をご紹介しました!!どれもアイディア次第で様々なアプリケーションに組み込めそうなものです。

駅すぱあとWebサービスが気になった方は[こちら](https://ekiworld.net/service/lp/webservice/)からcheck it out!!