Поговорим о погоде

    За последнее время мне пришлось довольно основательно пообщаться с несколькими сервисами Yahoo! В этой заметке расскажу об одном из них, который для многих может оказаться полезным. Это сервис прогноза погоды Yahoo! Weather.

    Года два назад я искал в сети удобный и открытый источник подобных данных, но так ничего и не нашел. Все отечественные сервисы экспортировали данные за деньги (отпугивала скорее не цена, а наличие возни с оплатой), а западные — либо не предоставляли данных в удобном для автоматической обработки формате, либо не знали о существовании города, в котором я живу.

    Yahoo! Weather порадовал отсутствием перечисленных недостатков. Информация о текущей погоде, а так же прогноз на ближайшие 5 дней экспортируется с их сервера в формате RSS. На мой взгляд, выбор этого формата притянут за уши, т.к. погодная RSS «лента» содержит всего однин item. Те же данные можно было бы экспортировать в более лаконичном виде, но в Yahoo, по всей видимости, расчитывали на стандартные методы обработки RSS, что тоже довольно весомый довод. Стандарт — это все-таки стандарт.

    Адрес RSS фида для интересующего города можно найти на сайте weather.yahoo.com.



    В общем виде URL выглядит следующим образом:

    xml.weather.yahoo.com/forecastrss?p=код_города&u=единицы_измерения

    Первый параметр — идентификатор интересующего города. Второй параметр определяет, в каких единицах будет выдаваться температура. Значение «c» соответствует градусам Цельсия, «f» — градусам Фаренгейта.
    Несколько примеров:



    Автоматизируем это



    Описанный ниже класс YahooWeather (PHP5) предназначен для загрузки RSS по HTTP и предварительной обработки данных.

    <?php
    
    class YahooWeather {
    	// Ветер
    	public $wind_chill;
    	public $wind_direction;
    	public $wind_speed;
    	
    	// Атмосферные показатели
    	public $humidity;
    	public $visibility;
    	public $pressure;
    	
    	// Время восхода и заката переводим в формат unix time
    	public $sunrise;
    	public $sunset;
    	
    	// Текущая температура воздуха и погода
    	public $temp;
    	public $condition_text;
    	public $condition_code;
    	
    	// Прогноз погоды на 5 дней
    	public $forecast;
    	
    	public $units;
    	
    	function __construct($code, $units = 'c', $lang = 'en') {
    		$this->units = ($units == 'c')?'c':'f';
    		
    		$url = 'http://xml.weather.yahoo.com/forecastrss?p='.
    			$code.'&u='.$this->units;
    		
    		$xml_contents = file_get_contents($url);
    		if($xml_contents === false) 
    			throw new Exception('Error loading '.$url);
    		
    		$xml = new SimpleXMLElement($xml_contents);
    		
    		// Ветер
    		$tmp = $xml->xpath('/rss/channel/yweather:wind');
    		if($tmp === false) throw new Exception("Error parsing XML.");
    		$tmp = $tmp[0];
    		
    		$this->wind_chill = (int)$tmp['chill'];
    		$this->wind_direction = (int)$tmp['direction'];
    		$this->wind_speed = (int)$tmp['speed'];
    		
    		// Атмосферные показатели
    		$tmp = $xml->xpath('/rss/channel/yweather:atmosphere');
    		if($tmp === false) throw new Exception("Error parsing XML.");
    		$tmp = $tmp[0];
    		
    		$this->humidity = (int)$tmp['humidity'];
    		$this->visibility = (int)$tmp['visibility'];
    		$this->pressure = (int)$tmp['pressure'];
    		
    		// Время восхода и заката переводим в формат unix time
    		$tmp = $xml->xpath('/rss/channel/yweather:astronomy');
    		if($tmp === false) throw new Exception("Error parsing XML.");
    		$tmp = $tmp[0];
    		
    		$this->sunrise = strtotime($tmp['sunrise']);
    		$this->sunset = strtotime($tmp['sunset']);
    		
    		// Текущая температура воздуха и погода
    		$tmp = $xml->xpath('/rss/channel/item/yweather:condition');
    		if($tmp === false) throw new Exception("Error parsing XML.");
    		$tmp = $tmp[0];
    		
    		$this->temp = (int)$tmp['temp'];
    		$this->condition_text = strtolower((string)$tmp['text']);
    		$this->condition_code = (int)$tmp['code'];
    		
    		// Прогноз погоды на 5 дней
    		$forecast = array();
    		$tmp = $xml->xpath('/rss/channel/item/yweather:forecast');
    		if($tmp === false) throw new Exception("Error parsing XML.");
    		
    		foreach($tmp as $day) {
    			$this->forecast[] = array(
    				'date' => strtotime((string)$day['date']),
    				'low' => (int)$day['low'],
    				'high' => (int)$day['high'],
    				'text' => (string)$day['text'],
    				'code' => (int)$day['code']
    			);
    		}
    	}
    	
    	public function __toString() {
    		$u = "°".(($this->units == 'c')?'C':'F');
    		return $this->temp.' '.$u.', '.$this->condition_text;
    	}
    }
    
    ?>


    Пример использования:

    <?php
    
    try {
    	$weather = new YahooWeather('RSXX0091');
    } catch(Exception $e) {
    	echo "Caught exception: ".$e->getMessage();
    	exit();
    }
    
    echo '<h1>'.$weather.'</h1>';
    
    echo "<pre>";
    print_r($weather);
    echo "</pre>";
    
    ?>


    Вывод:



    Временные значения восхода и заката солнца (поля sunrise и sunset соответственно) автоматически переводятся в формат unix time. стоит так же обратить внимание на то, что по непонятной причине Yahoo! выдает явно некорректное значение атмосферного давления (0). Но само наличие соответствующего атрибута в XML дает некоторую надежду на то, что рано или поздно экспорт этих данных починят.

    Поле condition_code используется для хранения кодового обозначения погодных условий. Текстовая расшифровка текущего значения хранится в поле condition_text, а полный перечень возможных вариантов приведен в следующей таблице:

    Код Описание
    0 tornado
    1 tropical storm
    2 hurricane
    3 severe thunderstorms
    4 thunderstorms
    5 mixed rain and snow
    6 mixed rain and sleet
    7 mixed snow and sleet
    8 freezing drizzle
    9 drizzle
    10 freezing rain
    11 showers
    12 showers
    13 snow flurries
    14 light snow showers
    15 blowing snow
    16 snow
    17 hail
    18 sleet
    19 dust
    20 foggy
    21 haze
    22 smoky
    23 blustery
    24 windy
    25 cold
    26 cloudy
    27 mostly cloudy (night)
    28 mostly cloudy (day)
    29 partly cloudy (night)
    30 partly cloudy (day)
    31 clear (night)
    32 sunny
    33 fair (night)
    34 fair (day)
    35 mixed rain and hail
    36 hot
    37 isolated thunderstorms
    38 scattered thunderstorms
    39 scattered thunderstorms
    40 scattered showers
    41 heavy snow
    42 scattered snow showers
    43 heavy snow
    44 partly cloudy
    45 thundershowers
    46 snow showers
    47 isolated thundershowers
    3200  not available


    Статья опубликована на блоге paradigm.ru.

    Ссылки по теме



    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 43

      0
      Я помню брал погоду с Gismeteo. Это было очень давно и все было бесплатно. Состовлялся договор об оказнии услуг (все было проделано по факсу) и Гисметео скидывал на фтп сервак файлик с погодой. Но только можно было выбрать 5 городов...
        0
        Очень, надо сказать, ненадёжно работает эта система. Формат файлов может не соблюдаться, или вообще вместо погоды - "погода недоступна для данного города" Ещё раньше по почте высылали по мере обновления - так там вообще ерунду слали, к тому же транспорт ненадёжный.
        0
        Или вот другой сайт, который экспортирует погоду. В базе очень много городов.
          +1
          Вполне успешно пользуюсь accuweather.com. Данные в xml. В их базе есть даже довольно мелкие города.
            0
            иркутска нет
              0
              Кто ищет, тот всегда найдет
              Вообще же, на этом сервисе я смог найти даже город (теперь для него я импортирую данные) в Российской глубинке, численность которого всего 12 тысяч человек.
                0
                Правда, стоит отметить, что погода для таких городов высчитывается несколько другими методами, основываясь на данных близлежащих + поправка на ветер и прочие условия...
                  0
                  Прогноз для любого города делается на основе интерполированных данных. А для России — на основе очень малого количества очень приблизительных данных.
                    0
                    у нас в аэропорту датчик стоит, видимо его показания совпадают с данными на погода.яху.ком
                    0
                    действительно, есть. но в поиске на главной мне его найти не удалось. нужно было набрать Irkutsk, Russia. не очень удобно.
                    0
                    А если я найду? =)
                  0
                  Почему бы с Gismeteo не брать в xml?
                  http://informer.gismeteo.ru/xml/код_города_1.xml
                    0
                    Видимо, зря я туда так давно не заходил. Про сайт Гисметео я в курсе, но мне казалось, что эта услуга стоит денег.
                      0
                      Мне как Флэш разработчику Этот сайт не подходит из-за отсутствия crossdomain.xml (точней он присутствует, но криво). Яху со своей политикой открытости (взять тот-же Яху мапс) очень радует. Еще-бы они косяки и баги поправили, так вообще не нарадоваться.
                        +1
                        Gismeteo в xml выдает прогноз погоды на ближайшие 24 часа. Для публикации на внутреннем сайте экспортирую скриптом на python прогноз на ближайшие 3 дня.
                        Скрипт и описание у меня в блоге http://webveter.blogspot.com/2008/02/gismeteo.html
                        Черновики на пост лежали давно. Но увидел на Хабре и неудержался :)
                        0
                        Для СНГ порекомендую http://weather.co.ua/services/xml/?local… Тоже бесплатно, но как по мне качественее. Потому, что сам смотрю везер.ком, и он частенько привирает...
                          0
                          с weather.co.ua

                          Weather Core Team занимается разработкой алгоритма анализа и генерации прогноза погоды. В команду входят в основном специалисты-статистики и аналитики, желающие помочь нашему проекту. На счету WCT три версии Weather Core Processor – процессора анализа и генерирования прогноза, WPI – Weather Probability Index – индекс вероятности прогноза.
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            Всё хорошо. Однако к Yahoo данный сервис имеет весьма интересное отношение.
                            Внизу страницы читаем все права принадлежат Weather Channel (http://www.weather.com)
                            Там тоже можно зарегистрироваться, получить subscriberId и также получать погоду.
                            по-моему в sim-icq и плагине ForecastFox данные берутся именно таким способом.
                            А так мне кажется стоит информацию относящуюся к одной группе сделать объектом.
                            Например , данные по ветру, данные по атмосфере и т.д.
                              –1
                              gismeteo все выдает в xml
                                0
                                а чего минусовать то?
                                0
                                Не подскажете, где можно найти погоду для небольших населенных пунктов России? Интересуют с Камчатского края - Корф, Вилючинск, Елизово и пр.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  Это мой текст.
                                • НЛО прилетело и опубликовало эту надпись здесь
                                    0
                                    Большое спасибо автору за полезную информацию
                                      0
                                      3,14здит ваш яша....
                                        0
                                        Спасибо, никто не знает, где можно программу ТВ брать?
                                          0
                                          Материал для размышления, однако это однодневный сервис. Т.е я имею в виду то, что тут можно брать прогноз на 1 день, а вот если надо, скажем как на Яндексе, брать на 3-10 дней, это уже проблема. Это касается как и класса Вашего, так и источника данных.
                                            0
                                            ну не правда. вы формат - то смотрели ? прямо в rss и прогноз на 5 дней вперёд

                                            <yweather:forecast day="Tue" date="19 Feb 2008" low="-7" high="-3" text="Snow Showers" code="14" />
                                            <yweather:forecast day="Wed" date="20 Feb 2008" low="-9" high="-5" text="Cloudy" code="26" />
                                            <yweather:forecast day="Thu" date="21 Feb 2008" low="-10" high="0" text="AM Snow Showers" code="14" />
                                            <yweather:forecast day="Fri" date="22 Feb 2008" low="-3" high="1" text="Snow Showers" code="14" />
                                            <yweather:forecast day="Sat" date="23 Feb 2008" low="0" high="3" text="Rain/Snow Showers" code="5" />
                                            0
                                            Может кому полезно будет
                                            картинка с погодой
                                            <a href="http://us.i1.yimg.com/us.yimg.com/i/us/nws/weather/gr/" title="http://us.i1.yimg.com/us.yimg.com/i/us/nws/weather/gr/">http://us.i1.yimg.com/us.yimg.com/i/us/n…</a><code><d|n - дневной или ночной вариант >.png</code>
                                            пример:
                                            <a href="http://us.i1.yimg.com/us.yimg.com/i/us/nws/weather/gr/29d.png" title="http://us.i1.yimg.com/us.yimg.com/i/us/nws/weather/gr/29d.png">http://us.i1.yimg.com/us.yimg.com/i/us/n…</a>
                                            <img src="http://us.i1.yimg.com/us.yimg.com/i/us/nws/weather/gr/29d.png" />
                                              0
                                              Хрень какая-то получилась
                                              картинка с погодой по урл:
                                              us.i1.yimg.com/us.yimg.com/i/us/nws/weather/gr/<d|n - дневной или ночной вариант >.png
                                                0
                                                Дубль три :)

                                                us.i1.yimg.com/us.yimg.com/i/us/nws/weather/gr/{код погоды}{d|n - дневной или ночной вариант}.png
                                              0
                                              зачем тут класс вообще, если всё засунули в конструктор? пользуйтесь main()!
                                                0
                                                И иметь в результате кучу никак не сгруппированных переменных? Я использовал класс только для того, чтобы объединить все данные в одну сущность.
                                                0
                                                А кто подскажет как мне выводить погоду на сайте определяя город посетителя по айпишнику и исходя из этого показывать погоду для его города? Есть ли погодные сайты которые по айпи отдают погоду?
                                                Или надо самому определять город, и уже исходя из города вытягивать погоду?
                                                  0
                                                  Нужно определять самому. Ключевое слово для поиска - geoip. http://b23.ru/3nr
                                                  0
                                                  чёрт. А что у них теперь только на два дня погоду получить можно? Это очень неудобно хотябы тем, что клиент хочет на пять дней, и старые клиенты хотят чтоб было пять дней. А как им объяснить что нет больше пят дней
                                                    0
                                                    • НЛО прилетело и опубликовало эту надпись здесь

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

                                                      Самое читаемое