さて、今日も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();
下図のように駅情報(乗降人員数)が取得できます。
駅情報とと乗降人員数情報を合わせて、特定の駅の年度別の乗降人員数情報を調べる
GetStationsメソッド
を使用すると下記のように路線や施設情報を指すIDを持った駅情報を取得することができます。下図の赤枠で囲んだ駅情報クラスのPassengerSurveyプロパティ
には、調査年度別の乗降人員数情報を指すIDが保持されています。
PassengerSurveyプロパティ
に含まれるIDを用いて、特定の駅の調査年度別の乗降者員数を調べてみましょう。
まずは、駅情報を取得して、駅情報の中から「飯田橋駅」を抽出します。飯田橋駅のPassengerSurveyプロパティには下図のように2011年度から2013年度までの調査結果のIDが格納されています。
次に、乗降人員数を取得して、該当する乗降人員数情報を抽出します。
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人