<?php
|
|
namespace p3k;
|
|
|
|
use Config;
|
|
|
|
class Weather {
|
|
public static function weather_for_location($lat, $lng) {
|
|
$data = self::_fetch($lat, $lng);
|
|
if(!$data) return null;
|
|
|
|
$current = $data->current_observation;
|
|
|
|
$weather = [
|
|
'description' => null,
|
|
'icon' => [
|
|
'url' => null,
|
|
'name' => null
|
|
],
|
|
'temp' => null,
|
|
'feelslike' => null,
|
|
'humidity' => null,
|
|
'wind' => null,
|
|
'pressure' => null,
|
|
'precip_today' => null,
|
|
'timezone' => [
|
|
'offset' => null,
|
|
'name' => null,
|
|
'abbr' => null
|
|
]
|
|
];
|
|
|
|
if($current) {
|
|
|
|
$loc = $current->display_location;
|
|
if($loc) {
|
|
$weather['location'] = [
|
|
'city' => $loc->city,
|
|
'state' => $loc->state,
|
|
'country' => $loc->country,
|
|
'zip' => $loc->zip
|
|
];
|
|
$sunny = self::_sunny($current->display_location->latitude, $current->display_location->longitude);
|
|
} else {
|
|
$sunny = 'day';
|
|
}
|
|
|
|
$icon_name = self::_icon_name($current->icon, $sunny);
|
|
|
|
$weather['description'] = $current->weather;
|
|
$weather['icon']['url'] = $current->icon_url;
|
|
$weather['icon']['name'] = $icon_name;
|
|
$weather['temp'] = [
|
|
'num' => (double)$current->temp_f,
|
|
'unit' => '°F'
|
|
];
|
|
$weather['feelslike'] = [
|
|
'num' => (double)$current->feelslike_f,
|
|
'unit' => '°F'
|
|
];
|
|
$weather['wind'] = [
|
|
'num' => $current->wind_mph,
|
|
'unit' => 'mph'
|
|
];
|
|
$weather['pressure'] = [
|
|
'num' => (int)$current->pressure_mb,
|
|
'unit' => 'mb'
|
|
];
|
|
$weather['precip_today'] = [
|
|
'num' => (double)$current->precip_today_in,
|
|
'unit' => 'in'
|
|
];
|
|
$weather['humidity'] = [
|
|
'num' => (int)str_replace('%','',$current->relative_humidity),
|
|
'unit' => '%'
|
|
];
|
|
|
|
$weather['timezone']['offset'] = $current->local_tz_offset;
|
|
$weather['timezone']['name'] = $current->local_tz_long;
|
|
$weather['timezone']['abbr'] = $current->local_tz_short;
|
|
}
|
|
|
|
#$weather['raw'] = $current;
|
|
|
|
return $weather;
|
|
}
|
|
|
|
private static function _fetch($lat, $lng) {
|
|
$ch = curl_init();
|
|
curl_setopt($ch, CURLOPT_URL, 'http://api.wunderground.com/api/'.Config::$wundergroundAPIKey.'/conditions/q/'.$lat.','.$lng.'.json');
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
|
|
// curl_setopt($ch, CURLOPT_USERAGENT, '');
|
|
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
|
|
$result = curl_exec($ch);
|
|
|
|
if($result == FALSE)
|
|
return FALSE;
|
|
|
|
return json_decode($result);
|
|
}
|
|
|
|
// Returns "day" or "night" depending on whether the sun is up at the given location
|
|
private static function _sunny($lat, $lng) {
|
|
$now = time();
|
|
if($lat !== null) {
|
|
$sunrise = date_sunrise($now, SUNFUNCS_RET_TIMESTAMP, $lat, $lng, 96);
|
|
$sunset = date_sunset($now, SUNFUNCS_RET_TIMESTAMP, $lat, $lng, 96);
|
|
if($sunrise < $now && $sunset > $now) {
|
|
return 'day';
|
|
} else {
|
|
return 'night';
|
|
}
|
|
} else {
|
|
return 'unknown';
|
|
}
|
|
}
|
|
|
|
private static function _icon_name($icon, $sunny) {
|
|
// This list is from http://www.wunderground.com/weather/api/d/docs?d=resources/icon-sets
|
|
// A mapping of wunderground to weather-icons is here https://erikflowers.github.io/weather-icons/api-list.html
|
|
$map = [
|
|
'day' => [
|
|
'chanceflurries' => 'snow-wind',
|
|
'chancerain' => 'day-rain',
|
|
'chancesleet' => 'sleet',
|
|
'chancesnow' => 'snow',
|
|
'chancetstorms' => 'thunderstorm',
|
|
'clear' => 'day-sunny',
|
|
'cloudy' => 'day-cloudy',
|
|
'flurries' => 'snow-wind',
|
|
'fog' => 'day-haze',
|
|
'hazy' => 'day-haze',
|
|
'mostlycloudy' => 'day-cloudy',
|
|
'mostlysunny' => 'day-sunny-overcast',
|
|
'partlycloudy' => 'day-cloudy',
|
|
'partlysunny' => 'day-sunny-overcast',
|
|
'sleet' => 'sleet',
|
|
'rain' => 'rain',
|
|
'snow' => 'snow',
|
|
'sunny' => 'day-sunny',
|
|
'tstorms' => 'thunderstorm',
|
|
],
|
|
'night' => [
|
|
'chanceflurries' => 'night-snow-wind',
|
|
'chancerain' => 'night-rain',
|
|
'chancesleet' => 'night-alt-sleet',
|
|
'chancesnow' => 'night-snow',
|
|
'chancetstorms' => 'night-thunderstorm',
|
|
'clear' => 'night-clear',
|
|
'cloudy' => 'night-alt-cloudy',
|
|
'flurries' => 'night-alt-snow-wind',
|
|
'fog' => 'night-fog',
|
|
'hazy' => 'night-fog',
|
|
'mostlycloudy' => 'night-cloudy',
|
|
'mostlysunny' => 'night-clear',
|
|
'partlycloudy' => 'night-partly-cloudy',
|
|
'partlysunny' => 'night-partly-cloudy',
|
|
'sleet' => 'night-alt-sleet',
|
|
'rain' => 'night-alt-showers',
|
|
'snow' => 'night-alt-snow',
|
|
'sunny' => 'night-clear',
|
|
'tstorms' => 'night-alt-thunderstorm',
|
|
]
|
|
];
|
|
if(array_key_exists($icon, $map[$sunny])) {
|
|
return 'wi-'.$map[$sunny][$icon];
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|