Reporte del Clima en PHP

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.

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

$code = “PEXX0011”;
$path = “http://weather.yahooapis.com/forecastrss?u=c&p=”;

$feed = new SimplePie();
$feed->set_feed_url($path.$code);
$feed->set_item_class(‘SimplePie_Item_YWeather’);
$feed->init();

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

$weather = $feed->get_item(0);
$fore = $weather->get_forecasts();
$unit = $weather->get_units_temp();
$ampm = “n”; // indica noche
$icon = $weather->get_condition_code();
// Calculamos la hora de Lima en minutos
$curday = 2*60 + time2minuts(date(“g:i a”));
$iniday = time2minuts($weather->get_sunrise());
$endday = time2minuts($weather->get_sunset());

if ($curday > $iniday && $curday < $endday ) { $ampm = "d"; // indica dia } [/php]Luego mostramos estos resultados en nuestro HTML, esto lo hacemos de la siguiente forma:[html]

‘)”>

get_temperature(); ?>°
get_low().”°”.$unit; ?> – get_high().”°”.$unit; ?>
get_city().”, “.$weather->get_country(); ?>

[/html]

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.

Comentarios Total 86 comentarios


Fernando
Publicado: 24/11/2009 12:46 am

Me he dado cuenta en este http://www.philjobspot.com sitio web que tienen un código de fuente diferente en comparación con el tutorial de esta página. Están utilizando http://weather.yahooapis.com/forecastrss?u=c&w = en lugar de http://weather.yahooapis.com/forecastrss?u=c&p = (Comunicación de la categoría P y W). Y diferente formato de código de la ciudad.

Victoria
Publicado: 14/12/2009 8:41 pm

Hola. Necesito el componente .fla que en su momento estaba publicado en http://www.flashcenter.com.ar/. Hoy, esta URL redirige a un sitio que aparentemente está en construcción y ya no encuentro el archivo. Si alguien sabe donde puedo encontrarlo se lo agradezco. Saludos, Victoria

nombrelol
Publicado: 21/01/2010 8:33 pm

Dude, is there a way to show forecasts for few days in a row (e.g. today(Monday), Tuesday, Wednesday etc. ?) ? :O
And, maybe someone has already mentioned it above (my Spanish < 0), how to get this city code by any other way ?

Gío
Publicado: 26/01/2010 6:40 pm

Exelente información, solo tengo un detalle, mi variable $path=”http://weather.yahooapis.com/forecastrss?p=MXHO0590&u=c” no me manda la temperatura en ºC, sino en ºF, que pasa? si se supone que u=c? Help me please.

Gío
Publicado: 26/01/2010 6:42 pm

AH! y que digo excelente información, es un super aporte, gracias por que en verdad me sacaron del hoyo en mi proyecto escolar. =)

mariana
Publicado: 05/02/2010 4:45 pm

Me pasa lo mismo con lode los C y F. Puse el feed con u=c y me devuelve la temperatura en ºf

Diego
Publicado: 19/02/2010 11:48 am

hola que tal he subido su aplicacion que no se ve:

http://www.chorro.com.mx/weather2/weather/

Y lo que pasa es que parece que no puede generar el archivo que manda a llamar desde yahoo en la carpeta de cache.

Que permisos le tenga que dar a esta carpeta que ya use todos, y saber si tambien le tengo que dar permisos a los archivos .inc

Mauricio
Publicado: 26/02/2010 2:00 pm

El Script esta genial pero tengo una duda con respecto a el horario para que las imagenes ( iconos) se despliegen correctamente
Mi servidor tiene la hora Central de USA ahorita son las 12:56PM, y ahorita se despliega la luna, la hora de salida de el sol es 6:59 AM en el script tiene
function time2minuts($time) {
$minuts = 0;
$atime = explode(” “, $time);
if (strtolower($atime[1]) == “pm”) {
$minuts = 12*60;
}
$ttime = explode(“:”, $atime[0]);
$minuts = $minuts + (int)$ttime[0]*60 + (int)$ttime[1];
return $minuts;
}
$curday = 2*60 + time2minuts(date(“g:i a”));
$iniday = time2minuts($weather->get_sunrise());
$endday = time2minuts($weather->get_sunset());

if ($curday > $iniday && $curday < $endday ) {
$ampm = "d";
}

Gracias

The Cat
Publicado: 28/02/2010 7:31 am

Hola!

Muchas gracias por el script, funciona a la perfección.

Con la función get_forecasts(); nos devuelve la predicción del día siguiente. Cómo se podría obtener la predicción de los siguientes 5 días, por ejemplo?

Muchas gracias.

German
Publicado: 08/04/2010 12:36 am

hola, hay alguna manera de mostrar los días siguientes tal como se ve en la web de Yahoo! http://ar.weather.yahoo.com/argentina/c%C3%B3rdoba/c%C3%B3rdoba-466861/;_ylt=AnArGoXuzLaFipbw.oD0eFPidXp8 si elegimos una ciudad?
muchas gracias por todo

Jhonny
Publicado: 08/04/2010 4:05 pm

Hola, está excelente el codigo, pero una pregunta, si quiero personalizar las imagenes, como le hago ??

Tornado
Publicado: 12/05/2010 4:14 am

Hola, buenas.

Me aparece el siguiente error:

Fatal error: Call to a member function on a non-object in /www/youservername/test/weather/index.php on line 25

Lamentablemente no poseo demasiados conocimientos de php, motivo por el que agradecería mucho su ayuda.

Tornado
Publicado: 25/05/2010 2:01 pm

Bueno, problema solucionado: Para todos los que tengan el mismo problema, se debe a que necesitan instalar en su servidor PHP 5.x. Cualquier versión más antigua genererá el problema antes mencionado

Carlos
Publicado: 15/07/2010 11:43 am

Excelente aplicación solo que me manda en °F, como lo cambio a °c… URGENTE y gracias

unijimpe
Publicado: 15/07/2010 10:37 pm

Hola Carlos, según parece el servicio ha cambiado y solo devuelve los valores en Grados Farenheit, para convertir estos valos a grados Celsius puede utilizar la formula de conversión, que la puedes encontrar en http://es.wikipedia.org/wiki/Grado_Celsius.

Con ello puedes escribir una función en PHP para convertir estas unidades mediante:

function f2c($f) {
$c = ($f-32)/1.8;
return $c;
}

emerson
Publicado: 26/08/2010 2:12 pm

que tal amigos, excelente tutorial… hasta q me topé cn q no me funciona… ya tengo en el server las clases, los archivos, conexión a internet (muy importante) pero… el array resultado, lo devuelve vacío… al imprimirlo, en parte del array me arroja: “[data] => Yahoo! Weather – Error”, y “Invalid Input /forecastrss?p%3DPMXX0004”.

Este es el URL que estoy usando:”[feed_url] => http://weather.yahooapis.com/forecastrss?p%3DPMXX0004“.

Alguna sugerencia o idea de qué puedo estar haciendo mal? Gracias de antemano.

J
Publicado: 24/12/2010 12:46 pm

hola esta excelente el script, sin embargo tengo un problema, no se si sea un bug o algo que estoy haciendo mal, en el $path puse el codigo de la ciudad como mencionas pero la temperatura no se muestra en °C solo en °F y lo necesito en °C, cual es el problema mi path queda asi:

$path = “http://weather.yahooapis.com/forecastrss?p=MXYN0117&u=c”;

gracias por la ayuda, saludos.

Luke
Publicado: 14/01/2011 3:53 pm

Hola a todos, yo también en el servidor (con PHP 4.4.2) siempre tengo este mensaje de error: “Fatal error: Call to a member function on a non-object in /~/www/simplymeteo.eu.pn/weather/index.php on line 25”, mientras localmente no hay ningún problema.
Si configuro PHP 5.3.1 en el servidor el navegador informa de un “Error de servidor”. ¿Cómo puedo solucionar esto? Muchissimas gracias!

Alex
Publicado: 15/01/2011 3:55 am

Hola,
en weather.yahoo.com ya no se muestra el código de la ciudad en la url. Cómo se puede de averiguar?

Alex
Publicado: 15/01/2011 4:14 am

Bueno, ya lo he averiguado. Como se indica, vas a weather.yahoo.com y pones tu ciudad. En la URL obtendrás un códido numérico (que no es el que se necesita en este script). Este código numérico lo pones en este link:
http://weather.yahooapis.com/forecastrss?w=342553 y allí verás el código (números y letras) de ciudad que sí se necesita para que funcione el script.

Marinha
Publicado: 01/03/2011 1:21 pm

Buenas, el script funciona muy bien, pero no sé cómo o dónde poner la función php para convertir los grados F en C.

Alguien me lo explica?

Gracias!

Marinha
Publicado: 03/03/2011 10:49 am

Lo logré, la dirección del rss es con la c, entonces, la función que usé fue

function f2c($c) {
$c = ($c-32)/1.8;
return $c;
}

no se mucho de php, quizás es una burrada, pero por ahora me funciona…

Muy buen script!

Pablo
Publicado: 10/05/2011 8:37 am

Buenos dias, tengo un problema con el script que no he podido solucionar, tengo php 5.3 instalado en el servidor y me larga Fatal error: Call to a member function get_forecasts() on a non-object in ../weather/index.php on line 25
lo raro es que no lo hace siempre, se ve que bajo determinadas circunstancias lo hace, si alguien tuvo un problema parecido me podria dar una mano para solucionarlo, muchas gracias

Free
Publicado: 29/08/2011 1:37 pm

Muy util el blog!! .. sigue adelante … probando!

Free
Publicado: 29/08/2011 1:48 pm

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

Ese codogo me arroja por favor ayudenme.. lei los comentarios anteriores de como solucionarlo.. pero no los veo muy claros donde se debe crear la carpeta “tmp” y si esque se debe cambiar algo en los archivos al crear dicha carpeta como dijo unijimpe .. o si hay otra solucion bienvenida sea! Gracias

Javier
Publicado: 14/11/2011 9:44 am

Hola. ¿Alguno ha podido conseguir mostrar más de 1 día de pronóstico extendido? (digo ‘1’ porque la función ‘get_forecasts()’ brinda el día actual y el siguiente). Saludos, excelente el script y gracias desde ya.

Javier
Publicado: 14/11/2011 3:07 pm

Hola de nuevo. He podido conseguir el pronóstico extendido a 5 días. Hay que hacer un este cambio:

## primero que nada, seguramente tendrán que investigar para cada ciudad en particular por lo siguiente: hay que cambiar ‘$path = “http://weather.yahooapis.com/forecastrss?u=c&p=”;’ (+ el código específico) por ‘$otro_path = “http://xml.weather.yahoo.com/forecastrss/”.$code.”_c.xml”;’. De esta manera presenta en forma extendida a 5 días el clima.

# Si quieren que aparezcan imágenes referidas al clima, tienen que agregar la línea get_image().”‘ />. Pero si quieren que aparezcan imágenes propias, creen esas imágenes con los nombres de los códigos de la condición del clima (ej: el 32 corresponde a ‘Soleado’) y llámenlas de esta forma: get_code().”.png’ />. Saludos.

Per2Manga
Publicado: 26/03/2012 10:59 am

Me funciona de maravilla, gracias por el tutorial

raikkonen
Publicado: 14/05/2012 3:31 am

una pregunta, alguien sabe como obtener misma aplicación pero con la opción de elegir el codigo postal o ciudad.
Saludos…

emmanuel
Publicado: 06/07/2012 8:16 pm

como se el código para mi región, por ejemplo este es el del ejemplo de Lima PEXX0011, cual es el de mexico y sus estados de antemano muchas gracias.

jrondon
Publicado: 14/07/2012 9:25 pm

Viejo no me funcionar lo baje a la compuradora pero me sale mucho error eso sera porque… me podria ayudar… este es mi correo para ver si alguien me ayuda uruvenz78@hotmail.com

fif0
Publicado: 28/08/2012 3:23 pm

Hola, me sirve mucho la API pero aun no la puedo aplicar ya que no encuentro los archivos simplepie.inc y simplepie_yahoo_weather.inc se tienen que crear o algo? agradeceria su ayuda

Saludos

Gerardo
Publicado: 28/08/2012 4:12 pm

Se podrá agregar el pronostico para los días que siguen?

zinwww
Publicado: 11/01/2013 11:19 am

YO TENGO ESTE ERROR

( ! ) SCREAM: Error suppression ignored for
( ! ) Deprecated: Assigning the return value of new by reference is deprecated in C:\wamp\www\weather\simplepie.inc on line 716

y asi repetitivamente linea tras linea.

no se si es porque lo estoy cargando con WAMP no creo que ese sea el problema.

si me pueden ayudar se los agradeceria mucho :)

zinwww
Publicado: 11/01/2013 11:21 am

SE ME OLVIDO DECIR.

Al final si se muestra el clima y todo bien el problema es ese que me lo muestra todo el codigo de error arriba pero SI LO MUESTRA AL FINAL.

HELP!

Kevin
Publicado: 17/01/2013 8:16 pm

Buen dia a todos. para arreglar el problema de la luna en el dia. deben modificar el siguiente valor.
$curday = 2*60 + time2minuts(date(“g:i a”)); donde el 2 es la hora GTM de su ciudad. por ejemplo: mi servidor esta alojado en mexico y yo en lugar del dos escribi -6 ya que es la hora GTM de Mexico centro.

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)