:::: MENU ::::

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:

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:

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.

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();
$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.

<h3>Condiciones para: <?php echo $weather->get_city().; ?></h3>
<img src="<?php echo $weather->get_condition_image(); ?>">
<ul>
	<li>Condicion: <?php echo $weather->get_condition(); ?></li>
	<li>Temp: <?php echo $weather->get_temperature(); ?>°C</li>
	<li>Humedad: <?php echo $weather->get_humidity(); ?>%</li>
	<li>Rising: <?php echo $weather->get_rising(); ?>%</li>
	<li>Sunrise: <?php echo $weather->get_sunrise(); ?></li>
	<li>Sunset: <?php echo $weather->get_sunset(); ?></li>
</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
} 

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

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


86 Comentarios

  • Victoria |

    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 |

    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 |

    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 |

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

  • Diego |

    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 |

    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 |

    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.

  • Jhonny |

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

  • Tornado |

    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 |

    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 |

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

  • unijimpe |

    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 |

    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 |

    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 |

    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 |

    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 |

    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 |

    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 |

    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 |

    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 |

    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 |

    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 |

    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.

  • raikkonen |

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

  • emmanuel |

    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 |

    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 |

    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

  • zinwww |

    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 |

    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 |

    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.

Publica tu comentario

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;.