주니어개발자_ฅʕ•̫͡•ʔฅ

기상청 날씨 api (feat.공공데이터포털) 본문

AndroidStudio

기상청 날씨 api (feat.공공데이터포털)

뚜비뚜밥_98 2021. 5. 31. 15:27

날씨를 불러오는 기능을 android 프로젝트에 넣으려고 찾아보았다.

 

먼저 참고한 블로그는 이곳이다.

 

Java 기상청 날씨 API 사용하기(동네예보조회)

기존 (신)동네예보정보조회서비스와 중기예보정보조회서비스는 2020년 4월 28일 폐기. 기상청 API는 아래의 링크 확인 https://ming9mon.tistory.com/151 [JAVA]변경된 기상청 날씨 API (동네예보, 중기예보)

ming9mon.tistory.com

너무 감사하게도 api 발급받는 방법과 함께 올려주셨다.

api발급 받으려면 위의 사이트를 참고바란다.

 

나는 위의 블로그에서 json을 파싱하는 부분이 잘되지 않아 다르게 바꿔썼다.

만약 나와같이 파싱이 안된다면 맨 밑에 소스코드를 참고해도 괜찮을 것 같다.

 

 

※ 주 의 ※

2021년 10월 부로 동네예보 서비스는 중단되고

이름만 변경된 단기예보 서비스를 제공한다고 한다.

 

이름만 변경 되었기에 사용방법은 같다

물론 소스코드에 활용하는 방법도 같다.

공공데이터 포털에서

단기예보 조회서비스를 활용신청 하여

따라하면 된다.

 

단기예보 서비스 활용신청 사용 방법

키 발급하는 부분만 작성했기 때문에

키 발급이 어렵지 않다면 보지 않아도 된다.

 

기상청 날씨 API 변경됨, 기상청 동네예보 조회서비스 종료(공공데이터 포털)

저번에 썼던 "기상청 날씨 api (feat.공공데이터포털)" 에서 사용된 "기상청 동네예보 서비스"가 종료되었다고 합니다. 날씨 정보를 가져오려는데 이상 없던 코드에서 계속 에러가 뜨길래 서비스url

toubi-tobap.tistory.com

 

 

공공데이터 포털 사이트에서 오픈API 활용신청을 하면 밑에와 같이 키를 발급 받는다

(ServerKey라고 하던데 저는 API가 입에 붙어서 그냥 저렇게 썼습니당)

 

그리고 그 밑에

예보버전조회, 동네예보조회 등 기능들이 나타나는데

발급받은 key를 ServiceKey에 넣어 테스트 해본 후

잘 작동된다면 프로젝트에서 key값을 넣어 쓰면 된다.

 

시간은 3시간 단위로 조회해야 한다. 안그러면 정보가 없다고 뜬다.. 해봐서 아는 정보..

0200, 0500, 0800 ~ 2300까지

그리고 테스트할때 주의할건 날짜 및 시간이 지금 기준 24시간 이내여야한다

동네예보조회만 테스트 해봐서 다른 기능들도 24시간 이내여야 한지는 모르겠다..귀찮..

 

위와 같이 입력 후 미리 보기 했을때 이런 창이 뜬다면 api 활용신청이 승인되어 사용할 수 있어짐

 

프로젝트에 url주소를 기입해야하는데 미리 url주소가 어디있는지 찾아놓고

복사 붙여넣기 하면 더 수월할 것 이다.

참고문서

 

위의 참고 문서를 다운받아 word 파일에서 동네예보조회 상세기능 명세에 나온 url을 사용했다.
혹시 모르니 각자 다운 받아서 확인해봐야할 것 같다.

참고한 블로그와 내가 쓴 url주소도 다르다..

 

 

이제 api를 사용할 준비는 끝났다.

 

날짜는 직접 입력 받을 예정이라 예시로 테스트용 날짜를 넣었고

시간또한 날씨가 어떤지 요청할 시간으로 할 예정이라 시간도 예시로 넣었다.

위도와 경도는 참고문서의 엑셀파일에 주소마다 정해진

격자 값이 있다. 그것을 참고하면 될 듯 함.

import android.util.Log;

import org.json.JSONException;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class WeatherData {

    private String nx = "60";	//위도
    private String ny = "125";	//경도
    private String baseDate = "20210531";	//조회하고싶은 날짜
    private String baseTime = "0500";	//조회하고싶은 시간
    private String type = "json";	//조회하고 싶은 type(json, xml 중 고름)

    public void lookUpWeather() throws IOException, JSONException {

//		참고문서에 있는 url주소
        String apiUrl = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getVilageFcst";
//         홈페이지에서 받은 키
        String serviceKey = "인증받은키는 이곳에";

        StringBuilder urlBuilder = new StringBuilder(apiUrl);
        urlBuilder.append("?" + URLEncoder.encode("ServiceKey","UTF-8") + "="+serviceKey);
        urlBuilder.append("&" + URLEncoder.encode("nx","UTF-8") + "=" + URLEncoder.encode(nx, "UTF-8")); //경도
        urlBuilder.append("&" + URLEncoder.encode("ny","UTF-8") + "=" + URLEncoder.encode(ny, "UTF-8")); //위도
        urlBuilder.append("&" + URLEncoder.encode("base_date","UTF-8") + "=" + URLEncoder.encode(baseDate, "UTF-8")); /* 조회하고싶은 날짜*/
        urlBuilder.append("&" + URLEncoder.encode("base_time","UTF-8") + "=" + URLEncoder.encode(baseTime, "UTF-8")); /* 조회하고싶은 시간 AM 02시부터 3시간 단위 */
        urlBuilder.append("&" + URLEncoder.encode("dataType","UTF-8") + "=" + URLEncoder.encode(type, "UTF-8"));	/* 타입 */

        /*
         * GET방식으로 전송해서 파라미터 받아오기
         */
        URL url = new URL(urlBuilder.toString());

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        System.out.println("Response code: " + conn.getResponseCode());
        
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        
        rd.close();
        conn.disconnect();
        String result= sb.toString();

	//=======이 밑에 부터는 json에서 데이터 파싱해 오는 부분이다=====//
    
        // response 키를 가지고 데이터를 파싱
        JSONObject jsonObj_1 = new JSONObject(result);
        String response = jsonObj_1.getString("response");

        // response 로 부터 body 찾기
        JSONObject jsonObj_2 = new JSONObject(response);
        String body = jsonObj_2.getString("body");

        // body 로 부터 items 찾기
        JSONObject jsonObj_3 = new JSONObject(body);
        String items = jsonObj_3.getString("items");
        Log.i("ITEMS",items);

        // items로 부터 itemlist 를 받기 
        JSONObject jsonObj_4 = new JSONObject(items);
        JSONArray jsonArray = jsonObj_4.getJSONArray("item");

        for(int i=0;i<jsonArray.length();i++){
            jsonObj_4 = jsonArray.getJSONObject(i);
            String fcstValue = jsonObj_4.getString("fcstValue");
            String category = jsonObj_4.getString("category");

            if(category.equals("SKY")){
                weather = "현재 날씨는 ";
                if(fcstValue.equals("1")) {
                    weather += "맑은 상태로";
                }else if(fcstValue.equals("2")) {
                    weather += "비가 오는 상태로 ";
                }else if(fcstValue.equals("3")) {
                    weather += "구름이 많은 상태로 ";
                }else if(fcstValue.equals("4")) {
                    weather += "흐린 상태로 ";
                }
            }

            if(category.equals("T3H") || category.equals("T1H")){
                tmperature = "기온은 "+fcstValue+"℃ 입니다.";
            }
            
            Log.i("WEATER_TAG",weather + tmperature);
        }

    }

}

 

나는 날씨 정보만 필요해서 값을 하나만 받았지만

만약 다른 정보도 필요하다면

String fcstValue = jsonObj_4.getString("fcstValue");

이 부분에서 변수명과 가져올 데이터 값이름을 바꿔쓴 후 밑에 추가하여 사용하면 된다. 

예시) String fcstData = jsonObj_4.getString("fcstData");

 

현재 위치값을 받아와

그 위치에 맞는 날씨를 구하는 방법은

밑에 표시한 링크를 따라가면 된다.

현재 위치에 따라 날씨 가져오기

 

기상청 날씨 api_엑셀파일에서 지역 격자값 가져와 날씨 가져오기 (feat.공공데이터포털)

전에 날씨 api를 사용하여 날씨 정보 가져오기를 해봤다. 기상청 날씨 api 사용 기상청 날씨 api (feat.공공데이터포털) 날씨를 불러오는 기능을 android 프로젝트에 넣으려고 찾아보았다. 먼저 참고한

toubi-tobap.tistory.com