madokaのブログ

勉強したことのoutput先として使ってます。内容はpythonがらみが多いかもです。

YOLPを使って1時間以内の雨予報を取得する

休日なので外に洗濯物干してひきこもってたのですが、知らないうちにあめがふってたぽい?なことがありました。 そこで1日の天気予報とかではなく、もっと1時間とかの近い時間帯について雨の情報をおしらせしてくれるものがほしいなと思いました。 まずは、お手軽に小さい単位での気象情報を取得できるAPIがないか調べてみました。すると、Yahoo! Open Local Platform (YOLP)に気象情報APIというAPIを発見!2時間前から1時間後までの降水量を10分間隔で取得できるらしいことがわかったので、こちらを利用させてもらうことにしました。 developer.yahoo.co.jp

YOLPとは

地図・地域情報などのAPISDKです。地図を扱ったサービスがメインなようですが、今回利用した気象情報やその他にも郵便番号検索や経路探索などもできたりと幅は広そうです。

YOLPを利用するために

まずはapplication id を取得します。下記のサイトから手順を追えば、取得できます。

developer.yahoo.co.jp

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に投げるものをつくってみました。

github.com

まとめ

記事書いててはっとしたんですが、もしかすると、降水量は実測値しか入ってないかもなので予報のところはすべて0.0で入って返ってきてるかもです。5分以内の情報ならギリ使える。。頻度多めにapiを叩かないとですね。