酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

C#で東京メトロオープンデータAPIを使って遅延時間(遅延情報)を取得する

先週末、東京メトロオープンデータ活用コンテストに向けて、@daisuke_nomura がミニ勉強会を開いてくれました。東京メトロオープンデータ活用コンテストについてはこちらのページをご覧ください。

取得可能なデータに関しては下記の通りです。

f:id:ch3cooh393:20140924162319p:plain

  • 東京メトロ全線の列車位置、遅延時間等に係るデータを提供 ※データは1分ごとに配信
    • 方向(どこ方面行きか)
    • 列車番号
    • 列車種別(各停、特急、急行、快速、臨時)
    • 始発駅・行先駅
    • 所属会社(どの鉄道事業者の車両か)
    • 在線位置(ホーム、駅間の2区分)
    • 遅延時間(5分以上の遅延を「遅延」として表示)
  • 上記データに加え列車・施設に関する多様なデータを提供 (従前より東京メトロのホームページで公開している情報を、データ形式を変えて提供
    • 列車情報(列車時刻表、運賃表、駅間所要時間、各駅の乗降人員数、女性専用車両)
    • 施設情報(バリアフリー情報、駅出入口情報、車両ごとの最寄り施設・出入口案内)

これらのデータはJSON-LDの形式で返ってきます。

遅延情報を取得する

APIのを調べるために、ミニ勉強会の中で一番簡単そうな遅延時間を取得しましょう。JSON-LDのパースにはJSON.NETを使用します。JSON.NETの素晴らしいところは型を指定してデシリアライズすることができるところです。

事前に下記のようなTrainInformationクラスを定義しておきましょう。

using Newtonsoft.Json;
using System;

namespace TokyoMetro.Apis
{
    public class TrainInformation
    {
        [JsonProperty("@context")]
        public string Context { get; set; }

        [JsonProperty("@id")]
        public string Id { get; set; }

        [JsonProperty("dc:date")]
        public DateTime Date { get; set; }

        [JsonProperty("dct:valid")]
        public DateTime Valid { get; set; }

        [JsonProperty("odpt:operator")]
        public string Operator { get; set; }

        [JsonProperty("odpt:railway")]
        public string Railway { get; set; }

        [JsonProperty("odpt:timeOfOrigin")]
        public DateTime TimeOfOrigin { get; set; }

        [JsonProperty("odpt:trainInformationText")]
        public string TrainInformationText { get; set; }

        [JsonProperty("@type")]
        public string Type { get; set; }
    }
}

次に、東京メトロオープンデータを扱うためのTokyoMetroApiクラスを作ります。東京メトロオープンデータAPIのエンドポイントは秘匿する必要があるため、下記のサンプルコードでは公開していませんので、ぜひ専用サイトのAPI仕様を見て頂きたいです。エンドポイントは公開して問題ありませんでした。

using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;
using System.Net;

namespace TokyoMetro.Apis
{
    public class TokyoMetroApi
    {
        public string ConsumerKey { get; private set; }

        public string EndPointUrl { get; private set; }

        public TokyoMetroApi(strxing consumerKey)
        {
            ConsumerKey = consumerKey;
            EndPointUrl = "https://api.tokyometroapp.jp/api/v2/";
        }

        public IEnumerable<TrainInformation> GetTrainInformation()
        {
            var parm = new Dictionary<string, string>();
            parm["rdf:type"] = "odpt:TrainInformation";
            parm["acl:consumerKey"] = ConsumerKey;

            var url = string.Format("{0}?{1}", EndPointUrl,
                string.Join("&", parm.Select(p => string.Format("{0}={1}", p.Key, p.Value))));

            // JSON-DLを取得する
            var client = new WebClient()
            {
                Encoding = System.Text.Encoding.UTF8
            };
            var json = client.DownloadString(url);

            return JsonConvert.DeserializeObject<TrainInformation[]>(json);
        }
    }
}

さて、実際に使う際には下記のようにコンシューマキーを指定して、TokyoMetroApiクラスのインスタンスを生成してGetTrainInformationメソッドを実行します。

var consumerKey = "XXXXXXXXXXXXXXXXXXXXXXXXXX";
var api = new TokyoMetroApi(consumerKey);

// 遅延時間を取得する
var trainInformation = api.GetTrainInformation();

下図のように遅延情報が取得できます。Railwayプロパティを見ると路線名がIDになっているのが分かります。

f:id:ch3cooh393:20140922005821p:plain

次回は路線情報を取得する方法をご紹介します。

関連記事:C#で扱う東京メトロオープンデータAPI