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 Maps tiene 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.
La 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
-
function distncia($origen, $destino, $pasa_por = ""){
-
$_destino = $destino;
-
-
if($pasa_por != ""){
-
$_pasa_por = $pasa_por;
-
$out = $_pasa_por = "";
-
foreach($pasa_por as $value){
-
$out .= "to:".$value."+";
-
$_pasa_por .= $value.", ";
-
}
-
$pasa_por = $out;
-
} else {
-
$pasa_por = $pasa_por."+";
-
}
-
$destino = $pasa_por."to:".$destino;
-
$url = "http://maps.google.es/maps?f=d&hl=es&saddr=".$origen."&daddr=".$destino;
-
$salida["url"] = $url;
-
$salida["origen"] = $origen;
-
$salida["destino"] = $_destino;
-
$salida["pasa_por"] = $_pasa_por;
-
} else {
-
$url = "http://maps.google.es/maps?f=d&hl=es&saddr=".$origen."&daddr=".$destino;
-
$salida["url"] = $url;
-
$salida["origen"] = $origen;
-
$salida["destino"] = $_destino;
-
}
-
-
$exp_info = '!#fin2#(.+)#2##160;km #2##8211; aprox. (.+)#3#!U';
-
-
$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);
-
-
-
$exp_info = '!"#1##3#div #fin1##1##3#div#1#(.+)#2##160;km #2##8211; aprox. (.+)#3#!U';
-
}
-
//
-
$salida["tiempo"] = $info[2][0];
-
$tiempo = $info[2][0];
-
//
-
if($dias[0][0] == $tiempo){
-
$tiempo = $dias[1][1];
-
$salida["dias"] = $dias[1][0];
-
$dias = "";
-
}
-
if($dias[1][0] == $tiempo){
-
$tiempo = $dias[0][1];
-
$salida["dias"] = $dias[0][0];
-
$dias = "";
-
}
-
if($salida["dias"] == ""){
-
$tiempo = $info[2][0];
-
$salida["dias"] = 0;
-
$dias = "";
-
}
-
//
-
if($horas[0][0] != $tiempo){
-
$tiempo = $horas[0][1];
-
$salida["horas"] = $horas[0][0];
-
$horas = "";
-
}
-
if($horas[1][0] != $tiempo){
-
$tiempo = $horas[1][1];
-
$salida["horas"] = $horas[1][0];
-
$horas = "";
-
}
-
if($salida["horas"] == ""){
-
$tiempo = $info[2][0];
-
$salida["horas"] = 0;
-
$horas = "";
-
}
-
//
-
if($min[0] != $tiempo){
-
$salida["min"] = $min[0][0];
-
}
-
if($salida["min"] == ""){
-
$tiempo = $info[2][0];
-
$salida["min"] = 0;
-
}
-
//
-
$salida["distancia"] = $info[1][0];
-
//$salida["exp_info"] = $exp_info;
-
//$salida["debug"] = $info;
-
return $salida;
-
}
-
?>
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
-
-
//print_r(distncia("palencia", "valladolid"));
-
$datos = distncia("palencia", "valladolid");
-
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>';
-
-
?>
Si por ejemplo quisiéramos calcular un viaje desde Burgos hasta Salamanca pasando por Palencia y Valladolid solo tendríamos que poner:
-
<?php
-
-
$datos = distncia("Burgos", "Salamanca", $paradas);
-
echo 'Destino: '.$datos["destino"].'\n';
-
echo 'Pasa por: '.$datos["pasa_por"].'\n';
-
echo 'Distancia: '.$datos["distancia"].'Km'.'\n';
-
echo 'Dias: '.$datos["dias"].'\n';
-
echo 'Horas: '.$datos["horas"].'\n';
-
echo 'Minutos: '.$datos["min"].'\n';
-
echo 'Tiempo: '.$datos["tiempo"].'\n';
-
?>
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.
La verdad que me ha sido muy util.
Muchisimas gracias por poner esta funcion en la web.
Solo quiero comentarte una cosa que no llego a entender. Si pongo las ciudades en vez de en espanol en su lengua de origen, es decir, en vez de Londres London, la funcion ya no trabaja bien. Me imagino que esto se debe a la expresiones regulares, pero no entiendo porque.
En vez de KM se puede calcular en millas???.
Bueno solo fecilitarte por el trabajo que has hecho.
Un saludo,
Juanstan
Perdon por el comentario anterior si que funciona bien. Solo que el origen siempre tiene que ser una ciudad espanola. Eso porque es???
Gracias de nuevo,
Juanstan
Buenas juanstan, la función creo que si funciona bien pero funciona haciendo la búsqueda directa en google maps. Por eso los nombres de ciudades y eso se busca dentro del buscador regional. Quizá para tu proyecto te venga bien cambiar el origen de los datos. Estos orígenes se determinan en las direcciones de google maps en las que se extraen los datos, en este caso como aparece en las lineas 20 y 26 del código de la función, se extraen de “maps.google.es”, la pagina local española de google.
Si cambias esta dirección a otro idioma posiblemente tengas que cambiar también la detección de expresión regular que se hace a dias, horas, km….. y por tanto muchos de los if() de la función.
Miré por la documentación de google maps para ver si se podía cambiar estos valores pero no encontré mucha información (me interesaban mas los trayectos a pie), por lo que lo he dejado así.
Espero que te fuera de ayuda, pero, la curiosidad me mata.. para q lo as usado??
un saludo.
Muy buenas, antares500,
Bueno la funcion que hiciste es una maravilla. Tenias razon es por cosa del idioma y por los resultados sin salen en millas o en kilometros.
La he estado usando para un proyecto donde teniamos que introducir un postcode o una ciudad para indicar la distnacia que habia respecto a otra ciudad ya por defecto.
Mas o menos puedes hacerte una idea viendo esta pagina http://elrincon.vlexo.com/.
El caso esque todo iba bien hasta hoy. Yo pienso que es por las expresiones regulares ya que el codigo fuente de la pagina de google ha cambiado. No se, corrigeme si me equivoco.
Te estaria muy agradecido si me explicaras como has hecho lo de las expresiones regulares. Ya se que es un follon pero me gustaria saber solucionarlo si en un futuro pasa lo de hoy.
Muchas gracias de nuevo,
Juanstan
Hola Juanstan, como te comenté es difícil de explicar el tema de las expresiones regulares. GoogleMaps es una web cambiante… al contener javascript el código final que vemos en el navegador no es el original que lee el servidor de php ya que como sabes php se ejecuta dentro del servidor y javascript dentro del usuario. Esta es una de las bazas que google tiene para asegurarse su “privacidad”. Para que no pase mas lo mas indicado seria utilizar la API de google maps como te indique en el anterior comentario pero todavía no estoy seguro como realizar la consulta a este servicio.
Continuando con el tema de expresiones regulares, fue complicado… las lineas 33 a 40 se dedican a reemplazar pedazos de código dentro del código completo de la web de manera que sea mas identificables los datos. Para eso utilizo los ###NOMBRE que puedes ver en el codigo rodeando a los datos que nos interesan.
Si encuentras como utilizar la api de google para hacer recorridos y que indique la distancia y eso no dudes en comentármelo.
Hola antares500, estoy intentando poner en mi web una herramienta para calcular la distancia entre dos ciudades. Lo habia pensado hacer con coordenadas y de ahi pasar a kilometros, pero soy incapaz de escribir el codigo, cuando tengo algo hecho no se donde tengo que poner que.., un desastre)
he visto tu codigo y me parece una buena idea, lo he escrito (copiar pegar) en en archivo php en mi pagina pero no sale nada, debo escribir los otros codigos en archivo separado?
como veras no tengo mucha experiencia en esto de programar, pero me parece apasionante y cada dia aprengo algo, me podrias ayudar?
gracias!!
Veo que en lugares como Estados unidos marco desde aqui hasta aqui y me establece una ruta perfecta en color morado y la distancia entre ambos puntos lo trato de hacer en mi pais (Costa Rica) y solo me pone unos numeros de latitudes. ejemplo No hemos podido calcular la distancia para dirigirte de 10.044585, -84.306335 a 10.100022,-83.982239 en coche.
Hola,
Estoy haciendo un programa que lee de un GPS los datos. Para marcar la ruta en el mapa utilizo la siguiente linea: (dentro de un bucle)
//dibujar una linea
echo “var p1 = new GLatLng(“.$lon1.”,”.$lat1.”);\n”;
echo “var p2 = new GLatLng(“.$lon2.”,”.$lat2.”);\n”;
echo “var polyline = new GPolyline(["."p1".","."p2]“.”,” . “‘$azul_marino’” . “,” . “6″ . “,” . “0.4″ . “); \n”;
echo “map.addOverlay(“.’polyline’. “); \n”;
echo “\n”;
Pongo lo siguiente para calcular la distancia entre puntos, y no funciona
$kilometers += “‘polyline.getLength()’”/1000;
echo ” $kilometers; \n”;
Se puede hacer asi?
Saludos, Luis
Yo lo he estado probando y no me funciona, creo que Google Maps impide realizar este tipo de consultas, ya que en realidad no se consulta la api.
¿Me equivoco?
Gracias
Es cierto, desde la remodelación del código de google maps para incluir la información de panoramio y las funciones de personalización las funciones que extraían los datos exactos dejaron de funcionar, y si, google no permite obtener datos de esta forma (aun que se pueden obtener ya que los obtiene después de ejecutarse el javascript en el ordenador del usuario).
De todas formas si te interesa esta función google tiene unos web services perfectos para extraer estos datos directamente desde Json.
He creado una función hace unos días para obtener esos datos pero no la tengo muy depurada.. en cuanto la tenga entera la pongo por aquí..
Hola,
como puedo pasar una variable de javascript a una funcion php?
pongo el siguiente ejemplo que me trae de cabeza.
No funciona.
Saludos, Luis
function escribirValor()
{
$variable_php = “pepe”;
graba();
}
Hola Luis, pues es algo bastante sencillo. Con eso te adentras en el maravilloso mundo del famoso AJAX lo que quiere decir que solo hay dos formas de hacerlo..
Una, enviando la pagina web entera y recogiendo a partir de $_GET o $_POST desde el php (ya sea automáticamente o no con un document.forms['nombre_del_form'].submit(); ), o la forma mas AJAX de esto que seria usar un iframe (o un frame) y utilizarlo para no tener que recargar la web entera.
La otra opción es usar el objeto XMLHttpRequest que envía internamente con peticiones la pagina y devuelve el resultado de la web entera generada (mucho mejor para tareas de consulta de datos y cosas así).
Si decides utilizar esta ultima opción lo mejor va a ser que uses alguna librería javascript, y si haces eso te recomiendo jQuery que tiene un modo AJAX que es lo mas fácil que he visto. un saludo y suerte..