[TIL] 10월 8일: OpenWeatherMap api 사용

Jung·2021년 10월 8일
0

TIL

목록 보기
22/77
post-thumbnail

1차 프로젝트에서 Geolocation API를 이용해 현재 내 위치의 위도와 경도를 구할 수 있었다.
또 위도, 경도 값과 한국관광공사 API를 이용해 내 위치 근처의 여행지의 위도, 경도 값을 구할 수 있었다.
그렇다면 이 위도, 경도 값을 이용해 해당 여행지의 날씨를 알 수 있다는 것이다. 그래서 나는 날씨 API는 OpenWeatherMap에 있는 Current Weather Data API를 사용했다.
Current Weather Data 문서를 보면 내가 알고자 하는 위치의 위도, 경도값을 요청 url에 있는 쿼리 파라미터에 넣으면 날씨 정보를 json 포맷으로 얻어올 수 있다.

사용법은 위 사진과 같다.

나는 날씨 정보에서 기온을 섭씨 기준으로 받을 것이기 때문에 쿼리파라미터에 &units=metric을 추가하면 된다.

@app.route('/api/example', methods=['POST'])
def get_weather():
    lat = request.form['lat']
    lng = request.form['lng']

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML, like Gecko) '
                      'Chrome/73.0.3683.86 Safari/537.36'
    }

    url = f'{WEATHER_URL}?lat={lat}&lon={lng}&appid={WEATHER_KEY}&units=metric'

    r = requests.get(url, headers=headers)

    weather_info = json.loads(r.text)  # json 문자열을 파이썬 객체(딕셔너리)로 변환

    return jsonify({'weather_info': weather_info})

파이썬 코드는 위와 같다. OpenWeatherMap Api에 요청을 보내 json 포맷으로 파싱해온다. 그 파싱해온 json 문자열을 파이썬 객체(딕셔너리)로 변환한다. 그리고 이 데이터를 json 형식으로 반환해 응답을 보낸다.
그럼 프론트의 Ajax 코드에서 이 데이터를 받아 내가 필요로 하는 데이터만 가져다 쓸 수 있다.

이슈 발생

오늘은 비가 왔었다. 때문에 날씨를 불러왔을 때 강수량 데이터도 얻을 수 있었다. 따라서 강수량 데이터도 화면에 출력하기 위해 사용했다. 하지만 시간이 지나서 다시 실행해보는데 에러가 발생했다.

'1h'라는 것은

현재로부터 1시간 기준 강수량 값을 저장한 key이다. 비가 오지 않으면 rain: { 1h: 값 }이라는 항목을 OpenWeatherMap API에서 보내주지 않는다.
비가 오지 않았는데 나는 이 항목을 불러오려고 해서 발생한 이슈였다.

따라서 해결 방법으로

기존 코드:

let weather = response['weather_info']['weather'][0]['main'];
let rain = response['weather_info']['rain']['1h'];
 $('#rain').text(rain + 'mm/h');

수정한 코드:

let weather = response['weather_info']['weather'][0]['main'];
if (weather == 'Rain') {
    let rain = response['weather_info']['rain']['1h'];
    $('#rain').text(rain + 'mm/h');
}

비가 올 때만 강수량이 뜨도록 변경해서 오류를 해결했다!!

let weather = response['weather_info']['weather'][0]['main'];

weather 변수에는 OpenWeatherMap API에서 파싱해온 현재의 날씨의 종류가 저장된다.
날씨의 종류로는 sky is clear, few clouds, scattered clouds, broken clouds, overcast clouds, shower rain, light rain, moderate rain, Rain, Thunderstorm, snow, mist 등이 있다.

profile
97kim.github.io

0개의 댓글