Воскресенье, 16 февраля 2014 00:00

Погода по ip. Умный информер

Оцените материал
(1 Голосовать)

Тема погодного информера, умеющего самостоятельно определить город посетителя сайта и вывести на страничку актуальное состояние погоды для соответствующей геолокации - имеет давнюю и прочную популярность в Сети.

Умный погодный информер от Masterpro.ws

Dev banner 2

Разработок такого рода немало; но явному большинству из них свойственен довольно существенный, на мой взгляд, недостаток... увы, начинающему блоггеру-сайтовладельцу, не искушенному в премудростях пыха, практически нереально разобраться в хитросплетениях порой действительно монстрообразного кода. Предложенное на этой страничке решение, хотелось бы надеяться, очень несложно; использован Free API сервиса worldweatheronline.com и база данных Sypex Geo, c которой мы с вами уже не раз экспериментировали в этом блоге.

Идем на worldweatheronline.com , регистрируемся, создаем application и получаем api_key; это единственное, что нам там понадобится. Premium aссount совершенно необязателен; разве что вам очень уж захочется... правда, разработчики прекрасного погодного сервиса worldweatheronline.com настойчиво просят вас разместить на страничке вашего блога эту ссылку; а почему бы и нет?

Powered by World Weather Online

Итак, начинаем. Я попробую прокомментировать отдельные участки кода; при желании - эти объяснения легко можно пропустить и попросту скопировать окончательный вариант, опубликованный в конце статьи. Файл index.php находится в одной директории с SxGeoSity.dat и SxGeo.php; точь в точь как в нашем предыдущем примере с Google Map... рассмотрим сейчас содержимое этого файла.

 

Рекламная пауза. Зарелизился jWeather by ip - нативный модуль Joomla 3. Джумлаводы теперь имеют счастливую возможность, не возясь со скриптами (и зачем они нужны в Joomla, скрипты?! вот ведь еще напасть какая) и даже не читая дальше - легко и просто установить умный погодный информер посредством менеджера расширений. Ну, словом, все привычно и комфортно - качаем и тестируем.

 

Для начала подключаем SypexGeo, именно эта база данных (которую вовсе нелишне время от времени обновлять) поможет нам найти соответствие между ip-адресом посетителя и его местоположением. Правда, отталкиваться мы будем не от названия города, а от географических координат, что позволит нам значительно упростить задачу... собственно, именно потому мы с вами и используем погодный сервис World Weather Online , позволяющий получить погоду по широте и долготе местности.

Впрочем, что нам мешает вывести и название города? - дополнительно, так сказать? - ничто не мешает. Итак:

 

<?php
$ip = $_SERVER['REMOTE_ADDR'];
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$city = $SxGeo->get($ip);
echo "{$city['city']}<br/>";

 

Уже должно вчерне работать; уже мы с вами получаем, благодаря последней строчке кода, и открыв в браузере index.php - название города. Но для нас важно сейчас иное.

 

$loc_array = array($city['lat'],$city['lon']);
$api_key="vash_api_key";
$num_of_days=1;
$loc_safe = array();
foreach($loc_array as $loc){
$loc_safe[] = urlencode($loc);
}
$loc_string=implode(',', $loc_safe);
$basicurl = sprintf('http://api.worldweatheronline.com/free/v1/weather.ashx?key=%s&q=%s&num_of_days=%s', $api_key, $loc_string, intval($num_of_days));
$xml_response = file_get_contents($basicurl);
$xml = simplexml_load_string($xml_response);

 

Этот участок кода представляет из себя немного модифицированный (не забудьте, кстати, о вставке вашего api_key) код, предлагаемый нам разработчиками worldweatheronline.com, вы можете увидеть его аналог в документации сервиса. В самом начале, как видите, мы просто подставляем в скрипт два элемента массива - lat и lon, т.е. широту и долготу - для дальнейшей обработки. Мы могли бы, в принципе, воспользоваться функцией extract, импортировав элементы массива в текущую таблицу символов, тогда бы это выглядело следующим образом:

 

extract($city);
$loc_array = array($lat,$lon);

 

Впрочем, мы этого делать не будем. Все уже почти готово (правда ведь, все очень быстро и совсем несложно?), нам осталось только вывести в наш HTML собственно погоду. Это можно сделать, скажем, пробежав по массиву посредством foreach:

 

$ss = array();
foreach ($xml[0] as $name => $val) {
foreach ($val as $name1 => $val1)
{
$ss[$name1] = $val1;
}
}
echo $ss["date"];
echo "<br>";
echo "Координаты {$ss["query"]}";
echo "<br>";
echo "Температура {$ss["temp_C"]} С";
echo "<br>";

 

Возможно ли, при желании, обойтись без foreach ? - да, почему бы и нет. Предположим, как-то так:

 

echo ($xml->weather->date);
echo ($xml->weather->tempMinF);
echo ($xml->weather->windspeedKmph);

 

Кстати, мы без проблем сумеем вывести и картинку, иллюстрирующую состояние погоды. Можно совсем по-простому:

 

$a = $ss["weatherIconUrl"]; 
$b = "<img src='$a'>";
echo $b;

 

или же чуть более изящно:

 

echo '<img src="' . $xml->weather->weatherIconUrl . '"/>';

 

Возможно, следует обратить внимание на эту ремарку:

If you tried to load an XML file with this, but the CDATA parts were not loaded for some reason, is because you should do it this way: $xml = simplexml_load_file($this->filename, 'SimpleXMLElement', LIBXML_NOCDATA); This converts CDATA to String in the returning object.

 

и данную строчку:

 

$xml = simplexml_load_string($xml_response);

 

изменить следующим образом:

 

$xml = simplexml_load_string($xml_response, 'SimpleXMLElement', LIBXML_NOCDATA);

 

По желанию. Варианты разработки всегда возможны и приветствуются. Вы можете взглянуть на уже отформатированный xml, для чего оптимально подключить, скажем, фреймворк HuPHP. Получится гораздо удобнее - вся структура как на ладони. Если необходимо обратиться к элементам массива, расположенным ниже основных значений (current_condition) - получить, скажем, прогноз на ближайшие дни, тогда (for example):

 

<div><?='Осадки '. ($xml->weather[4]->hourly[5]->precipMM). ' мм';?></div>

 

Итак, к чему мы пришли... демку вы видите на этой страничке, в левой ее части, а финальная версия кода всегда доступна на форуме (стили уж сами добавьте по вкусу). Enjoy! В случае обнаружения критичных проблем в работе информера - просьба отписаться... хотя, думаю, есть смысл продолжить эту тему уже в контексте иных БД, не только Sypex Geo. Впрочем, посмотрим. Заходите иногда на огонек этого блога.

 

Примечание. В актуальной версии Sypex Geo необходимо внести некоторые изменения в приведенный код. Последнюю ревизию данной разработки вы всегда можете получить на форуме, welcome по ссылке.

 

Продолжение темы

 

Последнее изменениеПонедельник, 22 апреля 2019 14:50

3 комментарии

  • Комментировать Aleksej Воскресенье, 06 сентября 2015 10:30 написал Aleksej

    pro777, так, да не совсем так. Прочтите внимательно эти фразы из TOS worldweatheronline, я цитирую без купюр. Кроме того - что мешает вам купить Premium аккаунт? - если вашему web-ресурсу требуется большее количество запросов. нежели этой страничке?

    Premium API - pricing starts from 500 request/day.

    Weather API request limit.
    We request our free weather API users to not exceed 250 requests per day. We are flexible on our request limit, so if at any point you feel you are going to exceed 250 requests per day then please do let us know.

  • Комментировать pro777 Суббота, 05 сентября 2015 19:09 написал pro777

    worldweatheronline.com является платным сервисом. Бесплатно возможно использовать только 250 запросов в день. Из-за чего их сервис на бесплатной основе использовать нереально.

  • Комментировать Алескандр Четверг, 23 апреля 2015 09:23 написал Алескандр

    Спасибо

Оставить комментарий

Добавьте ваш комментарий

Linux для вас. Аутсорсинг и консультации

Линукс для вас. Аутсорсинг и консультации.

SEO-оптимизация. SEO-услуги

Temperature, °C-2.3
Wind speed 22.7
Cloudcover 68.8
Description weatherPartially cloudy
Solar power (W/m2)72.5
Indicates the total energy from the sun (MJ/m2)6.3
Moon phase0.7
Level (0 - 10) of UV exposure3
Probability (%) of adverse weather conditions10
Dew point temperature (°C)-7.8
What a temperature feels like (°C)-6.9
Types of precipitationrain

How to create a Joomla Contact Form