読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

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

C#で東京メトロオープンデータAPIを使って駅情報(乗降人員数)を取得する

さて、今日もC#で東京メトロオープンデータAPIを使ってみましょう。本記事では、odpt:PassengerSurveyを指定して、駅情報(乗降人員数)を取得します。

東京メトロ駅情報を取得する

東京メトロの駅情報は、JSON.NETを使って取得したJSON-LD形式のデータをパース(デシリアライズ)させます。その時、型を指定しますので事前に下記のようにPassengerSurveyクラスを定義しておきましょう。

using Newtonsoft.Json;

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

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

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

        [JsonProperty("owl:sameAs")]
        public string SameAs { get; set; }

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

        [JsonProperty("odpt:surveyYear")]
        public int SurveyYear { get; set; }

        [JsonProperty("odpt:passengerJourneys")]
        public int PassengerJourneys { get; set; }
    }
}

第1回目の時に、東京メトロオープンデータを扱うためのTokyoMetroApiクラスを作っていたので興味のある方は読み返してくださいね。

このTokyoMetroApiクラスにメソッドを追加してみましょう。第3回目で紹介した駅情報を取得するGetStationsメソッドの実装については「C#で東京メトロオープンデータAPIを使って駅情報を取得する - 酢ろぐ!」をご覧ください。後述の駅情報と乗降人員数情報とを合わせるTipsを紹介しますのでこちらの方も興味のある方はご参照ください。

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(string consumerKey)
        {
            ConsumerKey = consumerKey;
            EndPointUrl = "https://api.tokyometroapp.jp/api/v2/datapoints/";
        }

        public IEnumerable<TrainInformation> GetTrainInformation()
        {
            // 第1回の記事を参照してください
        }

        public IEnumerable<Railway> GetRailway()
        {
            // 第2回の記事を参照してください
        }

        public IEnumerable<Station> GetStations()
        {
            // 第3回の記事を参照してください
        }

        public IEnumerable<PassengerSurvey> GetPassengerSurvey()
        {
            var parm = new Dictionary<string, string>();
            parm["rdf:type"] = "odpt:PassengerSurvey";
            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<PassengerSurvey[]>(json);
        }
   }
}

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

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

var passengerSurvey = api.GetPassengerSurvey();

下図のように駅情報(乗降人員数)が取得できます。

f:id:ch3cooh393:20140924150453p:plain

駅情報とと乗降人員数情報を合わせて、特定の駅の年度別の乗降人員数情報を調べる

GetStationsメソッドを使用すると下記のように路線や施設情報を指すIDを持った駅情報を取得することができます。下図の赤枠で囲んだ駅情報クラスのPassengerSurveyプロパティには、調査年度別の乗降人員数情報を指すIDが保持されています。

f:id:ch3cooh393:20140924150033p:plain

PassengerSurveyプロパティに含まれるIDを用いて、特定の駅の調査年度別の乗降者員数を調べてみましょう。

まずは、駅情報を取得して、駅情報の中から「飯田橋駅」を抽出します。飯田橋駅のPassengerSurveyプロパティには下図のように2011年度から2013年度までの調査結果のIDが格納されています。

f:id:ch3cooh393:20140924152216p:plain

次に、乗降人員数を取得して、該当する乗降人員数情報を抽出します。

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

// 駅情報を取得する
var stations = api.GetStations();

// 駅情報の中から「飯田橋駅」を取得する
var iidabashiStation = stations
    .Single(station => station.SameAs == "odpt.Station:TokyoMetro.Namboku.Iidabashi");

// 駅情報(乗降人員数)を取得する
var passengerSurvey = api.GetPassengerSurvey();

// 飯田橋駅の乗降人員数を取得する
var iidabashiPassengerSurvey = passengerSurvey
    .Where(survey => iidabashiStation.PassengerSurvey.Contains(survey.SameAs));


foreach (var item in iidabashiPassengerSurvey)
{
    Console.WriteLine("調査年度 {0}年 - 1日あたり {1:#,#}人", item.SurveyYear, item.PassengerJourneys);
}

Visual Studioで上記のサンプルコードを実行すると、出力欄に情報が表示されます。

調査年度 2013年 - 1日あたり 173,224人
調査年度 2012年 - 1日あたり 169,830人
調査年度 2011年 - 1日あたり 166,452人

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