天気予報 API
OpenWeatherMap が提供するAPIの返却値(JSONデータ)を日本語化するAPIサービスです。
システム構成
- 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.main
とlist.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
主題となる予報と説明
list.weather.main
は、予報の主題(タイトル)を示し、
list.weather.description
は、主題の説明(詳細)となります。
ID | main | 日本語 |
---|---|---|
2xx | Thunderstorm | 雷雨 |
3xx | Drizzle | 霧雨 |
5xx | Rain | 雨 |
6xx | Snow | 雪 |
7xx | Atmosphere | 大気汚染 |
800 | Clear | 晴れ |
8xx | Clouds | 曇り |
90x | Extreme | 警戒 |
9xx | Additional | 風 |
ID | Meaning | 意味 | Icon |
---|---|---|---|
701 | mist | 霧 | |
711 | smoke | スモッグ | |
721 | haze | 煙霧 | |
731 | sand, dust whirls | 黄砂 | |
741 | fog | 濃霧 | |
751 | sand | 黄砂 | |
761 | dust | 塵 | |
762 | volcanic ash | 火山灰 | |
771 | squalls | スコール | |
781 | tornado | 竜巻 |
ID | Meaning | 意味 | Icon |
---|---|---|---|
800 | clear sky | 晴れ | or |
ID | Meaning | 意味 | Icon |
---|---|---|---|
801 | few clouds | 晴れ所により曇り | or |
802 | scattered clouds | 曇り所により晴れ | |
803 | broken clouds | 曇り時々晴れ | or |
804 | overcast clouds | 曇り |
ID | Meaning | 意味 |
---|---|---|
900 | tornado | 竜巻 |
901 | tropical storm | 台風 |
902 | hurricane | ハリケーン |
903 | cold | 寒気 |
904 | hot | 暖気 |
905 | windy | 強風 |
906 | hail | ひょう |
風向きの日本語対応
風向きはlist.deg
にあり、360度で表していて、北は0度、東は90度、南は180度、西は270度となっています。
気象庁では、観測は16または36方位を用いているが、予報では8方位を用いています。
- 風向きの index 値を求める計算式
- index = (deg + (45 / 2)) / 45
- indexを整数で丸める
- index > 7 ならば index = 0
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に日本語化を対応してもらうのがベストな選択ですが、それを要求していつなされるのか不明です。 それまで待つと選択した場合、サービスを開始できない。それでは困るので、いくつかの方法を上げてみました。
- テーブルファイルもしくはデータベースをサービス提供者が管理する
- テーブルファイルもしくはデータベースをサービス利用者が登録、編集する
- OpenWeatherMapが提供する都市名ファイルを編集しローマ字表記の置換ファイルを作成する
- Google Maps Geocoding API を利用して地名から地理的位置を取得して、OpenWeatherMap APIの地理的位置で取得する
- ゼンリン いつもNAVI API / SDKを利用して地名から地理的位置を取得して、OpenWeatherMap APIの地理的位置で取得する
- サービスを有料化して、日本気象協会が提供するAPIを利用する
考察
メリット、デメリットを考え、結果を求めます。
- 1は、提供するアプリケーションと共にメンテナンス対象タスクとする
- 2は、提供するアプリケーションにその機能を設け、ユーザにメンテナンスしてもらう
- 3は、すべての都市情報をメンテナンスするには、人手と時間がかかりすぎる
- 3は、随時更新していかなければ、置換の精度が向上されない
- 4,5は、サービス提供者に依存することになり、仕様が変更されたりサービス終了などと目的とは違うメンテナンスが発生する
- 4は、検索精度やランドマーク名などの情報など優れている
- 5は、無料で使用できる枠が小さすぎる
- 6は、無料で提供するという目的が離れてしまう
- 6は、精度の高い予報を提供するという目的で有料のサービスを別に立ち上げる
結果
変わらないであろうと思われる地名、都市名はサービス提供者が行います。 例えば、「ロンドン」「パリ」「東京都」「東京」「横浜市」「横浜」などは初期データとしてメンテナンスを行い、 その他の地名、都市名は、サービス利用者が登録を行い、 削除については、サービス利用者からの依頼を受けてサービス提供者が削除するとします。 地名、都市名、ランドマークの編集はサービス提供者が行います。
サービス提供には、いくつかのAPIやアプリケーションが必要となります。以下に必要となる機能を列挙します。
- 都市名が登録されているか判定する
- 既に登録されている都市名だと推測される都市名を列挙する
- 地理的位置から都市名を登録する
- サービス利用者からの都市名の削除依頼
- サービス提供者が行うダイレクトメンテナンス
都市名の登録
検索
都市名 | |
国名コード | |
検索結果
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
都市名のIDplace_name
都市名country_code
国名コードlocation
地理的位置lat
緯度lng
経度
openweathermap
city_id
OpenWeatherMapの都市名のIDcity_name
OpenWeatherMapの都市名