Добавляем прогноз погоды на сайт с Google Weather API

Опубликовано Опубликовано в рубрике API, Google Weather API, PHP, ООП

Данная статья устарела в связи с прекращением работы сервиса Google Weather API! Рекомендую ознакомиться с аналогичной статьёй на предложенную тему здесь.

Сегодня хотелось бы продолжить тему разнообразных полезных API и рассказать о весьма полезном интерфейсе Google Weather. Он позволяет выводить прогноз погоды на Вашем сайте по заданным в запросе параметрам. Итак, обо всём по порядку.
Для начала немного теории.
Как и многие API, Google Weather возвращает XML-файл, сформированный по запросу к системе. Запрос выглядит следующим образом:

http://www.google.com/ig/api?weather=Город&hl=Язык&oe=Кодировка

В запросе есть один обязательный параметр — это weather. Остальные добавляются по желанию.

Если мы хотим узнать погоду в Москве, то необходимо составить вот такой запрос:

http://www.google.com/ig/api?weather=Москва&hl=ru&oe=utf-8

Если Вы введёте его в адресную строку своего браузера, то API вернёт приблизительно следующий ответ


Все значения содержатся в виде атрибутов DOM-элементов. Я нахожу это немного неудобным, но пользоваться всем этим можно Документ выдает информацию о самом прогнозе (forecast_information), текущую погоду (current_conditions) и прогноз на три последующих дня (forecast_conditions).

В каждом блоке информации содержатся определенные данные, распознать которые совсем несложно при минимальном знании английского языка.

Для того, чтобы обработать поступающий документ будем использовать функцию simplexml_load_file(), в параметр которой будем передавать сформированный url-запрос. Для запроса, обработки и вывода будет неплохо создать класс, который и будет заниматься всей рутинной работой. Опишем его:

class Forecast {

 global $xml;

 function __construct($city, $lang="ru", $charset="utf-8"){
       $request = 'http://www.google.com/ig/api?weather='.$city.'&hl='.$lang.'&oe='.$charset.';
       $this->xml = simplexml_load_file($request);
 }

Итак, конструктор нашего класса потребует на входе лишь только имя города, после чего сформирует запрос к API и вернет разобранный xml-файл. Теперь опишем внутри класса пару полезных функций для обработки полученных данных.

function Maininfo()
 {
      if(!$this->xml) return false;
      $info = $this->xml->xpath("/xml_api_reply/weather/forecast_information");
      return $info[0];
 }

 function CurW()
 {
      if(!$this->xml) return false;
      $cur = $this->xml->xpath("/xml_api_reply/weather/current_conditions");
      return $cur[0];
 }

 function ForW(){
      if(!$this->xml) return array();
      $forecast = $this->xml->xpath("/xml_api_reply/weather/forecast_conditions");
      return $forecast;
 }

Что же делают эти функции? Каждая из них обращается к обработанному xml-файлу внутри экземпляра класса. Если запрос вернул ошибку, то обработка останавливается. Иначе каждая функция создаёт переменную-массив, куда размещает нужные данные (Maininfo — информация о прогнозе, CurW — текущая погода, ForW — прогноз). Доступ к данным помогает осуществлять функция xpath из библиотеки SimpleXML. Соответственно слэши в её аргументы означают DOM-уровни в XML.

Класс мы описали, теперь можем создавать экземпляры и обрабатывать их.

$pogoda = new Forecast('Москва');//создали экземпляр класса Forecast

$p_inf = $gw->Maininfo();//взяли основную информацию

$p_now = $gw->CurW();//взяли текущую погоду

$p_forecast = $gw->ForW();//взяли прогнозы

Информацию собрали, теперь надо выдать её пользователю в удобоваримом виде. Не буду выпендриваться и воспользуюсь HTML-таблицами.

Кстати, API выдаёт нам только дату старта прогноза, а значит для последующих дней число надо будет высчитывать самостоятельно. Но это достаточно тривиальная задача, связанная с case-программированием. Я лишь покажу, как перевести дату в «наш» формат из формата ГГГГ-ММ-ДД.

$mysqldate = $gw_info->forecast_date['data']; //дата старта прогноза 

$time = strtotime($mysqldate);//переводим дату в UNIX-формат      

$month_name = array( 1 => 'янв', 2 => 'фев', 3 => 'мар',
			4 => 'апр', 5 => 'мая', 6 => 'июн',
			7 => 'июл', 8 => 'авг', 9 => 'сен',
			10 => 'окт', 11 => 'ноя', 12 => 'дек'
		   );//это массив соответствия номеров месяца и их русских сокращенных имен
$month = $month_name[ date( 'n',$time ) ]; //по UNIX-времени и созданному массиву определяем русское имя месяца

$day   = date( 'j',$time ); //определяем дату
$year  = date( 'Y',$time ); //определяем год

Теперь обрабатываем наконец-то переходим к таблице


Добавляем прогноз погоды на сайт с Google Weather API: 4 комментария

  1. Уведомление: Promonika

Добавить комментарий для Александр Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Yandex.Metrica