OpenWeatherMap APIを使った天気予報アプリ〜とりあえずAndroid編〜

どうも、あなたの街の東野です。

「無料で使えるAPIって何があるんだろう?」
という1つの好奇心から、
今回は天気予報APIを使った、簡単なアプリを作ってみたいと思います。

まず天気や天気予報のAPIというのは各社いろんなものを出していますが、
・有料である
・無料で使っていいけど商用利用はダメ
と、なかなか自由に使わせてもらえるものがありません。

そんな中、無償で提供されているAPIがありました。
それがOpenWeatherMap APIです。
URLパラメータを渡すだけで、
最大14日間の天気情報が入ったJSON文字列が取得出来ます。

これは今お持ちのブラウザで、すぐに確認する事が出来ます。
さっそくやってみましょう。
ブラウザで直接以下のように入力してみて下さい。
http://api.openweathermap.org/data/2.5/forecast/daily?lat=43.067885&lon=141.355539&mode=json&cnt=14

latは緯度、lonには経度を入力します。
modeはJSONを指定します。XMLでも出来たはず。
cntはここでは最大7日間という意味を持ちます、7日分取得出来ない事もあります。
入力した結果、札幌周辺の天気情報が入ったJSON文字列が取得出来たはずです。
openWeatherAndroid1.png title=

それでは主要なパラメータを順に見ていきましょう

city.idとcity.nameはopenWeatherMapが世界中で天気を計測している地点です。

cntは獲得出来た天気情報の数で、以降はlist以下に配列で入っています。

dtは時間をUNIXタイムで表示しています。
temp.day, temp.max, temp.minはそれぞれその日の平均気温、最高気温、最低気温です。
数値はケルビン係数で入っているので摂氏にするには273.15をマイナスする必要があります。
weather.id, weather.main, weather.descriptionはそれぞれ天気ID、天気、詳細を表示しています。
またweather.iconは天気を表示するアイコンIDで、このアイコンもOpenWeatherMap APIから取得する事が出来ます。
http://openweathermap.org/img/w/04d.png
04dが先ほどのアイコンIDです。

以上の事を踏まえたうえで、
現在地の天気予報を取得するAndroidアプリを作ってみましょう。

まずはGPS情報を取得するコードを書いていきましょう。

  
LocationManager mLocationManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    }
    @Override
    public void onResume() {
        super.onResume();
        Criteria criteria = new Criteria(); 
        criteria.setAccuracy(Criteria.ACCURACY_COARSE);
        criteria.setPowerRequirement(Criteria.POWER_LOW);
        String provider = mLocationManager.getBestProvider(criteria, true);
        mLocationManager.requestLocationUpdates(provider, 0, 0, this);

    }
     @Override

    public void onLocationChanged(Location location) {

        double latitude = location.getLatitude();

        double longitude = location.getLongitude();

    }

上記の記述でlatitude, longitudeにそれぞれ経度、緯度が取得出来ました。
今度はこれをそのまま使って天気情報を取得します。

String requestURL = "http://api.openweathermap.org/data/2.5/forecast/daily?lat=" + latitude

  + "8&lon=" + longitude

 +"&mode=json&cnt=14";

URL url = new URL(requestURL);

 InputStream is = url.openConnection().getInputStream();

 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();

これでdataに先ほどブラウザから取得してきたようなJSON文字列が取得出来ました。あとは

JSONObject jsonObject = new JSONObject(data);

でJSONオブジェクトにして、キーを指定し、各パラメータをListViewのadapterに入れれば…
openWeatherAndroid2.png title=

こんな感じのが出来るはずです。
まったく同じ要領でiOSアプリでも同じ事が出来るでしょう。

今回は
・非同期通信の方法
・GPS情報はWi-Fiポインタからも取得出来る
などの手法は割愛させてもらいましたが、これらを使いこなすとさらに精度が上がるでしょう。

またOpenWeatherMapAPIは使い方によって様々なパラメータが取得出来ます。

ただし無償で使ってもいいよ、というだけであって、精度や動作を保障されるものではありません。
商用利用を目的とする場合はあらためて
http://openweathermap.org/API
の内容を良く読んでお使い下さい。

コメントを残す

メールアドレスが公開されることはありません。