YOLPを使って1時間以内の雨予報を取得する
休日なので外に洗濯物干してひきこもってたのですが、知らないうちにあめがふってたぽい?なことがありました。 そこで1日の天気予報とかではなく、もっと1時間とかの近い時間帯について雨の情報をおしらせしてくれるものがほしいなと思いました。 まずは、お手軽に小さい単位での気象情報を取得できるAPIがないか調べてみました。すると、Yahoo! Open Local Platform (YOLP)に気象情報APIというAPIを発見!2時間前から1時間後までの降水量を10分間隔で取得できるらしいことがわかったので、こちらを利用させてもらうことにしました。 developer.yahoo.co.jp
YOLPとは
地図・地域情報などのAPIやSDKです。地図を扱ったサービスがメインなようですが、今回利用した気象情報やその他にも郵便番号検索や経路探索などもできたりと幅は広そうです。
YOLPを利用するために
まずはapplication id を取得します。下記のサイトから手順を追えば、取得できます。
https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html
1時間以内の雨情報を取得してみた
parameters
key | value | 必須 |
---|---|---|
appid | さっき取得したapplication id | * |
coordinates | 経度、緯度のリスト | * |
output | 出力方法 json or xml(デフォルト) | |
past | 1時間前の降水量を取得する デフォルトは0になってる。2時間前まで指定できる | |
interval | 10分毎 or 5分毎で指定できる |
コード
下記が取得するためのコードです。
from urllib.request import urlopen from urllib.parse import urlencode import json class WeatherClient: BASE_URL = "http://weather.olp.yahooapis.jp/v1/place" def __init__(self, app_id, coordinates): """ :param app_id: your YOLP app_id :param coordinates: tuple(longitude, latitude) :type app_id: str :type coordinates: tuple[float] """ self.app_id = app_id self.coordinates = coordinates def get(self): url = "{}?{}".format(self.BASE_URL, urlencode({ "appid": self.app_id, "coordinates": self.coordinates, "output": "json", "past": 1 })) with urlopen(url) as res: return json.loads(res.read().decode('utf-8')) if __name__ == '__main__': print(WeatherClient("xxxxxxxxxxxxxxxxxxxxxxxxxx", (139.767125, 35.681236)).get())
取得できたjson
{ "ResultInfo": { "Latency": 0.006118, "Total": 1, "Status": 200, "Description": "", "Count": 1, "Copyright": "(C) Yahoo Japan Corporation.", "Start": 1 }, "Feature": [ { "Name": "\u5730\u70b9(139.76712,35.681236)\u306e2018\u5e7412\u670822\u65e5 20\u664230\u5206\u304b\u3089120\u5206\u9593\u306e\u5929\u6c17\u60c5\u5831", "Geometry": { "Coordinates": "139.76712,35.681236", "Type": "point" }, "Id": "201812222030_139.76712_35.681236", "Property": { "WeatherList": { "Weather": [ { "Date": "201812222030", "Type": "observation", "Rainfall": 0.0 }, { "Date": "201812222040", "Type": "observation", "Rainfall": 0.0 }, { "Date": "201812222050", "Type": "observation", "Rainfall": 0.0 }, { "Date": "201812222100", "Type": "observation", "Rainfall": 0.0 }, { "Date": "201812222110", "Type": "observation", "Rainfall": 0.0 }, { "Date": "201812222120", "Type": "observation", "Rainfall": 0.0 }, { "Date": "201812222130", "Type": "observation", "Rainfall": 0.0 }, { "Date": "201812222140", "Type": "forecast", "Rainfall": 0.0 }, { "Date": "201812222150", "Type": "forecast", "Rainfall": 0.0 }, { "Date": "201812222200", "Type": "forecast", "Rainfall": 0.0 }, { "Date": "201812222210", "Type": "forecast", "Rainfall": 0.0 }, { "Date": "201812222220", "Type": "forecast", "Rainfall": 0.0 }, { "Date": "201812222230", "Type": "forecast", "Rainfall": 0.0 } ] }, "WeatherAreaCode": 4410 } } ] }
今回取得したいのは降水量のところなので、response["Feature"][0]["Property"]["WeatherList"]["Weather"]で取れそうです。
今回の制作物
雨情報が取得できたら、slackに投げるものをつくってみました。
まとめ
記事書いててはっとしたんですが、もしかすると、降水量は実測値しか入ってないかもなので予報のところはすべて0.0で入って返ってきてるかもです。5分以内の情報ならギリ使える。。頻度多めにapiを叩かないとですね。