2016년 3월 18일 금요일

[JAVA] Open 날씨 API

[JAVA] Open 날씨 API

(참고 site : http://yooic.tistory.com/43 , 감사합니다.)
날씨 정보를 획득할 수 있는 OpenAPI가 있다.
http://openweathermap.org/
프로그램에서 날씨 정보를 쉽게 얻을 수 있다.
하지만 완전 무료는 아니다.
분당 60건의 조회는 무료로 사용할 수 있는데, 그 이상의 조회를 가능하게 하려면 돈을 지불해야 한다.
금액은 아래에서 확인가능하다.
http://openweathermap.org/price
아! 비쌀수록 더 많은 API를 제공한다.

도시 이름, zip code, GPS로 지역을 선택해서 해당 지역의 날씨 정보를 획득 할 수 있는데,
나는 GPS정보를 이용했다.

예제로 서울시청(위도 37.566386, 경도 126.977948)을 이용해보겠다.
날씨정보를 가져오는 방법은 RESTapi를 call하는 것 같다.

예제코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

public class WeatherByGPSApplication {
    public static void main(String[] args) {
        try{
            //서울시청의 위도와 경도
            String lon = "126.977948";  //경도
            String lat = "37.566386";   //위도

            //OpenAPI call하는 URL
            String urlstr = "http://api.openweathermap.org/data/2.5/weather?"
                        + "lat="+lat+"&lon="+lon
                        +"&appid=본인의키를넣으세요";
            URL url = new URL(urlstr);
            BufferedReader bf;
            String line;
            String result="";

            //날씨 정보를 받아온다.
            bf = new BufferedReader(new InputStreamReader(url.openStream()));

            //버퍼에 있는 정보를 문자열로 변환.
            while((line=bf.readLine())!=null){
                result=result.concat(line);
                //System.out.println(line);
            }

            //문자열을 JSON으로 파싱
            JSONParser jsonParser = new JSONParser();
            JSONObject jsonObj = (JSONObject) jsonParser.parse(result);

            //지역 출력
            System.out.println("지역 : " + jsonObj.get("name"));

            //날씨 출력
            JSONArray weatherArray = (JSONArray) jsonObj.get("weather");
            JSONObject obj = (JSONObject) weatherArray.get(0);
            System.out.println("날씨 : "+obj.get("main"));

            //온도 출력(절대온도라서 변환 필요)
            JSONObject mainArray = (JSONObject) jsonObj.get("main");
            double ktemp = Double.parseDouble(mainArray.get("temp").toString());
            double temp = ktemp-273.15;
            System.out.printf("온도 : %.2f\n",temp);

            bf.close();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}

실행결과
지역 : Seoul
날씨 : Clear
온도 : 17.57

댓글 5개:

  1. JSONArray, JSONObject, JSONParser
    import를 받아오지못하는데 따로 작성해야할 부분이 있나요?

    답글삭제
    답글
    1. 이 포스트에서 사용한 Json 라이브러리는 simple json 이라는 것입니다. 그래서 라이브러리를 프로젝트에 추가시켜 주셔야 import하실 수 있으세요.
      관련 글은 http://walkinpcm.blogspot.kr/2016/03/java-json-json-parsing.html 에 있습니다.

      근데 저는 요즘 Java에서 Json을 쓸때 구글에서 제공하는 라이브러리인 Gson을 사용하고 있어요 이름만 Gson이고 json을 다루는 라이브러리인데 이에 대한 설명은 http://walkinpcm.blogspot.kr/2016/03/java-java-json-gson.html 여기에 있습니다.

      또 궁금한 점이 있으시면 댓글 달아주세요. 함께 성장하는 좋은 기회 인것 같네요 ㅎㅎ

      삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제
    답글
    1. 안녕하세요. 제 글을 읽어주셔서 감사합니다. 도움이 되는 정보를 드리고 싶네요.

      http://openweathermap.org/current
      위 링크로 가시면 글에서 소개하는 날씨 API의 문서가 나타납니다. 현재날씨 정보를 가져오는 API에 대한 문서인데, API의 응답에 잘 보시면 temp.min과 temp.max가 있습니다. 해당 값들이 각각 최저온도와 최고온도를 나타내는것 같습니다. 다만 화씨로 되어있기 때문에 한국인이 보기 편하게 하시려면 섭씨로 변환하셔야 할 것 같습니다.

      감사합니다.

      삭제