'Please provide an api key from openweathermap.org']; } $data = self::_fetch($lat, $lng, $key); if(!$data) return null; if(!property_exists($data, 'weather')) return null; $weather = [ 'description' => null, 'icon' => [ 'name' => null ], 'temp' => null, 'feelslike' => null, 'humidity' => null, 'wind' => null, 'pressure' => null, 'precip_today' => null, 'timezone' => [ 'offset' => null, 'name' => null, 'abbr' => null ] ]; $sunny = self::_sunny($data->coord->lat, $data->coord->lon); $icon_name = self::_icon_name($data->weather[0]->id); $weather['sun'] = $sunny; $weather['description'] = $data->weather[0]->description; $weather['icon']['name'] = $icon_name; $weather['temp'] = [ 'num' => (double)$data->main->temp, 'unit' => '°F' ]; $weather['feelslike'] = [ 'num' => (double)$data->main->feels_like, 'unit' => '°F' ]; $weather['wind'] = [ 'num' => $data->wind->speed, 'unit' => 'mph' ]; $weather['pressure'] = [ 'num' => (int)$data->main->pressure, 'unit' => 'mb' ]; $weather['humidity'] = [ 'num' => round($data->main->humidity), 'unit' => '%' ]; $tz = new DateTimeZone($data->timezone); $now = new DateTime(); $now->setTimeZone($tz); $offset = $now->format('Z')/3600; $weather['timezone']['name'] = $sunny['timezone']; $weather['timezone']['offset'] = $offset; #$weather['raw'] = $current; return $weather; } private static function _fetch($lat, $lng, $key) { $params = [ 'units' => 'imperial', 'lat' => $lat, 'lon' => $lng, 'appid' => $key, ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.openweathermap.org/data/2.5/weather?'.http_build_query($params)); 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, $timezone=null) { // Get the beginning of the current day $now = new DateTime(); if(!$timezone) { $timezone = \p3k\Timezone::timezone_for_location($lat, $lng); } $tz = new DateTimeZone($timezone); $now->setTimeZone($tz); $offset = $now->format('Z')/3600; $now = $now->format('H') + ($now->format('i')/60); $sunrise = date_sunrise($now, SUNFUNCS_RET_DOUBLE, $lat, $lng, 90, $offset); $sunset = date_sunset($now, SUNFUNCS_RET_DOUBLE, $lat, $lng, 90, $offset); return [ 'sunrise' => round($sunrise,2), 'sunset' => round($sunset,2), 'now' => round($now,2), 'light' => ($sunrise < $now && $now < $sunset) ? 'day' : 'night', 'timezone' => $timezone, ]; } private static function _icon_name($icon) { return 'wi-owm-'.$icon; /* // A mapping of darksky to weather-icons is here https://erikflowers.github.io/weather-icons/api-list.html $map = [ 'clear-day' => 'day-sunny', 'clear-night' => 'night-clear', 'rain' => 'rain', 'snow' => 'snow', 'sleet' => 'sleet', 'wind' => 'strong-wind', 'fog' => 'day-haze', 'cloudy' => 'cloudy', 'partly-cloudy-day' => 'day-cloudy', 'partly-cloudy-night' => 'night-cloudy', 'hail' => 'day-hail', 'thunderstorm' => 'thunderstorm', 'tornado' => 'tornado', ]; if(array_key_exists($icon, $map)) { return 'wi-'.$map[$icon]; } else { return false; } */ } }