Jump to Navigation

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");
}
?>

Creative Commons License
Publicado bajo Licencia Creative Commons GNU General Public

Comentarios

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
 
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <embed> <param> <object> <a> <p> <span> <div> <center> <h1> <h2> <h3> <h4> <h5> <h6> <img> <map> <area> <hr> <br> <br /> <ul> <ol> <li> <dl> <dt> <dd> <table> <tr> <td> <em> <b> <u> <i> <strong> <font> <del> <ins> <sub> <sup> <quote> <blockquote> <pre> <address> <code> <cite> <strike> <caption>
  • Saltos automáticos de líneas y de párrafos.
  • Puedes usar etiquetas BBCode como las del foro en el texto. URLs serán convertidos en enlaces automáticamente.
  • Puedes poner código fuente usando las etiquetas <code>...</code> (generic) o <?php ... ?> (highlighted PHP).

Más información sobre opciones de formato

CAPTCHA
Esta comprobación se realiza para distinguir entre humano y máquina y así evitar spam (publicidad) por agentes automatizados (no humanos).
CAPTCHA de imagen
Introduce los caracteres de la imagen.