Ryan's Factory mail
  • オアフ島 明日の天気

  • ニューヨーク 明日の天気

  • ロンドン 明日の天気

  • バチカン 明日の天気

  • モスクワ 明日の天気

  • ナイロビ 明日の天気

  • 香港 明日の天気

  • 東京 明日の天気

  • シドニー 明日の天気

天気予報 API

OpenWeatherMap が提供するAPIの返却値(JSONデータ)を日本語化するAPIサービスです。

システム構成

System
このシステムは Google Cloud Platform のサービスを基本構成として稼働します。
  • WebサーバGoogle App Engine
  • データベースGoogle Cloud SQL
  • 地図情報Google Maps
  • 天気予報OpenWeatherMap

このシステムはJava言語で開発しました。今後、Androidで利用される方のためにSDKを提供する予定です。 また、ホームページやブログなどでご利用する方のために、JavaScriptのライブラリを提供する予定です。

By city name 都市名で取得

都市名を指定して天気予報を取得することができます。ただし、OpenWeatherMap APIにはいくつかの制約があります。それは都市名をローマ字にすることです。 ローマ字だといくつかの問題が起こります。日本では「つ」をローマ字にすると「tu」とほとんどの人が入力しますが、英米では「tsu」となります。 また、日本人でも違いが出てくる文字もあります。「し」を「si」や「shi」とするなどです。 そのような問題を防ぐために、入力規格表なるもの設けて利用者に押し付けるのはいささかならず困惑するでしょう。

そこで、日本語 Weather APIではなじみの日本語を入力することにしました。

OpenWeatherMap APIと日本語 Weather APIをそれぞれ実行し、その結果を比較することができます。 各フォームにパラメータを入力し、実行ボタンを押下すると実行結果に、取得したJSONデータを表示します。 日本語 Weather APIの場合は、取得データとそのデータを見やすくしたレイアウトで表示します。

OpenWeatherMap API

OpenWeatherMap APIは、以下のリクエスト形式でJSONデータを取得します。

URL
http://api.openweathermap.org/data/2.5/forecast/daily ?q={city name},{country code}&APPID={APIKEY}
city name
都市名をローマ字表記 東京の場合は tokyo
country code
国名コード 日本は JP
APPID
アカウントを作成後に得られるKEY

APIを実行

都市名
国名コード
APPID

結果

						

日本語 Weather API

URL
http://api.ryans.jp/openweathermap/forecast/daily ?city={city name}/country={country code}&APPID={APIKEY}
city name
東京の場合は そのまま東京と入力できます
country code
国名コード 日本は JP(半角)
APPID
アカウントを作成後に得られるKEY

登録された都市名に対応しています。 都市名の登録は、都市名の日本語化 で登録してください。

APIを実行

都市名の入力をおこなえば実際に天気予報を取得できます。

都市名もしくは都道府県を入力してください。国名コードは省略できます。 その場合は[JP]日本になります。また、APPIDも省略できますが、利用できる制限値があります。

都市名
国名コード
APPID

結果

						

  


天気: 

温度: 

最高: 

最低: 

湿度: 

風速: m/s ()

天気予報用語の日本語化

日本語化するタグ要素は、list.weather.mainlist.weather.descriptionとします。

OpenWeatherMapから天気予報を取得して、list.weather.mainをWeather main (Group of weather parameters)に対応した日本語に置換します。 天気予報の詳細はlist.weather.descriptionをグループごとに対応した日本語に置換します。

置換の内容は、 Weather icons Weather condition codes を参考に一覧表を作成しましたので、以下の一覧表を参照してください。

天気アイコン

天気アイコンはlist.weather.iconの値を取り出し、URLを編集して取得します。

URL :http://openweathermap.org/img/w/list.weather.icon.png

アイコンリスト
昼間 夜間 Description 日本語 説明
01d.png 01n.png clear sky 晴れ
02d.png 02n.png few clouds 薄曇り
03d.png 03n.png scattered clouds 曇り
04d.png 04n.png broken clouds 曇り
09d.png 09n.png shower rain 小雨
10d.png 10n.png rain
11d.png 11n.png thunderstorm 雷雨
13d.png 13n.png snow
50d.png 50n.png mist

主題となる予報と説明

list.weather.main は、予報の主題(タイトル)を示し、 list.weather.descriptionは、主題の説明(詳細)となります。

Weather main (Group of weather parameters)
ID main 日本語
2xx Thunderstorm 雷雨
3xx Drizzle 霧雨
5xx Rain
6xx Snow
7xx Atmosphere 大気汚染
800 Clear 晴れ
8xx Clouds 曇り
90x Extreme 警戒
9xx Additional
Group 2xx: 雷雨
ID Meaning 意味 Icon
200 thunderstorm with light rain 小雨で雷を伴う 11d
201 thunderstorm with rain 雷雨 11d
202 thunderstorm with heavy rain 強い雨で雷を伴う 11d
210 light thunderstorm 11d
211 thunderstorm 雷雨 11d
212 heavy thunderstorm 強い雷雨 11d
221 ragged thunderstorm 局地的雷雨 11d
230 thunderstorm with light drizzle 薄い霧で雷を伴う 11d
231 thunderstorm with drizzle 霧雨で雷を伴う 11d
232 thunderstorm with heavy drizzle 濃い霧雨で雷を伴う 11d
Group 3xx: 霧雨
ID Meaning 意味 Icon
300 light intensity drizzle もや 09d
301 drizzle 09d
302 heavy intensity drizzle 濃霧 09d
310 light intensity drizzle rain 霧雨 09d
311 drizzle rain 小雨 09d
312 heavy intensity drizzle rain 濃霧の伴う雨 09d
313 shower rain and drizzle 霧所によりにわか雨 09d
314 heavy shower rain and drizzle 霧所により強いにわか雨 09d
321 shower drizzle にわか霧 09d
Group 5xx: 雨
ID Meaning 意味 Icon
500 light rain 小雨 10d
501 moderate rain 10d
502 heavy intensity rain やや強い雨 10d
503 very heavy rain 強い雨 10d
504 extreme rain 激しい雨 10d
511 freezing rain 冷たい雨 13d
520 light intensity shower rain 小雨 09d
521 shower rain にわか雨 09d
522 heavy intensity shower rain 強いにわか雨 09d
531 ragged shower rain 局地的にわか雨 09d
Group 6xx: 雪
ID Meaning 意味 Icon
600 light snow 小雪 13d
601 snow 13d
602 heavy snow 大雪 13d
611 sleet みぞれ 13d
612 shower sleet にわかみぞれ 13d
615 light rain and snow 小雨所により雪 13d
616 rain and snow 雨所により雪 13d
620 light shower snow にわか小雪 13d
621 shower snow にわか雪 13d
622 heavy shower snow 強いにわか雪 13d
Group 7xx: 大気汚染
ID Meaning 意味 Icon
701 mist 50d
711 smoke スモッグ 50d
721 haze 煙霧 50d
731 sand, dust whirls 黄砂 50d
741 fog 濃霧 50d
751 sand 黄砂 50d
761 dust 50d
762 volcanic ash 火山灰 50d
771 squalls スコール 50d
781 tornado 竜巻 50d
Group 800: 晴れ
ID Meaning 意味 Icon
800 clear sky 晴れ  or 
Group 8xx: 雲り
ID Meaning 意味 Icon
801 few clouds 晴れ所により曇り or
802 scattered clouds 曇り所により晴れ 03d
803 broken clouds 曇り時々晴れ or
804 overcast clouds 曇り 04d
Group 90x: 警戒
ID Meaning 意味
900 tornado 竜巻
901 tropical storm 台風
902 hurricane ハリケーン
903 cold 寒気
904 hot 暖気
905 windy 強風
906 hail ひょう
Group 9xx: 風
ID Meaning 意味
951 calm 無風
952 light breeze 微風
953 gentle breeze そよ風
954 moderate breeze 弱い風
955 fresh breeze やや強い風
956 strong breeze 強い風
957 high wind, near gale 非常に強い風
958 gale 強風注意報
959 severe gale 海上風警報
960 storm 強風警報
961 violent storm 暴風警報
962 hurricane 特別暴風警報

風向きの日本語対応

風向きはlist.degにあり、360度で表していて、北は0度、東は90度、南は180度、西は270度となっています。

気象庁では、観測は16または36方位を用いているが、予報では8方位を用いています。

風向きの index 値を求める計算式
index = (deg + (45 / 2)) / 45
indexを整数で丸める
index > 7 ならば index = 0
Wind direction 風向
index deg(角度) 風向
0 337.5 - 22.4
1 22.5 - 67.4 北東
2 67.5 - 112.4
3 112.5 - 157.4 南東
4 157.5 - 202.4
5 202.5 - 247.4 南西
6 247.5 - 292.4 西
7 292.5 - 337.4 北西

都市名の日本語化

都市名、地名などは抽象的で、変遷していくものなので、アプリケーションで管理するのは大変難しいものです。

しかし、定義し管理できれば処理は簡単です。 都市名をテーブルファイルもしくはデータベースで管理して、要求された都市名を検索し得られたローマ字表記の都市名でOpenWeatherMapのAPIを呼び出します。 そして、JSONデータのcity.nameを日本語の都市名に置換し結果を返却します。

テーブルファイルもしくはデータベースのメンテナンスは、随時行わなければいけない。そうしないと、置換の精度が向上されない。それでは誰が管理し編集するのかという課題が発生します。

現在(2016/08/19)、一番良い方法はOpenWeatherMapに日本語化を対応してもらうのがベストな選択ですが、それを要求していつなされるのか不明です。 それまで待つと選択した場合、サービスを開始できない。それでは困るので、いくつかの方法を上げてみました。

  1. テーブルファイルもしくはデータベースをサービス提供者が管理する
  2. テーブルファイルもしくはデータベースをサービス利用者が登録、編集する
  3. OpenWeatherMapが提供する都市名ファイルを編集しローマ字表記の置換ファイルを作成する
  4. Google Maps Geocoding API を利用して地名から地理的位置を取得して、OpenWeatherMap APIの地理的位置で取得する
  5. ゼンリン いつもNAVI API / SDKを利用して地名から地理的位置を取得して、OpenWeatherMap APIの地理的位置で取得する
  6. サービスを有料化して、日本気象協会が提供するAPIを利用する

考察

メリット、デメリットを考え、結果を求めます。

  • 1は、提供するアプリケーションと共にメンテナンス対象タスクとする
  • 2は、提供するアプリケーションにその機能を設け、ユーザにメンテナンスしてもらう
  • 3は、すべての都市情報をメンテナンスするには、人手と時間がかかりすぎる
  • 3は、随時更新していかなければ、置換の精度が向上されない
  • 4,5は、サービス提供者に依存することになり、仕様が変更されたりサービス終了などと目的とは違うメンテナンスが発生する
  • 4は、検索精度やランドマーク名などの情報など優れている
  • 5は、無料で使用できる枠が小さすぎる
  • 6は、無料で提供するという目的が離れてしまう
  • 6は、精度の高い予報を提供するという目的で有料のサービスを別に立ち上げる

結果

変わらないであろうと思われる地名、都市名はサービス提供者が行います。 例えば、「ロンドン」「パリ」「東京都」「東京」「横浜市」「横浜」などは初期データとしてメンテナンスを行い、 その他の地名、都市名は、サービス利用者が登録を行い、 削除については、サービス利用者からの依頼を受けてサービス提供者が削除するとします。 地名、都市名、ランドマークの編集はサービス提供者が行います。

サービス提供には、いくつかのAPIやアプリケーションが必要となります。以下に必要となる機能を列挙します。

  • 都市名が登録されているか判定する
  • 既に登録されている都市名だと推測される都市名を列挙する
  • 地理的位置から都市名を登録する
  • サービス利用者からの都市名の削除依頼
  • サービス提供者が行うダイレクトメンテナンス

都市名の登録

検索

都市名
国名コード

検索結果

					
日本語 Weatherに登録されている都市名
都市名
国名コード
緯度
経度

Google Mapから地理的位置を取得

地図

登録・削除依頼

都市名
国名コード
緯度
経度

結果

					

都市名のテーブル

都市名テーブル
都市名 国名コード 緯度 経度 Open Weater Map
id city name
文字列 文字列 数値 数値 数値 文字列
String 最大64文字 ISO 3166-1 alpha-2 Float (latitude) Float (longitude) Long String

登録に関する要件

都市名の登録に関する要件や制約などを列挙します。

  • 都市名が重複した場合、5キロ圏内であれば同一とし登録できない
  • 都市名が重複した場合、IDがすでに採番されているならば登録できない
  • 政令指定都市の「区」は都市名には含まない

削除に関する要件

都市名の削除に関する要件や制約などを列挙します。

  • 即時に削除することはできない
  • システム管理者の承認を得て都市名を削除する
  • 削除依頼はメールを使用する
  • 削除は承認されたメールで都市名を削除する
  • 承認・削除の簡素化を行いシステム管理者の負担を軽減する
  • 承認キーを生成してセキュリティを強化する
  • 承認キーは、SHA-256をBase64でエンコードする
  • 削除依頼は制限値を設ける
  • 同じドメインからの削除依頼に制限値を設ける

パラメータ

都市名の検索

  • status正常ならばsuccessエラーならばerror
  • message正常ならばOk エラーならばその原因
  • errors[]エラーが発生した場合のみ有効
    • codeエラーコード
    • messageエラーの内容
  • results[]正常に取得できた場合のみ有効
    • place_id都市名のID
    • place_name都市名
    • country_code国名コード
    • location地理的位置
      • lat緯度
      • lng経度
    • openweathermap
      • city_idOpenWeatherMapの都市名のID
      • city_nameOpenWeatherMapの都市名