[php] openweathermap.org의 API를 이용한 현재 기상정보 보여주기

2015. 1. 29. 15:43 from Dev/php

예전에 openweathermap.org에서 제공하는 기상 정보를 이용하는 방법에 대해서 간단하게 올렸었습니다. (링크)

무료로 이용할 수 있는 날씨 정보 API가 별로 없는데, 이곳 서비스는 안정적으로 잘 이용하고 있습니다.

오늘은 간단하게 객체화 시킨 소스를 보여드리겠습니다. 언제나 그렇듯이 잘못된 부분이나 더 개선할 부분이 있으면 알려주세요. ^^



class Weather {

	const API_URL_CURRENT = "http://api.openweathermap.org/data/2.5/weather?lat=37.56826&lon=126.977829&units=metric&APPID=<발급받은 아이디>";
	const API_URL_FORECAST = "http://api.openweathermap.org/data/2.5/forecast/daily?lat=37.56826&lon=126.977829&cnt=5&units=metric&APPID=<역시 발급받은 아이디>";

	public static function get_current_weather() {
		$c = curl_init(self::API_URL_CURRENT);
		$options = array(
			CURLOPT_HEADER => false,
			CURLOPT_RETURNTRANSFER => true
		);
		curl_setopt_array($c, $options);
		$data = curl_exec($c);
		curl_close($c);
		
		if (isset($data) && $data) {
			$data_obj = json_decode($data);
			$result = array(
				'current_temp' => $data_obj->main->temp,
				'temp_min' => $data_obj->main->temp_min,
				'temp_max' => $data_obj->main->temp_max,
				'desc' => $data_obj->weather[0]->main,
				'icon' => "http://openweathermap.org/img/w/{$data_obj->weather[0]->icon}.png",
				'status' => 'ok'
			);
			return $result;
		}
	}
	
	public static function get_weather_forecast() {
		$c = curl_init(self::API_URL_FORECAST);
		$options = array(
			CURLOPT_HEADER => false,
			CURLOPT_RETURNTRANSFER => true
		);
		curl_setopt_array($c, $options);
		$data = curl_exec($c);
		curl_close($c);
		
		return json_decode($data);
	}
}

$w = Weather::get_current_weather();
echo "現在 " . number_format($w['current_temp'], 1) . "℃";


php 파일을 만드신 다음에 원하는 곳에 include만 해주면 간단한 날씨 아이콘과 현재 기온이 그림처럼 출력됩니다.

위 예제는 서울을 기준으로 했으니 다른 도시라면 lat, lon을 바꾸어주셔야 합니다.


이미지 아이콘도 $w['icon']으로 이용하실 수 있습니다만, 이쁜 아이콘이 아니라 pass. ㅋㅋ



여기에 가시면 오픈소스 날씨 관련 아이콘이 있습니다

erikflowers/weather-icons



기상 예측에 대해서도 일단 정보를 가져오는 부분은 코딩을 해 놓았습니다. json 객체이니 보시고 입맛에 맞게 이용하시면 됩니다.

Posted by banasun :

[php] openweathermap.org의 API와 cUrl을 이용하여 기상정보 가져오기

2014. 11. 6. 15:47 from Dev/php

간단하게 기상정보를 표시해주어야 할 일이 있어서 검색을 해보았는데, yahoo나 기상청의 공개 api 등이 나오더군요.

기상청은 공개 API이긴 하지만 승인요청하고 며칠 기다려야 하고, 상업적 용도의 사이트에 이용이 가능한지도 애매하고, 주의사항에 있는 '서버 과부하시 이용이 제한될 수 있습니다'라는 문구를 보고는 솔직히 좀 불안하더군요. 군함도 486 컴퓨터로 돌리는 나란데.. 아무도 책임 안지는 공개 api의 서버는 어떠할지...

그래서 조금 더 찾아 보니 http://openweathermap.org/api 라는 공개 서비스가 있네요. 일단 key 발급 같은 것도 간단하고(email 등록하면 됨), 일정 용량 이상 넘어가지 않는다면 이용하는 데 문제는 없어 보입니다.


php의 cUrl을 이용해서 자료를 가져와 보겠습니다:

 
$w = curl_init('http://api.openweathermap.org/data/2.5/weather?q=Seoul');
$weather_options = array(
	CURLOPT_HEADER => false,
	CURLOPT_RETURNTRANSFER => true
	);
curl_setopt_array($w, $weather_options);
$a = curl_exec($w);
curl_close($w);

if (isset($a) && $a) {
	$weather = json_decode($a);
	
	$current_temp = $weather->main->temp - 273.15;
	$temp_min = $weather->main->temp_min - 273.15;
	$temp_max = $weather->main->temp_max - 273.15;
	$weather_main = $weather->weather[0]->main;
	$weather_icon = "http://openweathermap.org/img/w/{$weather->weather[0]->icon}.png";

	echo "
";
	echo "현재 기온 : " . $current_temp;
	echo "최저 기온 : " . $temp_min;
	echo "최고 기온 : " . $temp_max;
	echo "날씨 : " . $weather_main;
	echo "
"; } else { exit(0); }

json 타입과 xml 타입으로 받을 수 있고, 넘겨온 값을 처리할 때에는 하위 값이 object도 있고, array도 있으니 이용할 때 참고하시고요, 그리고 한참 헤맸던게, 온도가 화씨가 아니라 절대온도(K)입니다. 섭씨 온도로 변경하려면 273.15를 빼주어야 합니다.

그리고 해당 날씨의 아이콘도 같이 제공해줍니다. 18번째 라인이 아이콘을 가져오는 부분인데, 아이콘도 예뻤으면 좋았을텐데 하는 생각이 드는 군요. ^^

원래는 APPKEY를 같이 넘겨줘야 한다고 되어 있는데, 테스트 할 때에는 없이도 잘 수행이 됩니다. 그래도 정책이 APPKEY를 받도록 되어 있고, 발급도 간단하니 안정적으로 이용할 때에는 넣어주시면 될 것 같습니다.

위 코드는 테스트용이라.. 이용하시는 목적에 맞게 객체를 만드시든, 함수를 만드시든 해서 사용하세요. ^^

Posted by banasun :