Edited at

OpenWeatherMap JSON API v2.5(Androidからの利用方法メモ)

More than 3 years have passed since last update.

OpenWeatherMAP JSON API v2.5のAndroidからの利用方法メモ。

※ 2013/7/2 : API v2.5の情報に更新

※ 2014/7/7 : APIキーについて追記

※ 2016/3/6 : 情報を更新, LibraryProjectを追記

本家:http://openweathermap.org/API

2016/3/6時点の最新はv2.5

OpenWeatherMapは世界中の天気情報(現在の天気、1週間分の天気予報等)を取得できるWebサービスです。

2012/8/末にGoogleの非公開APIだったGoogle Weather APIの稼働が停止したため、代わりのAPIを探していましたが、こちらのAPIが一番使い勝手がよさそうでした。


特徴


APIキーを取得すれば無料で使用できる

※APIキーの取得が必須になったようです(2014/7/7)。

APIキーを取得することで無料で使用できますが、以下の注意があります。

*1つのデバイスからのリクエストは10分に1回に抑える

*リクエスに失敗したら10分間は再リクエストを控える(なるべく直前の情報を保持しておく)

http://openweathermap.org/appid#get

有料版との違いは以下を参照してください。

フリー版では1分間に60リクエストまでと制限があります。

http://openweathermap.org/price

また、日別の天気予報(最大16日分)もFreeでは制限されています。

(2016/3/6現在、FreeのAPIキーでも取得できていますが...)


APIキー(APPID)の取得

以下から、ユーザー名、パスワード、メールアドレスを入力後、「Create Account」ボタンを押下します。

ログイン先のページにキーが表示れます。

入力したアドレスへの登録確認等はありませんでした。

http://home.openweathermap.org/users/sign_up


経度・緯度で検索できる

Google Weather API同様に経度・緯度をパラメータとして天気情報を取得することができます。

その他、地名・地名ID・観測ステーションIDをもとに取得が可能です。


最大16日分の天気予報が取得できる

Google Weather APIでは4日分の予報でしたが16日分も取得できます。

しかも、5日分の予報であれば、3時間ごとの情報です。

(Freeプランでは5日分・3時間ごとの予報のみが有効となっていますが、

2016/3/6現在は日別の予報も取得できています)


使い方


経度・緯度での取得

以下で札幌市役所付近の天気情報(現在の天気)を取得できます。

http://api.openweathermap.org/data/2.5/find?lat=43.067885&lon=141.355539&cnt=1

lat = 緯度

lng = 経度

cnt = 取得する情報数

cntを増やすことで指定した地点に近い順にcntに指定した分の地点情報が取得できます。


Androidからの取得

取得方法

    String requestURL = "http://api.openweathermap.org/data/2.5/find?lat=43.067885&lon=141.355539&cnt=1";

URL url = new URL(requestURL);
InputStream is = url.openConnection().getInputStream();

// JSON形式で結果が返るためパースのためにStringに変換する
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuilder sb = new StringBuilder();
String line;
while (null != (line = reader.readLine())) {
sb.append(line);
}
String data = sb.toString();

取得結果(JSON形式)

{"message":"Model=GFS-OWM, ","cod":"200","calctime":" mysql = 0.0041 mongo = 0.0006 center = 0.0232 total=0.0279","cnt":1,"list":[

{"id":2128295,
"name":"Sapporo-shi",
"coord":{"lon":141.346939,"lat":43.064171},
"distance":0.812,
"main":{"temp":270.67,"humidity":19,"pressure":1016,"temp_min":269.82,"temp_max":271.48},
"dt":1356758295,
"wind":{"speed":0.51,"gust":1.03,"deg":61},
"rain":{"1h":0,"24h":0,"today":0},
"clouds":{"all":57},
"weather":[
{"id":803,
"main":"Clouds",
"description":"broken clouds",
"icon":"04d"}
]}
]}

パラメータ
説明

id
地点ID

name
地点名

main.temp
現在の気温(単位:K(ケルビン))

main.humnidity
湿度(単位:%)

main.pressure
気圧(単位:hPa)

main.temp_min
最低気温(単位:K(ケルビン))

main.temp_max
最高気温(単位:K(ケルビン))

dt
取得時の時間(UNIX時間)

rain.today
降水量(単位:mm)

snow.today
降雪量(単位:mm)

clouds.all
雲量(単位:%)

weather.id
天気ID

weather.main
天気

weather.description
詳細な天気

weather.icon
天気アイコンID


結果のパース

結果はJSON形式で返るため、JSONObjectクラスを利用してパースします。

    try {

JSONObject rootObj = new JSONObject(data);
JSONArray listArray = rootObj.getJSONArray("list");

JSONObject obj = listArray.getJSONObject(0);

// 地点ID
int id = obj.getInt("id");

// 地点名
String cityName = obj.getString("name");

// 気温(Kから℃に変換)
JSONObject mainObj = obj.getJSONObject("main");
float currentTemp = (float) (mainObj.getDouble("temp") - 273.15f);

float minTemp = (float) (mainObj.getDouble("temp_min") - 273.15f);

float maxTemp = (float) (mainObj.getDouble("temp_max") - 273.15f);

// 湿度
if (mainObj.has("humidity")) {
int humidity = mainObj.getInt("humidity");
}

// 取得時間
long time = obj.getLong("dt");

// 天気
JSONArray weatherArray = obj.getJSONArray("weather");
JSONObject weatherObj = weatherArray.getJSONObject(0);
String iconId = weatherObj.getString("icon");
} catch (JSONException e) {
e.printStackTrace();
}


天気アイコンの取得

天気アイコンも提供されているため、取得結果の天気アイコンIDのを使用して取得することができます。

以下のURLで取得できます。

http://openweathermap.org/img/w/04d.png

※04dは、取得したJSONのiconキーで取得した文字列に置き換えてください

Bitmapオブジェクトは以下で取得できます。

    try {

String requestUrl = "http://openweathermap.org/img/w/04d.png";
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.connect();
BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
icon = BitmapFactory.decodeStream(in);
in.close();
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}


APIキー(APPID)の使用

取得したAPIキーは、以下のように使用します。

http://api.openweathermap.org/data/2.5/find?lat=43.067885&lon=141.355539&cnt=1&APPID=1111111111

※1111111111を取得したキーに置き換えます


ライブラリープロジェクト

OpenWeatherMapのAPIのラッパーを以下で公開しています。

https://github.com/kubotaku1119/OpenWeatherMapLib

AndroidStudioに依存関係を記載することで利用できますので、動作確認等にご利用下さい。

※ APIキーはご自分で取得してください。

repositories {

maven { url 'http://raw.github.com/kubotaku1119/OpenWeatherMapLib/master/repository/' }
}

dependencies {
compile 'com.kubotaku:openweathermap-lib:0.1.3'
}