Reporte del Clima en PHP

  • 05/10/2008
  • 9:57 pm
  • unijimpe

El servicio de Yahoo para el Clima Yahoo Weather tiene un API mediante el cual se puede consultar el estado del clima y devuelve los resultados en formato RSS (Yahoo! Weather RSS feed). Entonces basado en esta información crearemos un reporte del clima personalizado.

Obteniendo el RSS
Lo primero es obtener el URL con el RSS de acuerdo a la ciudad para la que deseamos consultar el clima, para ello ingresamos a Yahoo Weather, buscamos la ciudad deseada y observamos en la barra de direcciones el código de la ciudad. Por ejemplo si buscamos lima la ruta sería de la forma:

  1. http://weather.yahoo.com/forecast/PEXX0011.html

Luego, el código de la ciudad es PEXX0011, luego de acuerdo a las especificaciones del API, el URL del RSS sería de la forma:

  1. http://weather.yahooapis.com/forecastrss?u=c&p=PEXX0011

Utilizando SimplePie
Ahora que tenemos la información en RSS, utilizaremos SimplePie para interpretar los datos, adicionalmente utilizaremos un plugin para SimplePie llamado Yahoo! Weather el cual nos permite tener métodos para obtener los detalles del clima proveídos por Yahoo.

Entonces utilizando estos nuevos métodos obtenemos fácilmente los datos del clima directamente para nuestra aplicación. Lo primero es crear una nueva instancia del Feed y tomar el primer item que contiene los datos del clima.

  1. require("simplepie.inc");
  2. require("simplepie_yahoo_weather.inc");
  3.  
  4. $code = "PEXX0011";
  5. $path = "http://weather.yahooapis.com/forecastrss?u=c&p=";
  6. $feed = new SimplePie();
  7. $feed->set_feed_url($path.$code);
  8. $feed->set_item_class('SimplePie_Item_YWeather');
  9. $feed->init();
  10. $weather = $feed->get_item(0);

Luego de ello en la variable $weather, tenemos los datos necesarios, los cuales vamos a imprimir en nuestro html como en el siguiente código, en donde get_condition_image obtiene la imagen del clima y get_temperature la temperatura actual.

  1. <h3>Condiciones para: <?php echo $weather->get_city().; ?></h3>
  2. <img src="<?php echo $weather->get_condition_image(); ?>">
  3. <ul>
  4.     <li>Condicion: <?php echo $weather->get_condition(); ?></li>
  5.     <li>Temp: <?php echo $weather->get_temperature(); ?>°C</li>
  6.     <li>Humedad: <?php echo $weather->get_humidity(); ?>%</li>
  7.     <li>Rising: <?php echo $weather->get_rising(); ?>%</li>
  8.     <li>Sunrise: <?php echo $weather->get_sunrise(); ?></li>
  9.     <li>Sunset: <?php echo $weather->get_sunset(); ?></li>
  10. </ul>

Uniendo estos dos elementos y una pequeña hoja de estilos podemos obtener nuestra primera versión del pronostico del tiempo el cual pueden ver en: weather/basic.php.

Personalizando el Reporte del Clima
En el caso anterior, solo depende de nuestra creatividad para mostrar los datos del clima, en nuestro caso vamos a mostrar los datos del clima utilizando los iconos de acuerdo a la hora del día o la noche, para ello hacemos los cálculos necesarios para obtener el valor del día o la noche.

  1. require("simplepie.inc");
  2. require("simplepie_yahoo_weather.inc");
  3.  
  4. $code = "PEXX0011";
  5. $path = "http://weather.yahooapis.com/forecastrss?u=c&p=";
  6.  
  7. $feed = new SimplePie();
  8. $feed->set_feed_url($path.$code);
  9. $feed->set_item_class('SimplePie_Item_YWeather');
  10. $feed->init();
  11.  
  12. function time2minuts($time) {
  13.     $minuts = 0;
  14.     $atime = explode(" ", $time);
  15.     if (strtolower($atime[1]) == "pm") {
  16.         $minuts = 12*60;
  17.     }
  18.     $ttime = explode(":", $atime[0]);
  19.     $minuts = $minuts + (int)$ttime[0]*60 + (int)$ttime[1];
  20.     return $minuts;
  21. }
  22.  
  23. $weather = $feed->get_item(0);
  24. $fore = $weather->get_forecasts();
  25. $unit = $weather->get_units_temp();
  26. $ampm = "n"// indica noche
  27. $icon = $weather->get_condition_code();
  28. // Calculamos la hora de Lima en minutos
  29. $curday = 2*60 + time2minuts(date("g:i a"));
  30. $iniday = time2minuts($weather->get_sunrise());
  31. $endday = time2minuts($weather->get_sunset());
  32.  
  33. if ($curday> $iniday && $curday <$endday ) {
  34.     $ampm = "d"; // indica dia
  35. }

Luego mostramos estos resultados en nuestro HTML, esto lo hacemos de la siguiente forma:

  1. <div id="weather" style="background:url('icon<?php echo $ampm; ?>.png')">
  2.     <div id="current" style="background:url('http://l.yimg.com/us.yimg.com/i/us/nws/weather/gr/<?php echo $icon.$ampm.".png"; ?>')">
  3.         <div id="temp"><?php echo $weather->get_temperature(); ?>&deg;<?php echo $unit; ?></div>
  4.         <div id="fore"><?php echo $fore[0]->get_low()."&deg;".$unit; ?> - <?php echo $fore[0]->get_high()."&deg;".$unit; ?></div>
  5.         <div id="city"><?php echo $weather->get_city().", ".$weather->get_country(); ?></div>
  6.     </div>
  7. </div>

Con lo cual obtenemos el resultado mostrado en weather/index.php en donde mostramos el icono del estado del clima de acuerdo a la hora del día, además de muestra la temperatura actual y el máximo y mínimo.

Posts Relacionados

Total de Comentarios: 39

Publicidad
06/10/2008
2:17 pm

Buenísimo, muchas gracias. Hace tiempo que me había elaborado un decodificador de METAR para mostrar el clima, pero esta está mucho mejor.

07/10/2008
12:18 pm

Muy buen tutorial :) Yo ya había hecho una clase que hacía esto mismo, hasta la había publicado en mi blog xD http://turl.bloglivers.com/2008/07/03/weatherfetcher-el-clima-en-php/
Lo único era que le faltaba mostrar el clima de alguna forma, tu lo haz terminado muy bien con ese HTML y la imagen ;)

Un Saludo!

11/10/2008
5:58 am

Buenísima aplicación, muchas gracias.
Un cordial saludo desde Galicia, España ;)

14/10/2008
3:49 am

gran aporte, gracias

21/10/2008
10:03 am

El script esta perfecto. Muy bueno pero tiene un problema.

El tema de yahoo el id del pais.

Estaria bueno conseguir dependiendo de la ip de la visita la ubicacion del pais .

No se si existe en las apis de yahoo para determinar el id del pais .

Saludos y muy buen script

Ana
21/10/2008
5:19 pm

La verdad que te pasaste!!! Necesito un favor: como se modificaria el codigo para que las imagenes de noche y dia se modifiquen segun la hora de córdoba, argentina? Perdon mi ignorancia…Gracias! Saludos!

21/10/2008
5:27 pm

woo que padre tutorial, lo antes posible lo voy a provar para poderlo implementar

Jonathan
25/10/2008
1:04 am

Muchas gracias por compartir tus conocimientos, muy bueno el tutorial y la implementacion de las librerias.

Tengo una duda con respecto a la transparencia de las imagenes de los resultados del clima en internet explorer 6… ¿Se podrá solucionar? La verdad es que no conozco mucho de php, ojala me puedas orientar para resolverlo.

Saludos!

JRC.

27/10/2008
10:11 pm

Hola, respecto a los PNGs tranparentes en IE6 puedes leer la forma de resolverlo en: http://blog.unijimpe.net/png-fix-para-ie6/

Miguel
03/11/2008
9:43 pm

Gran Tutorial. Sólo quiero saber cómo este sitio http://www.philtvguide.com poder llevar a cabo múltiples varias ciudades en una página (www.philtvguide.com/philippines-weather/)

Matías
25/11/2008
4:56 pm

Hola, pusé el código en una web con algunas variaciones del tamaña de las imágenes, se bien en Firefox-Opera pero en IE6 no se ve. ¿cual puede ser el problema?
En http://www.ilovelasgrutas.com.ar lo puedes ver.
Muy buenos y útiles tus aportes.
De antemano, muchas gracias.

25/01/2009
10:26 pm

muchas gracias por el codigo, la verdad que me resulto super util para no tener que depender de un plugin para hacer esto :D

Enoel
14/02/2009
2:35 pm

Me hace falta k si puedes me mandes el codigo completo a mi direccion de correo k me hace falta para un trabajo…gracias.

Enoel
14/02/2009
2:36 pm

la direccion es eramirezr@estudiantes.uci.cu

14/02/2009
10:22 pm

La ruta completa del script final para descargar esta al final del post y si no la ubicas te dejo la ruta para que descargues los archivos fuente.

http://www.box.net/shared/pn9z58z518

Enoel
15/02/2009
1:09 am

Ayuda:
cuando baje el paquete me dio este error, favor de ayudarme…..
‘Call to a member function get_forecasts() on a non-object in C:\wamp\www\weather\index.php on line 25′

Enoel
16/02/2009
3:07 pm

el error k me da es de k me dice k la variable $weather no es un objeto y por lo tanto me da error en cada llamada a los metodos de la clase…favor de ayudarme…….

Rodrigo
24/02/2009
1:29 pm

Yo tengo el mismo problema Enoel, ya lograste solucionarlo??? o alguien que pueda ayudarnos???

Gracias !

26/02/2009
1:48 pm

Esta excelente el codigo!!

Sobre la pregunta de Miguel:
Pega esta parte del codigo dentro tu

require(”simplepie.inc”);
require(”simplepie_yahoo_weather.inc”);

Luego podras usar cuantos quieras.

Ese codigo es la conexion con el sistema, lo pones una vez nada mas.
Si pones mas de una vez no funciona.

Saludos, espero haberte ayudado

Enoel
02/03/2009
1:44 pm

Rodrigo todavia no he podido dar con el error, si lo solucionas publicalo

MauricioRa
03/03/2009
1:33 pm

Hola esta buenisimo, pero tengo algunas dudas, quisiera saber si puedo obtener tambien la hora. ademas de como puedo ver los codigos de la ciudad. yo soy de Colombia-Bogotá.

Gracias por la ayuda.

Matias
03/03/2009
3:59 pm

Es un golazo este artículo. Alguien sabe de dónde puedo obtener un tutorial parecido para hacer una implementación como esta sin usar PHP, o bien, utilizando ASP?

Muy agradecido!

03/03/2009
11:45 pm

Mauricio, como se explica en el post, para encontrar el código debes entrar a http://weather.yahoo.com buscas la ciudad de tu elección y luego te fijas en el URL que contendrá el código de la ciudad, en tu caso para Bogotá el código es: COXX0004

14/03/2009
11:54 am

Oye una excelente herramienta solo que tengo una duda ta coloque el archivo pero cada cuando se vuelve a cargar la informacion del clima, o no se si tenga que modificar algo para que cambie el clima cada 10 minutos.

Si lo hace bien cuando cambie de dia a noche pero cuando toma una temperatura cuando abras la pagina, se queda con esa todo el dia.

Lo resolvi borrando el cache pero no se si exista una forma de hacerlo sin borrar el cache.

Espero una pronta respuesta de tu parte.

SALUDOS

DIEGO

14/03/2009
12:17 pm

Oye una duda que es lo que pasa, aunque es de dia me esta marcando ahora que el icono de noche, de hecho tambien se ve en tu ejemplo.

Diego
14/03/2009
12:39 pm

Nuevamente yo antes funcionaba bien pero ahora aparte de lo que te escribi anteriormente me manda este error:

Warning: ./cache/eaa6ab0e8c97bbc9d6e57001b46a6900.spc is not writeable in /home/produccio7/domains/produccionesbajio.com/public_html/weather/simplepie.inc on line 1769

Dani
27/03/2009
8:32 am

Y es posible sacar los datos de la predicción, estoy probando con la clase SimplePie_YWeather_Forecast pero no se exactamente como decirle el núemro de dias o la fecha de la que quiero la predicción.

Dani
27/03/2009
10:18 am

Me contesto a mi mismo, por defecto te pasa también el dato del día siguiente y lo guarda en el $fore[1] lógicamente

$fore[1]->get_low()
$fore[1]->get_code()
….

10/04/2009
3:45 pm

Hola, tuve algunos problemas para calcular la hora de Argentina, el script que uso es el mismo, como lo logro? Ya que cuando son las 5 de la tarde en argentina aparece la luna, muchas gracias.
http://realidadweb.com.ar/clima.php

10/04/2009
4:18 pm

El problema es que el servidor donde tienes alojado tu aplicación debe tener otra hora como ocurrio en mi caso, es por ello que le aumente dos horas es mi script:

$curday = 2*60 + time2minuts(date(”g:i a”));

Puedes modificar el valor que le sumas a la hora calculada (2*60) hasta lograr la hora correcta para tu ciudad.

18/04/2009
10:49 pm

No investigue mucho el codigo pero si eliminas la llamada a la funcion time2minuts cambia el icono del sol a la luna, ahora son las 00:47 en Agentina y me aparecia el sol, asique tome el valor directo de weather y cambio a la luna, no se que pasara mañana =) en principio funcionó.
las variables quedarian asi
$iniday = $weather->get_sunrise();
$endday = $weather->get_sunset();

abrazos

14/05/2009
8:58 pm

ge-nial!

me has salvado la vida! ^^

funciona perfecto!.. btw, realice el cambio de calculo de hora, porque mi servidor es argentino, y mi página es méxicana..

saludetes!

Runy
08/06/2009
5:47 am

a mi tambien me sale el mismo Warning que Diego.

Warning: ./cache/eaa6ab0e8c97bbc9d6e57001b46a6900.spc is not writeable

Como puedo quitarlo?

Gracias

Esteban
08/06/2009
11:16 am

BARBAROOO ya lo aplicare. en varios sites. y funca de maravillas…
consulta.. en http://www.flashcenter.com.ar/ baje Widget de Clima en flash que funciona.. casi de la misma manera pero en flash.. por alguna caracteristica del server no funca en el mio . testee configuraciones etc.. me encantaria si alguin sabe como modificar el anterior o adapptar este para que levante los datos desde el flash ya que se me complico conis conocimientos.!! saludos gente. abrazo Esteba

14/06/2009
10:13 am

How to put more than one city/place on same page like http://www.philtvguide.com/philippines-weather/ ?

Thanks for a great script :-)

14/06/2009
10:16 am

When try with two cities/places I got following error:

Fatal error: Cannot redeclare time2minuts() (previously declared in /mounted-storage/………

Someone have any ideas to get around this ?
Thanks :-)

14/06/2009
10:35 am

Hola Kim, lo que pasa que has copiado todo el código nuevamente, entonces como la función time2minuts esta declarada al inicio te genera un error. Entonces solo copia el código sin incluir la función time2minuts.

Locomalo
05/07/2009
3:37 pm

Hola a los que le da el error Warning: ./cache/eaa6ab0e8c97bbc9d6e57001b46a6900.spc is not writeable

Tienen 2 opciones:
Poner la carpeta cache en el mismo lugar que el archivo .inc.
O si no desabilitar la cache

$feed->enable_cache(false);

Un saludo.

Baku
07/07/2009
2:11 am

Hola, a los que tienen error de las 12 am a la 1 am y les pone solecito lo que hice fue modificar la funcion time2minuts para que verificara si era entre las 12 y 1 para que no me sumara 12 horas a los minutos y quedaria asi:

function time2minuts($time) {
$minuts = 0;
$atime = explode(” “, $time);
if (strtolower($atime[1]) == “pm”) {
$minuts = 12*60;
}
$ttime = explode(”:”, $atime[0]);

if(($ttime[0] == 12) && $atime[1] == “am”)
{
$minuts = $minuts + (int)$ttime[1];
}
else
{
$minuts = $minuts + (int)$ttime[0]*60 + (int)$ttime[1];
}
return $minuts;
}

Enviar Comentario

(*)

(*)