Open Map WeatherのAPIで天気予報を取得するためには無料ライセンス登録が必要です。ライセンス取得後、APIが使用可能になるまで時間がかかる場合があります。すぐにうまくいかないときはしばらく待ちましょう。
ベースとなるURLは以下の通りです。
1 |
https://api.openweathermap.org/data/2.5/forecast/ |
リクエストする際にはURLの末尾にパラメータを追加してください。
東京の天気予報を取得するには
1 |
api.openweathermap.org/data/2.5/forecast?id=1850147&APPID=<取得したキー> |
東京のIDは1850147です。
レスポンスは JSON で返ってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
{ "cod":"200", "message":0, "cnt":40, "list":[ { "dt":1612774800, "main":{ "temp":-0.82, "feels_like":-4.78, "temp_min":-4.57, "temp_max":-0.82, "pressure":1012, "sea_level":1012, "grnd_level":944, "humidity":68, "temp_kf":3.75 }, "weather":[{ "id":600, "main":"Snow", "description":"light snow", "icon":"13n" }], "clouds":{ "all":82 }, "wind":{ "speed":1.79, "deg":26 }, "visibility":10000, "pop":0.43, "snow":{ "3h":0.61 }, "sys":{ "pod":"n" }, "dt_txt":"2021-02-08 09:00:00" }, // 繰り返し ], "city":{ id":1850147, "name":"Tokyo", "coord":{ "lat":35.6895, "lon":139.6917 }, "country":"JP", "population":0, "timezone":32400, "sunrise":1612733740, "sunset":1612772113 } } |
ではさっそくやってみましょう。
ボタンをおすとテキストが取得できていることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public partial class Form1 : Form { System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient(); private async void button1_Click(object sender, EventArgs e) { string str = await GetJson(); richTextBox1.Text = str; } public async Task<string> GetJson() { string apiKey = "apiキーは各自で取得してください"; string url = "https://api.openweathermap.org/data/2.5/forecast?id=1853908&units=metric&cnt=12&APPID=" + apiKey; return await httpClient.GetStringAsync(url); } } |
つぎに取得されたJsonをもとにリストビューに天気予報を表示させてみることにしましょう。
デザイナでListViewを追加します。そして初期化のためのInitListView()メソッドと新しいアイテムを追加するためのAddItem(string dateTime, string weather, string temp, string humidity, string pressure, string wind)メソッドを定義します。リストビューには日時(3時間毎)、天気、気温、湿度、気圧、風速を表示させます。それ以外にもデータは取得できますが、きりがないのでこれくらいにしておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); // リストビューを初期化する InitListView(); } void InitListView() { listView1.View = View.Details; listView1.Font = new Font("MS ゴシック", 9); listView1.Columns.Add("日時"); listView1.Columns.Add("天気"); listView1.Columns.Add("気温"); listView1.Columns.Add("湿度"); listView1.Columns.Add("気圧"); listView1.Columns.Add("風"); listView1.Columns[0].Width = 130; listView1.Columns[4].Width = 70; listView1.Columns[5].Width = 150; } void AddItem(string dateTime, string weather, string temp, string humidity, string pressure, string wind) { ListViewItem item = new ListViewItem(new string[] { dateTime, weather, temp, humidity, pressure, wind }); listView1.Items.Add(item); } } |
Newtonsoft.Jsonをインストールし、
1 2 |
string str = await GetJson(); WeatherResult result = GetDataFromJson(str); |
を実行します。
1 2 3 4 |
WeatherResult GetDataFromJson(string jsonText) { return Newtonsoft.Json.JsonConvert.DeserializeObject<WeatherResult>(jsonText); } |
WeatherResultクラスと関連するクラスは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
public partial class WeatherResult { [Newtonsoft.Json.JsonProperty("cod")] public long Cod { get; set; } [Newtonsoft.Json.JsonProperty("message")] public long Message { get; set; } [Newtonsoft.Json.JsonProperty("cnt")] public long Cnt { get; set; } [Newtonsoft.Json.JsonProperty("list")] public WeatherSummary[] List { get; set; } [Newtonsoft.Json.JsonProperty("city")] public City City { get; set; } } public partial class City { [Newtonsoft.Json.JsonProperty("id")] public long Id { get; set; } [Newtonsoft.Json.JsonProperty("name")] public string Name { get; set; } [Newtonsoft.Json.JsonProperty("coord")] public Coord Coord { get; set; } [Newtonsoft.Json.JsonProperty("country")] public string Country { get; set; } [Newtonsoft.Json.JsonProperty("population")] public long Population { get; set; } [Newtonsoft.Json.JsonProperty("timezone")] public long Timezone { get; set; } [Newtonsoft.Json.JsonProperty("sunrise")] public long Sunrise { get; set; } [Newtonsoft.Json.JsonProperty("sunset")] public long Sunset { get; set; } } public partial class Coord { [Newtonsoft.Json.JsonProperty("lat")] public double Lat { get; set; } [Newtonsoft.Json.JsonProperty("lon")] public double Lon { get; set; } } public partial class WeatherSummary { [Newtonsoft.Json.JsonProperty("dt")] public long Dt { get; set; } [Newtonsoft.Json.JsonProperty("main")] public MainClass Main { get; set; } [Newtonsoft.Json.JsonProperty("weather")] public Weather[] Weather { get; set; } [Newtonsoft.Json.JsonProperty("clouds")] public Clouds Clouds { get; set; } [Newtonsoft.Json.JsonProperty("wind")] public Wind Wind { get; set; } [Newtonsoft.Json.JsonProperty("visibility")] public long Visibility { get; set; } [Newtonsoft.Json.JsonProperty("pop")] public double Pop { get; set; } [Newtonsoft.Json.JsonProperty("snow", NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] public Snow Snow { get; set; } [Newtonsoft.Json.JsonProperty("sys")] public Sys Sys { get; set; } [Newtonsoft.Json.JsonProperty("dt_txt")] public DateTimeOffset DtTxt { get; set; } } public partial class Clouds { [Newtonsoft.Json.JsonProperty("all")] public long All { get; set; } } public partial class MainClass { [Newtonsoft.Json.JsonProperty("temp")] public double Temp { get; set; } [Newtonsoft.Json.JsonProperty("feels_like")] public double FeelsLike { get; set; } [Newtonsoft.Json.JsonProperty("temp_min")] public double TempMin { get; set; } [Newtonsoft.Json.JsonProperty("temp_max")] public double TempMax { get; set; } [Newtonsoft.Json.JsonProperty("pressure")] public long Pressure { get; set; } [Newtonsoft.Json.JsonProperty("sea_level")] public long SeaLevel { get; set; } [Newtonsoft.Json.JsonProperty("grnd_level")] public long GrndLevel { get; set; } [Newtonsoft.Json.JsonProperty("humidity")] public long Humidity { get; set; } [Newtonsoft.Json.JsonProperty("temp_kf")] public double TempKf { get; set; } } public partial class Snow { [Newtonsoft.Json.JsonProperty("3h")] public double The3H { get; set; } } public partial class Sys { [Newtonsoft.Json.JsonProperty("pod")] public string Pod { get; set; } } public partial class Weather { [Newtonsoft.Json.JsonProperty("id")] public long Id { get; set; } [Newtonsoft.Json.JsonProperty("main")] public string Main { get; set; } [Newtonsoft.Json.JsonProperty("description")] public string Description { get; set; } [Newtonsoft.Json.JsonProperty("icon")] public string Icon { get; set; } } public partial class Wind { [Newtonsoft.Json.JsonProperty("speed")] public double Speed { get; set; } [Newtonsoft.Json.JsonProperty("deg")] public long Deg { get; set; } } |
ボタンがおされたら以下の処理を実行します。
GetWeather(string str)メソッドはWeatherSummary.Weather[].Mainを天気に、WindDirect(double d)メソッドはWeatherSummary.Wind.Degを方角に変換するためのメソッドです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
public partial class Form1 : Form { private async void button1_Click(object sender, EventArgs e) { string str = await GetJson(); WeatherResult result = GetDataFromJson(str); foreach (var weatherSummary in result.List) { string dateTime = weatherSummary.DtTxt.DateTime.AddHours(9).ToString("M月d日 HH時mm分"); string weather = GetWeather(weatherSummary.Weather[0].Main); string temp = weatherSummary.Main.Temp.ToString() + "℃"; string humidity = weatherSummary.Main.Humidity.ToString() + "%"; string pressure = weatherSummary.Main.Pressure.ToString() + " hPa"; string wind = String.Format("{0} {1} m/sec", WindDirect(weatherSummary.Wind.Deg), weatherSummary.Wind.Speed); AddItem(dateTime, weather, temp, humidity, pressure, wind); } } WeatherResult GetDataFromJson(string jsonText) { return Newtonsoft.Json.JsonConvert.DeserializeObject<WeatherResult>(jsonText); } public string GetWeather(string str) { if (str == "Clear") return "晴れ"; else if (str == "Clouds") return "くもり"; else if (str == "Rain") return "雨"; else if (str == "Thunderstorm") return "雷雨"; else if (str == "Snow") return "雪"; else if (str == "Mist") return "霧"; else if (str == "Drizzle") return "霧雨"; else return "?"; } public string WindDirect(double d) { if (d <= 11) return " 北 "; else if (d <= 33) return "北北東"; else if (d <= 56) return " 北東 "; else if (d <= 78) return "東北東"; else if (d <= 101) return " 東 "; else if (d <= 123) return "東南東"; else if (d <= 146) return " 南東 "; else if (d <= 167) return "南南東"; else if (d <= 191) return " 南 "; else if (d <= 213) return "南南西"; else if (d <= 236) return " 南西 "; else if (d <= 258) return "西南西"; else if (d <= 281) return " 西 "; else if (d <= 303) return "西北西"; else if (d <= 326) return " 北西 "; else if (d <= 348) return "北北西"; else return " 北 "; } } |