Azure Maps Weather Services で天気情報を取得する

2021.07.11

いわさです。

Azure Maps には Weather Serviceという機能があり、天気情報を取得することが可能です。
今年4月にGAされていましたが、触ってみたい触ってみたいと思いつつ忘れ去っていました。
とうとう試してみることが出来たので、記事にしました。

「こんな簡単に使えるんだなぁ。使ってみようかなぁ。」と感じて頂けると幸いです。

Azure Maps Weather Service とは

現在の天気情報と、予報データを取得することが出来るAPIです。

特徴としては、データについては機械学習などでAzureがデータを計算しているわけではなく、気象サービスプロバイダーのAccuWeatherのデータを使用しているところという点と、日本も対応しているという点でしょうか。

対応国については全ての国で使えるわけではありませんので、以下から予め対応状況を確認しておいたほうが良いです。

データに関してはかなり新しいデータになっていて、現在の状態データは少なくとも1時間に1回更新されるとされています。ただし、気温や降水量などが急激に変化した場合はもっと高頻度で更新されるそうです。
予測データに関してはもっと低頻度の更新(1日に複数回)です。

ただし、Azure Maps API は最大10分間(予報データの場合30分間)のデータキャッシュを行います。
よって最新のデータがAzure上で取得済みにも関わらずAPIの結果が古いデータのままの場合があります。

価格

Tierは現在3種類用意されています。以下にまとめました。

  • Gen1
    • S0 : 開発、小規模サービス用。無料枠あり。1000トランザクション56円。機能制限あり
    • S1 : 大規模用。無料枠なし。1000トランザクション560円
  • Gen2 : 利用料に応じたディスカウントあり。無料枠あり。1000トランザクション504~560円

検証であればGen1-S0で十分です。
今回はGen1-S0で試しました。

やってみた

まずは Azure Maps アカウントの作成が必要です。
Azureを利用中の場合でも、個別にMapアカウントの作成を行う必要があります。

Azireポータル上で Azure Maps で検索します。

価格はS0で作成しました。
これだけでもう、すぐに使い始めることが出来ます。

認証メニューから、共有キーを取得してください。

最新情報を取得するAPIをコールしてみます。
以下のAPIを使います。

今回はみんな大好きPostmanで、HTTP GETしました。
先程の共有キーと取得場所の緯度経度をGETパラメータで渡すだけです。

取得結果の言語指定など様々なパラメータオプションも用意されています。

以下が取得結果です。
気温と天気だけでなく、降水量・気圧・体感温度、UV指数、風向・風速など取得可能です。

{
    "results": [
        {
            "dateTime": "2021-07-10T23:41:00+09:00",
            "phrase": "おおむね曇り",
            "iconCode": 38,
            "hasPrecipitation": false,
            "isDayTime": false,
            "temperature": {
                "value": 18.5,
                "unit": "C",
                "unitType": 17
            },
            "realFeelTemperature": {
                "value": 16.7,
                "unit": "C",
                "unitType": 17
            },
            "realFeelTemperatureShade": {
                "value": 16.7,
                "unit": "C",
                "unitType": 17
            },
            "relativeHumidity": 80,
            "dewPoint": {
                "value": 15.0,
                "unit": "C",
                "unitType": 17
            },
            "wind": {
                "direction": {
                    "degrees": 135.0,
                    "localizedDescription": "南東"
                },
                "speed": {
                    "value": 16.7,
                    "unit": "km/h",
                    "unitType": 7
                }
            },
            "windGust": {
                "speed": {
                    "value": 21.6,
                    "unit": "km/h",
                    "unitType": 7
                }
            },
            "uvIndex": 0,
            "uvIndexPhrase": "低い",
            "visibility": {
                "value": 17.7,
                "unit": "km",
                "unitType": 6
            },
            "obstructionsToVisibility": "",
            "cloudCover": 76,
            "ceiling": {
                "value": 12192.0,
                "unit": "m",
                "unitType": 5
            },
            "pressure": {
                "value": 1012.0,
                "unit": "mb",
                "unitType": 14
            },
            "pressureTendency": {
                "localizedDescription": "上昇",
                "code": "R"
            },
            "past24HourTemperatureDeparture": {
                "value": -0.4,
                "unit": "C",
                "unitType": 17
            },
            "apparentTemperature": {
                "value": 20.0,
                "unit": "C",
                "unitType": 17
            },
            "windChillTemperature": {
                "value": 18.3,
                "unit": "C",
                "unitType": 17
            },
            "wetBulbTemperature": {
                "value": 16.4,
                "unit": "C",
                "unitType": 17
            },
            "precipitationSummary": {
                "pastHour": {
                    "value": 0.0,
                    "unit": "mm",
                    "unitType": 3
                },
                "past3Hours": {
                    "value": 0.0,
                    "unit": "mm",
                    "unitType": 3
                },
                "past6Hours": {
                    "value": 0.0,
                    "unit": "mm",
                    "unitType": 3
                },
                "past9Hours": {
                    "value": 0.0,
                    "unit": "mm",
                    "unitType": 3
                },
                "past12Hours": {
                    "value": 0.0,
                    "unit": "mm",
                    "unitType": 3
                },
                "past18Hours": {
                    "value": 0.0,
                    "unit": "mm",
                    "unitType": 3
                },
                "past24Hours": {
                    "value": 0.0,
                    "unit": "mm",
                    "unitType": 3
                }
            },
            "temperatureSummary": {
                "past6Hours": {
                    "minimum": {
                        "value": 18.5,
                        "unit": "C",
                        "unitType": 17
                    },
                    "maximum": {
                        "value": 21.0,
                        "unit": "C",
                        "unitType": 17
                    }
                },
                "past12Hours": {
                    "minimum": {
                        "value": 18.5,
                        "unit": "C",
                        "unitType": 17
                    },
                    "maximum": {
                        "value": 22.4,
                        "unit": "C",
                        "unitType": 17
                    }
                },
                "past24Hours": {
                    "minimum": {
                        "value": 15.7,
                        "unit": "C",
                        "unitType": 17
                    },
                    "maximum": {
                        "value": 22.4,
                        "unit": "C",
                        "unitType": 17
                    }
                }
            }
        }
    ]
}

まとめ

数年前に屋外向けのIoTデバイスを開発したことがありました。
気温や湿度、日照や紫外線、風向・風力など様々な情報をセンサーで取得するというものです。

開発し、センサーを設置して試験をしていましたが、センサーが正常に動作しているか異常かどうか、答えのデータが必要になるのですが、そのためにまた別の計測器を購入していました。
また、地理的に離れている複数の場所に設置している場合は、それぞれの場所へ行き計測を行う必要がありました。

今回使用したようなAPIを使うことで、デバイスの計測データとクラウドから取得される参考データを比較することで、異常なセンサーを発見する手がかりになりそうです。 こんな簡単に使えて、価格も安いということで積極的に使っていきたいですね。

参考