Midiendo tiempo y distancia entre dos puntos con PHP

http://www.tierra0.com/2007/07/19/midiendo-tiempo-y-distancia-entre-dos-puntos-con-php/

Hoy vamos de viajes. He estado preguntándome si se podrí­a calcular la distancia entre 2 puntos del planeta y claro… puedo calcular la distancia entre 2 coordenadas relativamente fácilmente. De echo hay varios sistemas desperdigados por la red que lo hacen. A partir de latitud y longitud determinan en linea recta a cuantos km están los puntos, pero esta medida me era muy inexacta ya que nunca vamos del punto A al punto B en linea recta. Así­ que investigue un poco mas y me acorde de una de las funciones de mi amado google maps.
Google Mapstiene una función en la que podemos poner un punto de salida, otro de llegada y puntos intermedios determinando una ruta REAL entre estos y indicándonos no solo la distancia en kilometros si no que ademas nos indica el tiempo que tardaremos en recorrerlo.

Vista esta función, para futuros proyectos decidí­ intentar encapsularla y la verdad.. me resulto algo mas extenso de lo que esperaba debido al ajax que tiene la web ya que no he tenido ganas de pegarme con la api de google.

Archivo de puntosLa función nos da como resultado un array con la dirección de la ruta en google maps, los kilómetros que hay entre los puntos, el tiempo general que se tarda en recorrerlo expresado en español y el tiempo dividido en dí­as, horas y minutos.
Todo a partir de 3 valores. Un primer valor con el lugar de origen, un segundo valor con el de destino y un tercero opcional con el que podemos introducir un array de sitios intermedios en los que pasara la ruta.

Función:

PHP:

  1. <?php
  2. function distncia($origen, $destino, $pasa_por = “”){
  3.     $salida = array();
  4.     $_destino = $destino;
  5.     if($pasa_por != “”){
  6.         $_pasa_por = $pasa_por;
  7.         if(is_array($pasa_por)){//si es un array
  8.             $out = $_pasa_por = “”;
  9.             foreach($pasa_por as $value){
  10.                 $out .= “to:”.$value.”+”;
  11.                 $_pasa_por .= $value.”, “;
  12.             }
  13.             $_pasa_por = substr($_pasa_por, 0, -2);
  14.             $pasa_por = $out;
  15.         } else {
  16.             $pasa_por = $pasa_por.”+”;
  17.         }
  18.         $destino = $pasa_por.”to:”.$destino;
  19.         $url = “http://maps.google.es/maps?f=d&hl=es&saddr=”.$origen.”&daddr=”.$destino;
  20.         $salida[“url”] = $url;
  21.         $salida[“origen”] = $origen;
  22.         $salida[“destino”] = $_destino;
  23.         $salida[“pasa_por”] = $_pasa_por;
  24.     } else {
  25.         $url = “http://maps.google.es/maps?f=d&hl=es&saddr=”.$origen.”&daddr=”.$destino;
  26.         $salida[“url”] = $url;
  27.         $salida[“origen”] = $origen;
  28.         $salida[“destino”] = $_destino;
  29.     }
  30.     $query = @file_get_contents($url);
  31.     $exp_info = ‘!#fin2#(.+)#2##160;km #2##8211; aprox. (.+)#3#!U’;
  32.     $datos = str_replace(“\u0026”, “#2#”, $query);
  33.     $datos = str_replace(“\u003e”, “#1#”, $datos);
  34.     $datos = str_replace(“\u003c”, “#3#”, $datos);
  35.     $datos = str_replace(“class=\\\”dditd noprint\\\”#1##3#div#1#”, “#fin#”, $datos);
  36.     $datos = str_replace(“class=\\\”noprint\\\””, “#fin1#”, $datos);
  37.     $datos = str_replace(“Novedad!#3#/span#1# Arrastra la lí­nea de color azul para cambiar la ruta.#3#/div#1##3#div #fin#”, “#fin2#”, $datos);
  38.     preg_match_all($exp_info, $datos, $info);
  39.     if(!isset($info[1][0])){
  40.         $exp_info = ‘!”#1##3#div #fin1##1##3#div#1#(.+)#2##160;km #2##8211; aprox. (.+)#3#!U’;
  41.         preg_match_all($exp_info, $datos, $info);
  42.     }
  43.     //
  44.     $salida[“tiempo”] = $info[2][0];
  45.     $tiempo = $info[2][0];
  46.     //
  47.     $dias[0] = @explode(” dí­as y “, $tiempo);
  48.     $dias[1] = @explode(” dí­a y “, $tiempo);
  49.     if($dias[0][0] == $tiempo){
  50.         $tiempo = $dias[1][1];
  51.         $salida[“dias”] = $dias[1][0];
  52.         $dias = “”;
  53.     }
  54.     if($dias[1][0] == $tiempo){
  55.         $tiempo = $dias[0][1];
  56.         $salida[“dias”] = $dias[0][0];
  57.         $dias = “”;
  58.     }
  59.     if($salida[“dias”] == “”){
  60.         $tiempo = $info[2][0];
  61.         $salida[“dias”] = 0;
  62.         $dias = “”;
  63.     }
  64.     //
  65.     $horas[0] = @explode(” horas”, $tiempo);
  66.     $horas[1] = @explode(“h “, $tiempo);
  67.     if($horas[0][0] != $tiempo){
  68.         $tiempo = $horas[0][1];
  69.         $salida[“horas”] = $horas[0][0];
  70.         $horas = “”;
  71.     }
  72.     if($horas[1][0] != $tiempo){
  73.         $tiempo = $horas[1][1];
  74.         $salida[“horas”] = $horas[1][0];
  75.         $horas = “”;
  76.     }
  77.     if($salida[“horas”] == “”){
  78.         $tiempo = $info[2][0];
  79.         $salida[“horas”] = 0;
  80.         $horas = “”;
  81.     }
  82.     //
  83.     $min[0] = @explode(“min”, $tiempo);
  84.     if($min[0] != $tiempo){
  85.         $salida[“min”] = $min[0][0];
  86.     }
  87.     if($salida[“min”] == “”){
  88.         $tiempo = $info[2][0];
  89.         $salida[“min”] = 0;
  90.     }
  91.     //
  92.     $salida[“distancia”] = $info[1][0];
  93.     //$salida[“exp_info”] = $exp_info;
  94.     //$salida[“debug”] = $info;
  95.     return $salida;
  96. }
  97. ?>

Por ejemplo.. una vez cargada la función en el archivo, si quisiéramos saber los datos entre Palencia y Valladolid solo tendrí­amos que poner:

PHP:

  1. <?php
  2. //print_r(distncia(“palencia”, “valladolid”));
  3. $datos = distncia(“palencia”, “valladolid”);
  4. echo ‘<a href=”‘.$datos[“url”].'”>Entre ‘.$datos[“origen”].’ y ‘.$datos[“destino”].’ hay ‘.$datos[“distancia”].’Km, y se tarda en ir ‘.$datos[“dias”].’dias, ‘.$datos[“horas”].’horas y ‘.$datos[“min”].’minutos, o lo lo que es lo mismo ‘.$datos[“tiempo”].’ aproximadamente</a>’;
  5. ?>

Si por ejemplo quisiéramos calcular un viaje desde Burgos hasta Salamanca pasando por Palencia y Valladolid solo tendrí­amos que poner:

PHP:

  1. <?php
  2. $paradas = array(“Palencia”, “Valladolid”);
  3. $datos = distncia(“Burgos”, “Salamanca”, $paradas);
  4. echo ‘<a href=”‘.$datos[“url”].'”>’.$datos[“url”].”</a>\n”;
  5. echo ‘Origen: ‘.$datos[“origen”].’\n”;
  6. echo ‘Destino: ‘.$datos[“destino”].’\n’;
  7. echo ‘Pasa por: ‘.$datos[“pasa_por”].’\n’;
  8. echo ‘Distancia: ‘.$datos[“distancia”].’Km’.’\n’;
  9. echo ‘Dias: ‘.$datos[“dias”].’\n’;
  10. echo ‘Horas: ‘.$datos[“horas”].’\n’;
  11. echo ‘Minutos: ‘.$datos[“min”].’\n’;
  12. echo ‘Tiempo: ‘.$datos[“tiempo”].’\n’;
  13. ?>

Espero que os sea de ayuda si es lo que necesitáis y si alguien quiere codificarla usando la api de google maps que nos lo cuente.