Cómo crear rutas entre dos puntos en un mapa de Google con la clase Gdirections del API de Google Maps.
Como estamos haciendo a lo largo de este manual, presentaremos estas guías para creación de rutas entre dos puntos, de manera práctica y mostrando cómo hemos realizado nosotros un ejemplo básico. El ejemplo en marcha se puede ver en este enlace.
Formulario con los datos de entrada para la ruta
Para empezar, crearemos un formulario que pida los datos necesarios para crear la ruta. Éstos son, básicamente, un punto de inicio y un punto de fin, que se tienen que indicar con notación de Google Maps, es decir, con toda la información del punto, desde lo más particular a lo más general, separada por comas.
En el formulario también recogeremos si la ruta es andando o en coche, puesto que este sistema es capaz de proponer rutas distintas para estos dos casos:
<form action="#" name="form_ruta" onsubmit="obtenerRuta(this.desde.value, this.hasta.value); return false">
<table>
<tr>
<td align="right" >
<strong>Desde:</strong>
<input type="text" size="25" id="desde" name="desde" value="Madrid, España"/>
</td>
<td align="right">
<strong>Hasta:</strong>
<input type="text" size="25" id="hasta" name="hasta" value="Toledo, España" />
</td>
</tr>
<tr>
<td align="center" colspan="2">
<strong>Tipo trayecto: </strong>
<input type="radio" name="tipo" id="tipo" value="2" checked/> En coche
<input type="radio" name="tipo" id="tipo" value="1" /> A pie
<input name="ruta" type="submit" value="Obtener ruta" />
</td>
</tr>
</table>
</form>
Función para crear el mapa de Google con las rutas
Ahora veamos la función que generará el mapa de Google con la ruta que se haya definido en el formulario anterior.
function load() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map"));
gdir = new GDirections(map, document.getElementById("direcciones"));
GEvent.addListener(gdir, "load", onGDirectionsLoad);
GEvent.addListener(gdir, "error", mostrarError);
obtenerRuta("Madrid, Spain", "Toledo, Spain");
}
}
Para que se muestren las indicaciones de la ruta hay que crear un objeto de clase Gdirections y al construirlo tendremos que pasar como parámetro el objeto GMap2 de nuestro mapa y la etiqueta DIV donde se van a mostrar los resultados de texto de la ruta, es decir la explicación en texto de todo el recorrido que hay que hacer para realizar ese camino.
gdir = new GDirections(map, document.getElementById("direcciones"));
También podemos añadir un nuevo evento al objeto creado "gdir" que muestre un resumen de la ruta obtenida mediante la llamada a la función onGDirectionsLoad.
function onGDirectionsLoad(){
//resumen de tiempo y distancia
document.getElementById("getDistance").innerHTML =gdir.getSummaryHtml();
}
Para controlar algún posible error al cargar la ruta, hay que añadir un nuevo evento al objeto "gdir", para que cuando ocurra algún error, llame a la función mostrarError. En esta función hemos mostrado algunos de los errores necesarios para la clase GDirections que se pueden controlar al crear una ruta, puedes ver más códigos de error en http://code.google.com/intl/es/apis/maps/documentation/reference.html#GGeoStatusCode
function mostrarError(){
if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
alert("No se ha encontrado una ubicación geográfica que se corresponda con la dirección especificada.");
else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
alert("No se ha podido procesar correctamente la solicitud de ruta o de códigos geográficos, sin saberse el motivo exacto del fallo.");
else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
alert("Falta el parámetro HTTP q o no tiene valor alguno. En las solicitudes de códigos geográficos, esto significa que se ha especificado una dirección vacía.");
else if (gdir.getStatus().code == G_GEO_BAD_KEY)
alert("La clave proporcionada no es válida o no coincide con el dominio para el cual se ha indicado.");
else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
alert("No se ha podido analizar correctamente la solicitud de ruta.");
else alert("Error desconocido.");
}
Al crear el mapa de Google, hemos llamado a la función mostrarRuta() al final del todo, para que al cargar el mapa, muestre una ruta inicial desde Madrid hasta Toledo en coche.
function obtenerRuta(desde, hasta) {
var i;
var tipo;
//comprobar tipo trayecto seleccionado
for (i=0;i<document.form_ruta.tipo.length;i++){
if (document.form_ruta.tipo[i].checked){
break;
}
}
tipo = document.form_ruta.tipo[i].value;
if(tipo==1){
//a pie
gdir.load("from: " + desde + " to: " + hasta,
{ "locale": "es", "travelMode" : G_TRAVEL_MODE_WALKING });
}else{
//conduccion
gdir.load("from: " + desde + " to: " + hasta,
{ "locale": "es", "travelMode" : G_TRAVEL_MODE_DRIVING });
}
}
Para cargar la ruta, hay que llamar al método load de la clase GDirections, indicándole las propiedades origen (from), destino (to), idioma(locale) y el tipo de trayecto (travelMode). Si este último parámetro se omite, por defecto se creará una ruta en coche.
Puedes consultar la guía de referencia del API de google maps para saber más sobre la clase GDirections en http://code.google.com/intl/es/apis/maps/documentation/reference.html#GDirections
Ejemplo de rutas entre dos puntos en Google Maps completo
Para terminar, vamos a mostrar el código completo del ejemplo. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=ISO-8859-1">
<title>Rutas en Google Maps</title>
<script src=" http://maps.google.com/?file=api&v=2.x&key=CLAVE-GOOGLE-MAPS"
type="text/javascript"></script>
<script type="text/javascript">
var map;
var gdir;
var geocoder = null;
function load() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map"));
gdir = new GDirections(map, document.getElementById("direcciones"));
GEvent.addListener(gdir, "load", onGDirectionsLoad);
GEvent.addListener(gdir, "error", mostrarError);
obtenerRuta("Madrid, Spain", "Toledo, Spain");
}
}
function obtenerRuta(desde, hasta) {
var i;
var tipo;
//comprobar tipo trayecto seleccionado
for (i=0;i<document.form_ruta.tipo.length;i++){
if (document.form_ruta.tipo[i].checked){
break;
}
}
tipo = document.form_ruta.tipo[i].value;
if(tipo==1){
//a pie
gdir.load("from: " + desde + " to: " + hasta,
{ "locale": "es", "travelMode" : G_TRAVEL_MODE_WALKING });
}else{
//conduccion
gdir.load("from: " + desde + " to: " + hasta,
{ "locale": "es", "travelMode" : G_TRAVEL_MODE_DRIVING });
}
}
function onGDirectionsLoad(){
//resumen de tiempo y distancia
document.getElementById("getDistance").innerHTML =gdir.getSummaryHtml();
}
function mostrarError(){
if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
alert("No se ha encontrado una ubicación geográfica que se corresponda con la dirección especificada.");
else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
alert("No se ha podido procesar correctamente la solicitud de ruta o de códigos geográficos, sin saberse el motivo exacto del fallo.");
else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
alert("Falta el parámetro HTTP q o no tiene valor alguno. En las solicitudes de códigos geográficos, esto significa que se ha especificado una dirección vacía.");
else if (gdir.getStatus().code == G_GEO_BAD_KEY)
alert("La clave proporcionada no es válida o no coincide con el dominio para el cual se ha indicado.");
else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
alert("No se ha podido analizar correctamente la solicitud de ruta.");
else alert("Error desconocido.");
}
</script>
</head>
<body >
<h2>Rutas en Google Maps</h2>
<form action="#" name="form_ruta" onsubmit="obtenerRuta(this.desde.value, this.hasta.value); return false">
<table>
<tr>
<td align="right" >
<strong>Desde:</strong>
<input type="text" size="25" id="desde" name="desde" value="Madrid, España"/>
</td>
<td align="right">
<strong>Hasta:</strong>
<input type="text" size="25" id="hasta" name="hasta" value="Toledo, España" />
</td>
</tr>
<tr>
<td align="center" colspan="2">
<strong>Tipo trayecto: </strong>
<input type="radio" name="tipo" id="tipo" value="2" checked/> En coche
<input type="radio" name="tipo" id="tipo" value="1" /> A pie
<input name="ruta" type="submit" value="Obtener ruta" />
</td>
</tr>
</table>
</form>
<br/>
<table>
<tr>
<td>
<strong>Mapa</strong>
</td>
</tr>
<tr>
<td valign="top">
<div id="map" style="width: 560px; height: 250px"></div>
</td>
</tr>
<tr>
<td>
<strong>Direcciones de la ruta</strong>
</td>
</tr>
<tr>
<td valign="top">
Distancia y tiempo: <div id="getDistance"></div>
<div id="direcciones" style="width: 560px"></div>
</td>
</tr>
</table>
</body>
</html>
<script>
window.onload=load;
window.onunload=GUnload;
</script>
Si lo deseas, puedes ver el ejemplo en marcha en una página aparte.
Gema Maria Molina Prados
Equipo DesarrolloWeb.com