Radar de precipitación
Autoconstrucción de GIF de manera dinámica mediante imágenes estáticas descargadas de direcciones dependientes de la hora.
Script que recoge una imagen cada media hora (establecido por cron) de la agencia nacional de meteorología (aemet.es) y las va solapando creando una animación gif. Ejemplos a continuación (radar actual).
Radar de precipitaciones de la península ibérica (ult. 12hr):

Radar de precipitaciones de la zona centro, - Madrid, Castilla - León, Castilla - La Mancha, Extremadura - (ult. 4hr):

Descargar código fuente: radar.zip.
España:
<?php
/* ###########################
### Definimos Variables ###
########################### */
// debug?
$debg = 0;
// Número de marcos que tendrá la animación
$seq = 25;
// Centésimas de segundo que se estancará el primer marco
$pprim = 100;
// Centésimas de segundo entre marco y marco
$vel = 10;
// Centésimas de segundo que se estancará el último marco
$pseg = 200;
// Anchura de la imagen
$ancho = 500;
// Altura de la imagen
$alto = 500;
// Ruta absoluta de los marcos
$ruta_abs = "/ruta/a/radar/spain/temp/";
// Ruta absoluta del gif final
$ruta_abs2 = "/ruta/a/radar/spain/";
function check_if_equal($image1,$image2) {
if (md5(file_get_contents($image1)) == md5(file_get_contents($image2)))
{
$return = TRUE;
} else {
$return = FALSE;
}
return $return;
}
if ($debug ==0) $quiet = " -q";
if ($debg == 1) print "Time for fetching: $hora:$minuto (GMT) \nFile fetched: r99g".$hora.$minuto.".gif \n";
// URL de cada imagen para convertirla en marco
$fuente = "http://www.meteosat.com/imagenes/radar/sp/radarultima.gif";
$actual_temp = $ruta_abs . "actual.gif";
exec("wget $fuente$quiet -O $actual_temp");
if (($ancho == "auto") or ($alto == "auto")) {
$datos_img = getimagesize($actual_temp);
if ($ancho == "auto") {
$ancho = $datos_img[0];
}
if ($alto == "auto") {
$alto = $datos_img[1];
}
}
if ($debg == 1) print "Checking for files' existence";
for ($i = 1; $i <= $seq; $i++) {
if ($debg == 1) print ".";
if (!file_exists($ruta_abs.$i.".gif")) {
$last_one = $i-1;
$allfilesexist=0;
if (check_if_equal($actual_temp,$ruta_abs . $last_one . ".gif") == TRUE) $no_new_image = 1;
break;
} else {
$allfilesexist=1;
}
}
if ($allfilesexist == 1)
{
if (check_if_equal($actual_temp,$ruta_abs . $seq . ".gif") == TRUE) $no_new_image = 1;
}
if ($debg == 1) print " Done.\n\n";
if ($no_new_image != 1)
{
if ($last_one == "0") {
if ($debg == 1) print "No files present. Starting new gif (1 frame = static gif). \n\n";
exec("wget $fuente$quiet -O $ruta_abs" . "1.gif");
exec("wget $fuente$quiet -O $ruta_abs2" . "radar.gif");
} elseif (($last_one != $seq) && ($allfilesexist == 0)) {
if ($last_one+1 != $seq) {
if ($debg == 1) print ($seq - $last_one) . " frames still missing (from " . ($last_one+1) . ".gif to $seq.gif). \n\n";
} else {
if ($debg == 1) print "1 frame still missing ($seq.gif). \n";
}
if ($debg == 1) print "Creating " . ($last_one+1) . ".gif. \n\n";
exec("wget $fuente$quiet -O $ruta_abs" . ($last_one+1) . ".gif");
$seq = $last_one+1;
} elseif ($allfilesexist == 1) {
if ($debg == 1) print "All files present.\nUpdating sequence:\n";
// Reordenamos la secuencia
for ($i = 1; $i <= ($seq-1); $i++) {
if ($debg == 1) print "renaming $ruta_abs" . ($i+1) . ".gif to ".$ruta_abs . $i . ".gif \n";
rename( $ruta_abs . ($i+1) . ".gif" , $ruta_abs . $i . ".gif");
}
if ($debg == 1) print "Downloading latest and saving as $seq.gif \n";
exec("wget $fuente$quiet -O $ruta_abs" . $seq . ".gif");
}
// Creamos la sintaxis de la secuencia de fotogramas (del segundo al penúltimo)
for ($i = 2; $i <= ($seq-1); $i++) {
$interm = $interm . $ruta_abs . $i . ".gif ";
}
if ($last_one != "0") {
// Ejecutamos ImageMagick (en consola) para crear la secuencia
if ($debg == 1) print "Making gif! (".$ruta_abs2."radar.gif)\n
Animation frames\t$seq
Image width\t\t$ancho
Image height\t\t$alto
Animation speed\t\t$vel ms/frame
1st frame delay\t\t$pprim ms
last frame delay\t$pseg ms
Frames path\t\t$ruta_abs
Gif path\t\t$ruta_abs2
Latest frame\t\t$fuente\n\n";
exec("convert -delay " . $pprim . " -size " . $ancho . "x" . $alto . " " . $ruta_abs . "1.gif -delay " . $vel . " " . $interm . "-delay " . $pseg . " " . $ruta_abs . $seq . ".gif -loop 0 " . $ruta_abs2 . "radar.gif");
}
}
?>Madrid:
<?php
/* ###########################
### Definimos Variables ###
########################### */
// debug?
$debg = 0;
// Número de marcos que tendrá la animación
$seq = 25;
// Centésimas de segundo que se estancará el primer marco
$pprim = 100;
// Centésimas de segundo entre marco y marco
$vel = 10;
// Centésimas de segundo que se estancará el último marco
$pseg = 200;
// Anchura de la imagen
$ancho = auto;
// Altura de la imagen
$alto = auto;
// Ruta absoluta de los marcos
$ruta_abs = "/ruta/a/radar/mad_radar/temp/";
// Ruta absoluta del gif final
$ruta_abs2 = "/ruta/a/radar/mad_radar/";
date_default_timezone_set(GMT);
if ($debg == 1) print "Actual Server Time: ".date('Hi')." (GMT) \n";
$round_numerator = 60 * 10;
$rounded_time = ( floor ( (time() - (20 * 60)) / $round_numerator ) * $round_numerator );
$hora = date('Hi',$rounded_time);
if ($debg == 1) print "Time for fetching: $hora (GMT) \nFile fetched: r8ma".$hora.".gif \n";
// URL de cada imagen para convertirla en marco
$fuente = "http://www.aemet.es/imagenes_d/eltiempo/observacion/radar/r8ma".$hora.".gif";
if ($debug ==0) $quiet = " -q";
if ($debg == 1) print "Checking for files' existence";
for ($i = 1; $i <= $seq; $i++) {
if ($debg == 1) print ".";
if (!file_exists($ruta_abs.$i.".gif")) {
$last_one = $i-1;
$allfilesexists=0;
break;
} else {
$allfilesexists=1;
}
}
if ($debg == 1) print " Done.\n\n";
if ($last_one == "0") {
if ($debg == 1) print "No files present. Starting new gif (1 frame = static gif). \n\n";
exec("wget $fuente$quiet -O $ruta_abs" . "1.gif");
exec("wget $fuente$quiet -O $ruta_abs2" . "radar.gif");
} elseif (($last_one != $seq) && ($allfilesexists == 0)) {
if ($last_one+1 != $seq) {
if ($debg == 1) print ($seq - $last_one) . " frames still missing (from " . ($last_one+1) . ".gif to $seq.gif). \n\n";
} else {
if ($debg == 1) print "1 frame still missing ($seq.gif). \n";
}
if ($debg == 1) print "Creating " . ($last_one+1) . ".gif. \n\n";
exec("wget $fuente$quiet -O $ruta_abs" . ($last_one+1) . ".gif");
$seq = $last_one+1;
} elseif ($allfilesexists == 1) {
if ($debg == 1) print "All files present.\nUpdating sequence:\n";
// Reordenamos la secuencia
for ($i = 1; $i <= ($seq-1); $i++) {
if ($debg == 1) print "renaming $ruta_abs" . ($i+1) . ".gif to ".$ruta_abs . $i . ".gif \n";
rename( $ruta_abs . ($i+1) . ".gif" , $ruta_abs . $i . ".gif");
}
if ($debg == 1) print "Downloading latest and saving as $seq.gif \n";
exec("wget $fuente$quiet -O $ruta_abs$seq" . ".gif");
}
// Creamos la sintaxis de la secuencia de fotogramas (del segundo al penúltimo)
for ($i = 2; $i <= ($seq-1); $i++) {
$interm = $interm . $ruta_abs . $i . ".gif ";
}
if (($ancho == "auto") or ($alto == "auto")) {
$datos_img = getimagesize($ruta_abs . "1.gif");
if ($ancho == "auto") {
$ancho = $datos_img[0];
}
if ($alto == "auto") {
$alto = $datos_img[1];
}
}
if ($last_one != "0") {
// Ejecutamos ImageMagick (en consola) para crear la secuencia
if ($debg == 1) print "Making gif! (".$ruta_abs2."radar.gif)\n
Animation frames\t$seq
Image width\t\t$ancho
Image height\t\t$alto
Animation speed\t\t$vel ms/frame
1st frame delay\t\t$pprim ms
last frame delay\t$pseg ms
Frames path\t\t$ruta_abs
Gif path\t\t$ruta_abs2
Latest frame\t\t$fuente\n\n";
exec("convert -delay " . $pprim . " -size " . $ancho . "x" . $alto . " " . $ruta_abs . "1.gif -delay " . $vel . " " . $interm . "-delay " . $pseg . " " . $ruta_abs . $seq . ".gif -loop 0 " . $ruta_abs2 . "radar.gif");
}
?>
Publicado bajo Licencia Creative Commons GNU General Public


Comentarios
Enviar un comentario nuevo