Información general
Puedes calcular indicaciones (usando varios métodos de transporte) con el objeto DirectionsService. Este objeto se comunica con el servicio de indicaciones de la Google Maps API, el cual recibe solicitudes de indicaciones y devuelve resultados computados. Puedes administrar estos resultados de indicaciones por ti mismo o usar el objeto DirectionsRenderer para representarlos.
Al especificar el origen o el destino en una consulta de indicaciones, puedes especificar una cadena de consulta (por ejemplo, “Chicago, IL” o “Darwin, NSW, Australia”), un valor LatLng o un objeto google.maps.Place.
El servicio de indicaciones puede devolver indicaciones de varias partes usando una serie de waypoints. Las indicaciones se muestran como una polilínea que dibuja la ruta en un mapa o, adicionalmente, como una serie de descripciones textuales dentro de un elemento <div> (p. ej., “Doble a la derecha en la rampa del puente de Williamsburg”).
Primeros pasos
Antes de usar el servicio de indicaciones de la Google Maps JavaScript API, debes asegurarte de que Google Maps Directions API esté habilitada en Google API Console, en el mismo proyecto que configuraste para la Google Maps JavaScript API.
Para ver tu lista de API habilitadas, realiza lo siguiente:
- Ingresa a Google API Console.
- Haz clic en el botón Select a project, luego selecciona el mismo proyecto que configuraste para la Google Maps JavaScript API y haz clic en Open.
- En la lista de API del Panel de control, busca Google Maps Directions API.
- Si ves la API en la lista, no necesitas hacer nada más. Si la API no está en la lista, habilítala:
- En la parte superior de la página, selecciona ENABLE API para mostrar la pestaña Library. Como alternativa, en el menú lateral izquierdo, selecciona Library.
- Busca Google Maps Directions API y luego selecciónala en la lista de resultados.
- Selecciona ENABLE. Cuando finalice el proceso, Google Maps Directions API aparecerá en la lista de API del Panel de control.
Límites y políticas de uso
Cuotas
Los siguientes límites de uso se encuentran en vigencia para el servicio de indicaciones:
Uso del servicio de indicaciones con el plan estándar
- 2500 solicitudes gratis por día, calculadas como la suma de las consultas del cliente y el servidor; habilitar facturación para acceder a las cuotas diarias por un costo de USD 0.50 cada 1000 solicitudes adicionales, hasta
100 000 solicitudes diarias. - Hasta 23 waypoints por solicitud, más el origen y el destino.
- 50 solicitudes por segundo, calculadas como la suma de las consultas del cliente y el servidor.
Uso del servicio de indicaciones con el plan premium
- Cuota gratuita diaria compartida de 100 000 solicitudes cada 24 horas; las solicitudes adicionales se cargarán a la compra anual de créditos de Maps API..
- Hasta 23 waypoints permitidos por cada solicitud, más el origen y el destino.
- Ilimitado solicitudes del cliente por segundo, por proyecto. Ten en cuenta que la API del servidor tiene una cantidad límite de 50 solicitudes por segundo.
El límite de la tasa se aplica por sesión de usuario, independientemente de la cantidad de usuarios que compartan el mismo proyecto.
El límite de la tasa por sesión evita el uso de servicios del cliente para solicitudes por lotes. Para las solicitudes por lotes, usa el servicio web de Google Maps Directions API.
Políticas
El uso del servicio de indicaciones debe cumplir con las políticas que se describen para la Google Maps Directions API.
Solicitudes de indicaciones
El acceso al servicio de indicaciones es asincrónico, ya que la Google Maps API debe realizar una llamada a un servidor externo. Por esta razón, debes pasar un método callback para la ejecución al completarse la solicitud. Este método callback debe procesar los resultados. Ten en cuenta que el servicio de indicaciones puede devolver más de un itinerario posible como un conjunto de routes[] separadas.
Para usar las indicaciones de la Google Maps JavaScript API, crea un objeto del tipo DirectionsService, llama a DirectionsService.route() para iniciar una solicitud dirigida al servicio de indicaciones y pásale un literal de objeto DirectionsRequest que contenga los términos introducidos y un método callback para la ejecución al recibir la respuesta.
El literal de objeto DirectionsRequest contiene los siguientes campos:
{
origin: LatLng | String | google.maps.Place,
destination: LatLng | String | google.maps.Place,
travelMode: TravelMode,
transitOptions: TransitOptions,
drivingOptions: DrivingOptions,
unitSystem: UnitSystem,
waypoints[]: DirectionsWaypoint,
optimizeWaypoints: Boolean,
provideRouteAlternatives: Boolean,
avoidHighways: Boolean,
avoidTolls: Boolean,
region: String
}
Estos campos se explican a continuación:
origin(obligatorio) especifica la ubicación inicial a partir de la cual deben calcularse las indicaciones. Este valor puede especificarse como unString(p. ej., “Chicago, IL”), un valorLatLngo un objetogoogle.maps.Place. Si usas un objetogoogle.maps.Place, puedes especificar un id. de sitio, una cadena de consulta o una ubicaciónLatLng. Puedes recuperar id. de sitios de los servicios de geocodificación, búsqueda de sitios y Autocompletado de sitios, en la Google Maps JavaScript API. Para hallar un ejemplo en el que se usen los id. de sitio del servicio de autocompletado de sitios, consulta Autocompletado de sitios e indicaciones.destination(obligatorio) especifica la ubicación final para la cual deben calcularse las indicaciones. Las opciones son las mismas que para el campoorigindescrito antes.travelMode(obligatorio) especifica el modo de transporte que debe usarse al calcular indicaciones. En Modos de viaje, a continuación, se especifican valores válidostransitOptions(opcional) especifica valores que se aplican solo a solicitudes en las cualestravelModeesTRANSIT. En Opciones de transporte, a continuación, se describen valores válidos.drivingOptions(opcional) especifica valores que se aplican solo a solicitudes en las quetravelModeesDRIVING. En Opciones de manejo, a continuación, se describen valores válidos.unitSystem(opcional) especifica el sistema de unidades que debe usarse al mostrar resultados. En Sistemas de unidades, a continuación, se especifican valores válidoswaypoints[](opcional) especifica un conjunto deDirectionsWaypoint. Los waypoints modifican un trayecto haciendo que pase por las ubicaciones especificadas. Un waypoint se especifica como un literal de objeto con los campos que se muestran a continuación:locationespecifica la ubicación del waypoint, como unLatLng, un objetogoogle.maps.Placeo unStringque llevará geocodificación.stopoveres un booleano que indica que el waypoint es un punto de detención en la ruta, el cual tiene el efecto de dividirla en dos.
(Para obtener más información sobre waypoints, consulta Cómo usar waypoints en rutas a continuación).
optimizeWaypoints(opcional) especifica que la ruta en la que se usan loswaypointsproporcionados puede optimizarse si se ordenan estos waypoints con mayor eficacia. Si el valor estrue, el servicio de indicaciones devolverá loswaypointsreordenados en un campowaypoint_orderfield. (Para obtener más información, consulta Cómo usar waypoints en rutas a continuación).provideRouteAlternatives(opcional), cuando se fija en el valortrue, especifica que el servicio de indicaciones puede proporcionar más de una ruta alternativa en la respuesta. Ten en cuenta que proporcionar rutas alternativas puede aumentar el tiempo de respuesta del servidor.avoidHighways(opcional), cuando se fija en el valortrue, indica que las rutas calculadas deben evitar carreteras principales, si es posible.avoidTolls(opcional), cuando se fija en el valortrue, indica que las rutas calculadas deben evitar carreteras con peajes, si es posible.region(opcional) especifica el código de región, establecido como un valor ccTLD (“dominio de nivel superior”) de dos caracteres. (Para obtener más información, consulta Restricción por región a continuación).
A continuación, se muestra un ejemplo de DirectionsRequest:
{
origin: 'Chicago, IL',
destination: 'Los Angeles, CA',
waypoints: [
{
location: 'Joplin, MO',
stopover: false
},{
location: 'Oklahoma City, OK',
stopover: true
}],
provideRouteAlternatives: false,
travelMode: 'DRIVING',
drivingOptions: {
departureTime: new Date(/* now, or future date */),
trafficModel: 'pessimistic'
},
unitSystem: google.maps.UnitSystem.IMPERIAL
}
Modos de viaje
Al calcular indicaciones, debes especificar el modo de transporte que se usará. Actualmente, se admiten los siguientes modos de viaje:
DRIVING(predeterminado) establece indicaciones de manejo estándar por la red de carreteras.BICYCLINGsolicita indicaciones para el traslado en bicicleta por ciclovías y calles preferidas.TRANSITsolicita indicaciones por rutas de transporte público.WALKINGsolicita indicaciones de traslado a pie por sendas peatonales y veredas.
Consulta los datos de cobertura de Google Maps para determinar el punto hasta el cual un país admite indicaciones. Si solicitas indicaciones para una región en la cual el tipo de indicaciones en cuestión no está disponible, en la respuesta se devolverá DirectionsStatus="ZERO_RESULTS".
Es posible que en las indicaciones de traslado a pie no se incluyan sendas peatonales. Para estas indicaciones se devolverán, en el DirectionsResult, advertencias que debes mostrar si no usas el DirectionsRenderer predeterminado.
Opciones de transporte
Las opciones disponibles para una solicitud de indicaciones varían según el modo de viaje. Al solicitar indicaciones de transporte, se ignorarán las opciones avoidHighways, avoidTolls, waypoints[] y optimizeWaypoints. Puedes precisar opciones de rutas específicas para transportes a través del literal de objeto TransitOptions.
Las indicaciones de transporte están sujetas a la hora. Solo se devolverán para horas futuras.
El literal de objeto TransitOptions contiene los siguientes campos:
{
arrivalTime: Date,
departureTime: Date,
modes[]: TransitMode,
routingPreference: TransitRoutePreference
}
Estos campos se explican a continuación:
arrivalTime(opcional) especifica la hora de llegada deseada como un objetoDate. Si se especifica la hora de llegada, se ignora la hora de partida.departureTime(opcional) especifica la hora de partida deseada como un objetoDate. Se ignorarádepartureTimesi se especificaarrivalTime. El valor predeterminado es este momento (es decir, la hora actual) si no se especifican valores paradepartureTimeoarrivalTime.modes[](opcional) es un conjunto que contiene uno o más literales de objetoTransitMode. Este campo solo puede incluirse si en la solicitud se incluye una clave de API. En cadaTransitModese especifica un modo de transporte preferido. Se permiten los siguientes valores:BUSindica que, para la ruta calculada, debe priorizarse el transporte en autobús.RAILindica que, para la ruta calculada, debe priorizarse el transporte en tren, tranvía, tren ligero y subterráneo.SUBWAYindica que, para la ruta calculada, debe priorizarse el transporte en subterráneo.TRAINindica que, para la ruta calculada, debe priorizarse el transporte en tren.TRAMindica que, para la ruta calculada, debe priorizarse el transporte en tranvía y tren ligero.
routingPreference(opcional) especifica preferencias para rutas de transporte. Con esta opción, puedes restringir las opciones devueltas en lugar de aceptar la mejor ruta predeterminada seleccionada por la API. Este campo solo puede especificarse si en la solicitud se incluye una clave de API. Se permiten los siguientes valores:FEWER_TRANSFERSindica que, para la ruta calculada, se debe preferir una cantidad limitada de transbordos.LESS_WALKINGindica que, para la ruta calculada, se deben preferir traslados a pie limitados.
A continuación, se muestra un ejemplo de DirectionsRequest mediante transporte:
{
origin: 'Hoboken NJ',
destination: 'Carroll Gardens, Brooklyn',
travelMode: 'TRANSIT',
transitOptions: {
departureTime: new Date(1337675679473),
modes: ['BUS'],
routingPreference: 'FEWER_TRANSFERS'
},
unitSystem: google.maps.UnitSystem.IMPERIAL
}
Opciones de manejo
Puedes especificar opciones de rutas para indicaciones de manejo a través del objeto DrivingOptions. Debes proporcionar un id. de cliente de Google Maps APIs Premium Plan al cargar la API si deseas incluir un campo drivingOptions en DirectionsRequest.
El objeto DrivingOptions contiene los siguientes campos:
{
departureTime: Date,
trafficModel: TrafficModel
}
Estos campos se explican a continuación:
departureTime(obligatorio para que el literal de objetodrivingOptionssea válido) especifica la hora de partida deseada como un objetoDate. El valor debe fijarse en la hora actual o en una hora futura determinada. No puede ser un horario pasado. (La API convierte todas las fechas al parámetro UTC para garantizar un manejo uniforme en todas las zonas horarias). Para los clientes de Google Maps APIs Premium Plan, si incluyesdepartureTimeen la solicitud, la API devuelve la mejor ruta conforme a las condiciones de tráfico que se esperan en el horario en cuestión e incluye la hora prevista con tráfico (duration_in_traffic) en la respuesta. Si no especificas una hora de partida (es decir, si en la solicitud no se incluyedrivingOptions), se devolverá una ruta generalmente recomendada sin considerar las condiciones del tráfico.trafficModel(opcional) especifica las suposiciones que deben aplicarse al calcular el tiempo con tráfico. Esta configuración afecta el valor devuelto en el campoduration_in_trafficen la respuesta, que contiene el tiempo previsto en el tráfico según promedios históricos. El valor predeterminado esbestguess. Se permiten los siguientes valores:bestguess(predeterminado) indica que el valorduration_in_trafficdevuelto debe ser el mejor cálculo en términos de tiempo de viaje a partir de lo que se conoce sobre las condiciones históricas del tráfico y el tráfico en tiempo real. Cuanto más se acerquedepartureTimeal valor presente, mayor importancia cobrará el tráfico en tiempo real...pessimisticindica que el valorduration_in_trafficdevuelto debe ser superior al tiempo de viaje real en la mayoría de los días. Sin embargo, este valor puede ser inferior al tiempo de viaje real en ciertos días en que las condiciones de tráfico son particularmente desfavorables.optimisticindica que el valorduration_in_trafficdevuelto debe ser inferior al del tiempo de viaje real en la mayoría de los días. Sin embargo, este valor puede ser superior al tiempo de viaje real en ciertos días en que las condiciones de tráfico son particularmente favorables.
A continuación, se muestra un ejemplo de DirectionsRequest para indicaciones de manejo:
{
origin: 'Chicago, IL',
destination: 'Los Angeles, CA',
travelMode: 'DRIVING',
drivingOptions: {
departureTime: new Date(Date.now() + N), // for the time N milliseconds from now.
trafficModel: 'optimistic'
}
}
Sistemas de unidades
De manera predeterminada, las indicaciones se calculan y muestran mediante el sistema de unidades del país o la región del origen. (Nota: Los orígenes expresados con coordenadas de latitud y longitud en lugar de direcciones siempre aparecen en unidades métricas de manera predeterminada). Por ejemplo, para una ruta de “Chicago, IL” a “Toronto, ONT” los resultados se mostrarán en millas, mientras que para la ruta inversa se mostrarán en kilómetros. Puedes invalidar este sistema de unidades configurando uno explícitamente en la solicitud con uno de los siguientes valores UnitSystem:
UnitSystem.METRICespecifica el uso del sistema métrico. Las distancias se muestran en kilómetros.UnitSystem.IMPERIALespecifica el uso del sistema imperial (inglés). Las distancias se muestran en kilómetros.
Nota: esta configuración del sistema de unidades solo tiene efecto sobre el texto que se muestra al usuario. El resultado de las indicaciones también contiene valores de distancia, que no se muestran al usuario y siempre se expresan en metros.
Restricción de regiones para indicaciones
El servicio de indicaciones de la Google Maps API devuelve resultados de direcciones afectados por el dominio (región o país) del que cargaste el arranque de JavaScript. (Debido a que la mayoría de los usuarios cargan https://maps.google.com/, esto establece un dominio implícito en Estados Unidos). Si cargas el arranque de un dominio admitido diferente, obtendrás resultados afectados por ese dominio. Por ejemplo, es posible que de las búsquedas que incluyan “San Francisco” surjan diferentes resultados en aplicaciones en las cuales se cargue https://maps.google.com/ (Estados Unidos) y http://maps.google.es/ (España).
También puedes configurar el servicio de indicaciones para que devuelva resultados restringidos a una región en particular usando el parámetro region. Este parámetro toma un código de región, especificado como una subetiqueta region en lenguaje IANA. En la mayoría de los casos, estas etiquetas realizan asignaciones directas a valores de ccTLD (“dominio de nivel superior”) de dos caracteres como, por ejemplo, “uk” en “co.uk”. En algunos casos, la etiqueta region también admite códigos ISO-3166-1, que a veces difieren de los valores ccTLD (por ejemplo, “GB” por “Gran Bretaña”).
Consulta los datos de cobertura de Google Maps para determinar el punto hasta el cual un país admite indicaciones.
Representación de indicaciones
Si se desea iniciar una solicitud de indicaciones para DirectionsService con el método route(), es necesario pasar un callback que se ejecute al completarse la solicitud de servicio. Este callback devolverá un DirectionsResult y un código DirectionsStatus en la respuesta.
Solicitud de estado of indicaciones
DirectionsStatus puede devolver los siguientes valores:
OKindica que la respuesta contiene unDirectionsResultválido.NOT_FOUNDindica que no se pudo geocodificar al menos a una de las ubicaciones especificadas en el origen, el destino o los waypoints de la solicitud.ZERO_RESULTSindica que no fue posible hallar una ruta entre el origen y el destino.MAX_WAYPOINTS_EXCEEDEDindica que se proporcionaron demasiados camposDirectionsWaypointenDirectionsRequest. Consulta la sección sobre límites de waypoints más adelante.INVALID_REQUESTindica que elDirectionsRequestproporcionado no fue válido. Estos códigos de error se deben con mayor frecuencia a la falta un origen o un destino en las solicitudes, o bien a la inclusión de waypoints en las mismas.OVER_QUERY_LIMITindica que la página web ha enviado demasiadas solicitudes dentro del período de tiempo permitido.REQUEST_DENIEDindica que la página web no puede usar el servicio de indicaciones.UNKNOWN_ERRORindica que no se pudo procesar una solicitud de indicaciones debido a un error en el servidor. La solicitud puede tener éxito si realizas un nuevo intento.
Debes asegurarte de que la solicitud de indicaciones devuelva resultados válidos verificando este valor antes de procesar el resultado.
Visualización de DirectionsResult
DirectionsResult contiene el resultado de la solicitud de indicaciones. Puedes administrarlo por ti mismo o pasarlo a un objeto DirectionsRenderer, el cual puede administrar en forma automática la visualización de dicho resultado en un mapa.
Para visualizar un DirectionsResult usando un DirectionsRenderer, simplemente debes hacer lo siguiente:
- Crea un objeto
DirectionsRenderer. - Llama a
setMap()en el representador para vincularlo al mapa transferido. - Llama a
setDirections()en el representador y pásale elDirectionsResult, como se indicó antes. Debido a que el representador es unMVCObject, detectará en forma automática los cambios realizados en sus propiedades y actualizará el mapa cuando sus indicaciones asociadas se hayan modificado.
En el ejemplo siguiente se calculan indicaciones entre dos ubicaciones de la ruta 66, donde el origen y el destino se configuran a través de los valores "start" y "end" en las listas desplegables. DirectionsRenderer administra la visualización de la polilínea entre las ubicaciones indicadas y la disposición de marcadores en el origen, el destino y los waypoints, si corresponde.
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
var chicago = new google.maps.LatLng(41.850033, -87.6500523);
var mapOptions = {
zoom:7,
center: chicago
}
map = new google.maps.Map(document.getElementById('map'), mapOptions);
directionsDisplay.setMap(map);
}
function calcRoute() {
var start = document.getElementById('start').value;
var end = document.getElementById('end').value;
var request = {
origin: start,
destination: end,
travelMode: 'DRIVING'
};
directionsService.route(request, function(result, status) {
if (status == 'OK') {
directionsDisplay.setDirections(result);
}
});
}
En el cuerpo HTML:
<div> <strong>Start: </strong> <select id="start" onchange="calcRoute();"> <option value="chicago, il">Chicago</option> <option value="st louis, mo">St Louis</option> <option value="joplin, mo">Joplin, MO</option> <option value="oklahoma city, ok">Oklahoma City</option> <option value="amarillo, tx">Amarillo</option> <option value="gallup, nm">Gallup, NM</option> <option value="flagstaff, az">Flagstaff, AZ</option> <option value="winona, az">Winona</option> <option value="kingman, az">Kingman</option> <option value="barstow, ca">Barstow</option> <option value="san bernardino, ca">San Bernardino</option> <option value="los angeles, ca">Los Angeles</option> </select> <strong>End: </strong> <select id="end" onchange="calcRoute();"> <option value="chicago, il">Chicago</option> <option value="st louis, mo">St Louis</option> <option value="joplin, mo">Joplin, MO</option> <option value="oklahoma city, ok">Oklahoma City</option> <option value="amarillo, tx">Amarillo</option> <option value="gallup, nm">Gallup, NM</option> <option value="flagstaff, az">Flagstaff, AZ</option> <option value="winona, az">Winona</option> <option value="kingman, az">Kingman</option> <option value="barstow, ca">Barstow</option> <option value="san bernardino, ca">San Bernardino</option> <option value="los angeles, ca">Los Angeles</option> </select> </div>
Ver el ejemplo (directions-simple.html)
En el ejemplo siguiente se muestran indicaciones en las que se usan diferentes modos de traslado entre Haight-Ashbury y Ocean Beach, en San Francisco, CA:
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
var haight = new google.maps.LatLng(37.7699298, -122.4469157);
var oceanBeach = new google.maps.LatLng(37.7683909618184, -122.51089453697205);
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
var mapOptions = {
zoom: 14,
center: haight
}
map = new google.maps.Map(document.getElementById('map'), mapOptions);
directionsDisplay.setMap(map);
}
function calcRoute() {
var selectedMode = document.getElementById('mode').value;
var request = {
origin: haight,
destination: oceanBeach,
// Note that Javascript allows us to access the constant
// using square brackets and a string value as its
// "property."
travelMode: google.maps.TravelMode[selectedMode]
};
directionsService.route(request, function(response, status) {
if (status == 'OK') {
directionsDisplay.setDirections(response);
}
});
}
En el cuerpo HTML:
<div> <strong>Mode of Travel: </strong> <select id="mode" onchange="calcRoute();"> <option value="DRIVING">Driving</option> <option value="WALKING">Walking</option> <option value="BICYCLING">Bicycling</option> <option value="TRANSIT">Transit</option> </select> </div>
Ver el ejemplo (directions-travel-modes.html)
DirectionsRenderer no solo administra la visualización de la polilínea y de cualquier marcador asociado, sino también la visualización textual de indicaciones como series de pasos. Para hacerlo, simplemente llama a setPanel() en tu DirectionsRenderer y pásale el <div> en el cual debe mostrarse esta información. Al hacerse esto, también se garantiza la visualización de información sobre derechos de autor y de advertencias que pueden asociarse con el resultado.
Se proporcionarán indicaciones textuales en las que se usará la configuración de idioma preferida del navegador o el idioma especificado al cargar el código de JavaScript de la API mediante el parámetro language. (Para obtener más información, consulta Localización). En el caso de las indicaciones de transporte, el tiempo aparecerá en la zona horaria de la parada de transporte.
El siguiente ejemplo es idéntico al que se muestra antes, pero en él se incluye un panel <div> en el que deben mostrarse las indicaciones:
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
function initialize() {
directionsDisplay = new google.maps.DirectionsRenderer();
var chicago = new google.maps.LatLng(41.850033, -87.6500523);
var mapOptions = {
zoom:7,
center: chicago
}
map = new google.maps.Map(document.getElementById('map'), mapOptions);
directionsDisplay.setMap(map);
directionsDisplay.setPanel(document.getElementById('directionsPanel'));
}
function calcRoute() {
var start = document.getElementById('start').value;
var end = document.getElementById('end').value;
var request = {
origin:start,
destination:end,
travelMode: 'DRIVING'
};
directionsService.route(request, function(response, status) {
if (status == 'OK') {
directionsDisplay.setDirections(response);
}
});
}
En el cuerpo HTML:
<div id="map" style="float:left;width:70%; height:100%"></div> <div id="directionsPanel" style="float:right;width:30%;height 100%"></div>
Ver el ejemplo (directions-panel.html)
El objeto DirectionsResult
Al enviar solicitudes de indicaciones a DirectionsService, se recibe una respuesta que consta de un código de estado y un resultado, que es un objeto DirectionsResult. DirectionsResult es un literal de objeto que tiene los siguientes campos:
geocoded_waypoints[]contiene un conjunto de objetosDirectionsGeocodedWaypoint, y cada uno de ellos contiene información detallada acerca de la geocodificación del origen, del destino y de los waypoints.routes[]contiene un conjunto de objetosDirectionsRoute. Cada ruta indica una manera de ir del origen al destino proporcionado en el objetoDirectionsRequest. En general, solo se devuelve una ruta para una solicitud determinada a menos que el valor establecido del campoprovideRouteAlternativesde dicha solicitud seatrue, en cuyo caso pueden devolverse varias rutas.
Waypoints con geocodificación para indicaciones
Un DirectionsGeocodedWaypoint contiene información detallada acerca de la geocodificación del origen, del destino y de los waypoints.
DirectionsGeocodedWaypoint es un literal de objeto que tiene los siguientes campos:
geocoder_statusindica el código de estado que se genera a partir de la operación de geocodificación. Este campo puede contener los siguientes valores:"OK"indica que no ocurrieron errores, que la dirección se analizó correctamente y que se devolvió al menos un geocódigo.ZERO_RESULTSindica que el geocódigo fue exitoso, pero no devolvió resultados. Esto puede ocurrir si se pasa un valoraddressinexistente al geocodificador.
-
partial_matchindica que el geocodificador no devolvió una coincidencia exacta para la solicitud original, aunque sí pudo establecer una coincidencia parcial para la dirección solicitada. Te recomendamos que examines la solicitud original para comprobar que no haya errores ortográficos y que la dirección no esté incompleta.Las coincidencias parciales generalmente ocurren cuando las direcciones que pasaste en la solicitud no existen en la localidad. También se pueden devolver coincidencias parciales cuando una solicitud coincide con dos o más ubicaciones en la misma localidad. Por ejemplo, "21 Henr St, Bristol, UK" devolverá una coincidencia parcial para Henry Street y Henrietta Street. Ten en cuenta que si una solicitud incluye una dirección con un componente que contiene errores ortográficos, el servicio de geocodificación puede sugerir una dirección alternativa. Las sugerencias propuestas de esta manera también se marcarán como una coincidencia parcial.
place_ides un identificador único para un sitio, que puede usarse con otras API de Google. Por ejemplo, puedes usarplace_idcon la biblioteca de laGoogle Places API para obtener información detallada de un negocio local, como un número de teléfono, el horario de apertura, reseñas de usuarios y más. Consulta la información general sobre id. de sitio.types[]es un conjunto que indica el tipo del resultado devuelto. Esta matriz contiene un grupo de cero o más etiquetas que identifican el tipo de función devuelto en el resultado. Por ejemplo, para un geocódigo “Chicago”, se devuelve “localidad”, que indica que “Chicago” es una ciudad, y también se devuelve “político”, que indica que se trata de una entidad política.
Rutas de indicaciones
El objeto heredado DirectionsTrip lleva el nuevo nombre DirectionsRoute. Ten en cuenta que en una ruta actualmente se hace referencia a todo el viaje, de principio a fin, y no simplemente a una etapa de su totalidad.
El objeto DirectionsRoute contiene un único resultado del origen y el destino especificados. Esta ruta puede constar de una o más etapas (del tipo DirectionsLeg) según se especifiquen o no waypoints. Además, la ruta también contiene información sobre derechos de autor y advertencias que debe mostrarse al usuario junto con la información de ruta.
DirectionsRoute es un literal de objeto que tiene los siguientes campos:
legs[]contiene un conjunto de objetosDirectionsLegy cada uno estos contiene información sobre la etapa de la ruta, a partir de dos ubicaciones dentro de la ruta. Habrá una etapa separada para cada waypoint o destino especificado. (Una ruta sin waypoints contendrá exactamente unDirectionsLeg.) Cada etapa consta de una serie de objetosDirectionStep.waypoint_ordercontiene una matriz que indica el orden de los waypoints en la ruta calculada. Este conjunto puede contener un orden modificado si alDirectionsRequestse le transfirióoptimizeWaypoints: true.overview_pathcontiene un conjunto de objetosLatLngque representan una ruta aproximada (unificada) a partir de las indicaciones resultantes.overview_polylinecontiene un único objetopointsque tiene una representación de polilínea codificada de la ruta. Esta polilínea es una ruta aproximada (unificada) a partir de las indicaciones resultantes.boundscontiene un objetoLatLngBoundsque indica los límites de la polilínea a lo largo de esta ruta.copyrightscontiene el texto sobre derechos de autor que debe mostrarse para esta ruta.warnings[]contiene una matriz de advertencias que deben exhibirse al mostrar estas indicaciones. Si no usas el objetoDirectionsRendererproporcionado, debes administrar y mostrar estas advertencias por tu cuenta.farecontiene los gastos totales (es decir, los costos totales de los tiques) de esta ruta. Esta propiedad se devuelve únicamente para solicitudes de transporte y en el caso de rutas, cuando se encuentre disponible información sobre costos para todas las etapas del recorrido. La información incluye lo siguiente:currency: código de moneda ISO 4217 que indica la divisa en la cual se expresa el monto.value: monto total expresado en la moneda antes especificada.
Etapas de las indicaciones
El objeto heredado DirectionsRoute lleva el nuevo nombre DirectionsLeg.
Un elemento DirectionsLeg define una única etapa de un viaje desde el origen hasta el destino en la ruta calculada. Las rutas que no contienen waypoints consisten en una única “etapa”, pero aquellas en las que se definen uno o más waypoints consisten en una o más etapas, correspondientes a las etapas específicas del viaje.
DirectionsLeg es un literal de objeto que tiene los siguientes campos:
steps[]contiene un conjunto de objetosDirectionsStepque designan información sobre cada paso separado de la etapa del viaje.distanceindica la distancia total que se abarca en esta etapa, como un objetoDistancecon la siguiente forma:valueindica la distancia en metros.textcontiene una representación de cadena de la distancia, que se muestra de manera predeterminada en las unidades usadas en el origen. (Por ejemplo, se usarán millas para cualquier origen dentro de Estados Unidos). Puedes invalidar este sistema de unidades configurando de manera específica un objetoUnitSystemen la consulta original. Ten en cuenta que el campodistance.valuesiempre contiene un valor expresado en metros, independientemente del sistema de unidades que uses.
Estos campos pueden ser indefinidos si se desconoce la distancia.
durationindica la duración total de esta etapa, como un objetoDurationcon la siguiente forma:valueindica la duración en segundos.textcontiene una representación de cadena de la duración.
Estos campos pueden ser indefinidos si se desconoce la duración.
duration_in_trafficindica la duración total de esta etapa teniendo en cuenta las condiciones actuales del tráfico.duration_in_trafficsolo se devuelve si todos los siguientes enunciados son verdaderos:- La solicitud incluye un ID de cliente de Google Maps APIs Premium Plan válido.
- La solicitud no incluye waypoints de parada. Es decir, no incluye waypoints con
stopoverigual atrue. - La solicitud es específica para indicaciones de manejo;
modeestá configurado en el valordriving. departureTimese incluye como parte del campodrivingOptionsen la solicitud.- Las condiciones del tráfico están disponibles para la ruta solicitada.
duration_in_trafficcontiene los siguientes campos:valueindica la duración en segundos.textcontiene una representación de la duración en lenguaje natural.
arrival_timecontiene la hora estimada de llegada para esta etapa. Esta propiedad solo se devuelve para indicaciones de transporte. El resultado se devuelve como un objetoTimecon tres propiedades:valuecontiene la hora especificada como objetoDatede JavaScript.textcontiene la hora especificada como cadena. La hora se muestra en la zona horaria de la parada de transporte.time_zonecontiene la zona horaria de esta estación. El valor es el nombre de la zona horaria tal como se define en la base de datos de zonas horarias de la IANA; p. ej., “America/New_York”.
departure_timecontiene la hora estimada de partida para esta etapa, especificada como un objetoTime.departure_timesolo está disponible para indicaciones de transporte.start_locationcontiene el objetoLatLngdel origen de esta etapa. Debido a que el servicio web de indicaciones calcula indicaciones entre ubicaciones usando la opción de transporte más cercana (generalmente, una carretera) en los puntos de partida y llegada, es posible questart_locationse diferencie del origen proporcionado de esta etapa si, por ejemplo, no hay una carretera cerca del origen.end_locationcontiene el objetoLatLngdel destino de esta etapa. Debido a queDirectionsServicecalcula indicaciones entre ubicaciones usando la opción de transporte más cercana (generalmente, una carretera) en los puntos de partida y llegada, es posible queend_locationse diferencie del destino proporcionado de esta etapa si, por ejemplo, no hay una carretera cerca del destino.start_addresscontiene la dirección en lenguaje natural (normalmente, una dirección) del punto de partida de esta etapa.end_addresscontiene la dirección en lenguaje natural (normalmente, una dirección) del punto de llegada de esta etapa.
Pasos de indicaciones
Un objeto DirectionsStep es la unidad más pequeña de la ruta de una dirección, y contiene un único paso en el que se describe una instrucción específica y única del viaje. P. ej., “Doble a la izquierda en la calle 4, hacia el oeste”. En el paso no solo se describe la instrucción, sino también se incluye información sobre distancia y duración relacionada con la vinculación que este paso tiene con el siguiente. Por ejemplo, un paso indicado como “Tome la I-80 hacia el oeste” puede contener una duración de “37 millas” y “40 minutos”, que indica que el paso siguiente se encuentra a 37 millas o 40 minutos del paso actual.
Al usar el servicio de indicaciones para buscar indicaciones de transporte, en el conjunto de pasos se incluirá información específica sobre el transporte bajo la forma de un objeto transit. Si en las indicaciones se incluyen varios modos de transporte, se proporcionarán indicaciones detalladas relacionadas con pasos para el desplazamiento a pie o la conducción en un conjunto steps[]. Por ejemplo, en un paso para el desplazamiento a pie se incluirán indicaciones de las ubicaciones de partida y llegada: “Camine hasta la avenida Innes y la calle Fitch”. En ese paso se incluirán indicaciones detalladas de desplazamiento a pie para la ruta en el conjunto steps[], como las siguientes: “Diríjase hacia el noroeste”, “Doble a la izquierda en Arelious Walker” y “Doble a la izquierda en la avenida Innes”.
DirectionsStep es un literal de objeto que tiene los siguientes campos:
instructionscontiene instrucciones para este paso dentro de una cadena de texto.distancecontiene la distancia que abarca este paso hasta el siguiente, como un objetoDistance. (Consulta la descripción deDirectionsLeg, arriba). Este campo puede no especificarse si se desconoce la distancia.durationcontiene un cálculo del tiempo necesario para realizar el paso, hasta llegar al siguiente, como un objetoDuration. (Consulta la descripción deDirectionsLeg, arriba). Este campo puede no especificarse si se desconoce la duración.start_locationcontiene el objetoLatLngcon geocodificación punto de partida de este paso.end_locationcontiene el objetoLatLngdel punto de llegada de este paso.polylinecontiene un único objetopointsque tiene una representación de polilínea codificada del paso. Esta polilínea es una ruta aproximada (unificada) del paso.steps[]contiene un literal de objetoDirectionsStepque tiene indicaciones detalladas relacionadas con pasos para el desplazamiento a pie o la conducción en indicaciones de transporte. Solo hay subpasos disponibles para indicaciones de transporte.travel_modecontiene el objetoTravelModeempleado en este paso. En las indicaciones de transporte se puede incluir una combinación de indicaciones para el desplazamiento a pie y en transporte.pathcontiene un conjunto deLatLngsen el que se describe el recorrido de este paso.transitcontiene información específica sobre el transporte, como los horarios de llegada y partida, y el nombre de la línea de transporte.
Información específica sobre el transporte
Las indicaciones de tránsito devuelven información adicional que no es relevante para otros modos de transporte. Estas propiedades adicionales se exhiben a través del objeto TransitDetails, el cual se devuelve como una propiedad de DirectionsStep. A partir del objeto TransitDetails, puedes acceder a información adicional para los objetos TransitStop, TransitLine, TransitAgency y VehicleType, como se describe a continuación.
Detalles sobre el transporte
El objeto TransitDetails exhibe las siguientes propiedades:
arrival_stopcontiene un objetoTransitStopque representa la estación o parada de llegada con las siguientes propiedades:nameel nombre de la estación/parada de transporte. P. ej., “Union Square”.locationcontiene la ubicación de la estación o parada de transporte, como un objetoLatLng.
departure_stopcontiene un objetoTransitStopque representa la estación o parada de partida.arrival_timecontiene la hora de llegada, especificada como un objetoTimecon tres propiedades:valuecontiene la hora especificada como objetoDatede JavaScript.textcontiene la hora especificada como cadena. La hora se muestra en la zona horaria de la parada de transporte.time_zonecontiene la zona horaria de esta estación. El valor es el nombre de la zona horaria tal como se define en la base de datos de zonas horarias de la IANA; p. ej., “America/New_York”.
departure_timecontiene la hora de partida, especificada como un objetoTime.headsignespecifica la dirección en la cual se debe viajar en esta línea, según se marca en el vehículo o la parada de partida. A menudo, será la estación terminal.headwaycuando está disponible, especifica los segundos que se esperan entre partidas de la misma parada en el momento. Por ejemplo, con un valorheadwayde 600, se debe prever una espera de diez minutos en caso de perder un autobús.linecontiene un literal de objetoTransitLineque contiene información sobre la línea de transporte usada en este paso.TransitLineproporciona el nombre y el operador de la línea junto con otras propiedades descritas en la documentación de referencia deTransitLine.num_stopscontiene el número de paradas de este paso. Incluye la parada de llegada, pero no la de partida. Por ejemplo, si en las indicaciones se incluye partir de la parada A, pasar por las paradas B y C, y llegar a la parada D, el valor devuelto pornum_stopsserá 3.
Línea de transporte
El objeto TransitLine exhibe las siguientes propiedades:
namecontiene el nombre completo de esta línea de transporte. Por ejemplo, “7 Avenue Express” o “14th St Crosstown”.short_namecontiene el nombre abreviado de esta línea de transporte. Normalmente, será el nombre de una línea, como "2” o “M14”.agenciescontiene un conjunto del tipoTransitAgency. Cada objetoTransitAgencyproporciona información sobre el operador de esta línea, incluidas las siguientes propiedades:namecontiene el nombre de la agencia de transporte.urlcontiene la URL de la agencia de transporte.phonecontiene el número de teléfono de la agencia de transporte.
Si representas indicaciones de tránsito manualmente en lugar de usar el objeto
DirectionsRenderer, debes mostrar los nombres y las URL de las agencias de transporte que ofrecen los servicios de los resultados.urlcontiene una URL de esta línea de transporte proporcionada por la agencia de transporte.iconcontiene una URL para el icono asociado con esta línea. La mayoría de las ciudades usan iconos genéricos que varían según el tipo de vehículo. Para algunas líneas de transporte, como el sistema de subterráneos de Nueva York, hay iconos específicos.colorcontiene el color que comúnmente se usa en la señalización del transporte en cuestión. El color se especificará como una cadena hexadecimal; por ejemplo: #FF0033.text_colorcontiene el color de texto que comúnmente se usa para la señalización de la línea en cuestión. El color se especificará como una cadena hexadecimal.vehiclecontiene un objetoVehicleque incluye las siguientes propiedades:namecontiene el nombre del vehículo de esta línea; p. ej., “Subterráneo”.typecontiene el tipo de vehículo que se usa en esta línea. Consulta la documentación sobre el tipo de vehículo para obtener una lista completa de los valores admitidos.iconcontiene una URL para el icono comúnmente asociado con este tipo de vehículo.local_iconcontiene la URL para el ícono asociado con este tipo de vehículo, según la señalización de transporte local.
Tipo de vehículo
El objeto VehicleType exhibe las siguientes propiedades:
| Valor | Definición |
|---|---|
VehicleType.RAIL |
Transporte ferroviario. |
VehicleType.METRO_RAIL |
Transporte en tren ligero. |
VehicleType.SUBWAY |
Tren ligero subterráneo. |
VehicleType.TRAM |
Tranvía sobre el suelo. |
VehicleType.MONORAIL |
Monorriel. |
VehicleType.HEAVY_RAIL |
Ferrocarril metropolitano. |
VehicleType.COMMUTER_TRAIN |
Ferrocarril suburbano. |
VehicleType.HIGH_SPEED_TRAIN |
Tren de alta velocidad. |
VehicleType.BUS |
Autobús. |
VehicleType.INTERCITY_BUS |
Autobús interurbano. |
VehicleType.TROLLEYBUS |
Trolebús. |
VehicleType.SHARE_TAXI |
El transporte “share taxi” es una clase de autobús que puede dejar y recoger pasajeros en cualquier punto de su recorrido. |
VehicleType.FERRY |
Ferry. |
VehicleType.CABLE_CAR |
Un vehículo que funciona con un cable y generalmente sobre el suelo. Los funiculares aéreos pueden ser del tipo VehicleType.GONDOLA_LIFT. |
VehicleType.GONDOLA_LIFT |
Un funicular aéreo. |
VehicleType.FUNICULAR |
Un vehículo que sube por una pendiente pronunciada a través de un cable. Un funicular normalmente consta de dos coches; cada uno actúa como contrapeso del otro. |
VehicleType.OTHER |
Se devolverá este tipo para todos los demás vehículos. |
Inspección de DirectionsResults
Es posible que los componentes de DirectionsResults (DirectionsRoute, DirectionsLeg, DirectionsStep y TransitDetails) se inspeccionen y se usen al procesar respuestas de indicaciones.
Importante: Si representas indicaciones de tránsito manualmente en lugar de usar el objeto DirectionsRenderer, debes mostrar los nombres y las URL de las agencias de transporte que ofrecen los servicios de los resultados.
En el ejemplo siguiente se representan indicaciones para el desplazamiento a pie hasta atracciones turísticas en Nueva York. Se inspecciona el componente DirectionsStep a fin de agregar marcadores para cada paso, y se adjunta información a un componenteInfoWindow a través de texto instructivo para el paso en cuestión.
Debido a que se calculan indicaciones para el desplazamiento a pie, también se muestran advertencias al usuario en un panel <div> separado.
var map;
var directionsDisplay;
var directionsService;
var stepDisplay;
var markerArray = [];
function initialize() {
// Instantiate a directions service.
directionsService = new google.maps.DirectionsService();
// Create a map and center it on Manhattan.
var manhattan = new google.maps.LatLng(40.7711329, -73.9741874);
var mapOptions = {
zoom: 13,
center: manhattan
}
map = new google.maps.Map(document.getElementById('map'), mapOptions);
// Create a renderer for directions and bind it to the map.
var rendererOptions = {
map: map
}
directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions)
// Instantiate an info window to hold step text.
stepDisplay = new google.maps.InfoWindow();
}
function calcRoute() {
// First, clear out any existing markerArray
// from previous calculations.
for (i = 0; i < markerArray.length; i++) {
markerArray[i].setMap(null);
}
// Retrieve the start and end locations and create
// a DirectionsRequest using WALKING directions.
var start = document.getElementById('start').value;
var end = document.getElementById('end').value;
var request = {
origin: start,
destination: end,
travelMode: 'WALKING'
};
// Route the directions and pass the response to a
// function to create markers for each step.
directionsService.route(request, function(response, status) {
if (status == "OK") {
var warnings = document.getElementById("warnings_panel");
warnings.innerHTML = "" + response.routes[0].warnings + "";
directionsDisplay.setDirections(response);
showSteps(response);
}
});
}
function showSteps(directionResult) {
// For each step, place a marker, and add the text to the marker's
// info window. Also attach the marker to an array so we
// can keep track of it and remove it when calculating new
// routes.
var myRoute = directionResult.routes[0].legs[0];
for (var i = 0; i < myRoute.steps.length; i++) {
var marker = new google.maps.Marker({
position: myRoute.steps[i].start_point,
map: map
});
attachInstructionText(marker, myRoute.steps[i].instructions);
markerArray[i] = marker;
}
}
function attachInstructionText(marker, text) {
google.maps.event.addListener(marker, 'click', function() {
stepDisplay.setContent(text);
stepDisplay.open(map, marker);
});
}
En el cuerpo HTML:
<div> <strong>Start: </strong> <select id="start"> <option value="penn station, new york, ny">Penn Station</option> <option value="grand central station, new york, ny">Grand Central Station</option> <option value="625 8th Avenue New York NY 10018">Port Authority Bus Terminal</option> <option value="staten island ferry terminal, new york, ny">Staten Island Ferry Terminal</option> <option value="101 E 125th Street, New York, NY">Harlem - 125th St Station</option> </select> <strong>End: </strong> <select id="end" onchange="calcRoute();"> <option value="260 Broadway New York NY 10007">City Hall</option> <option value="W 49th St & 5th Ave, New York, NY 10020">Rockefeller Center</option> <option value="moma, New York, NY">MOMA</option> <option value="350 5th Ave, New York, NY, 10118">Empire State Building</option> <option value="253 West 125th Street, New York, NY">Apollo Theatre</option> <option value="1 Wall St, New York, NY">Wall St</option> </select> <div>
Ver el ejemplo (directions-complex.html)
Cómo usar waypoints en rutas
Como se mencionó dentro de la DirectionsRequest, también puedes especificar waypoints (del tipo DirectionsWaypoint) al calcular rutas a través del servicio de indicaciones de circulación para desplazarse a pie, en bicicleta o en automóviles. No se admiten waypoints para indicaciones de transporte. Los waypoints te permiten calcular rutas para ubicaciones adicionales, en cuyo caso la ruta devuelta pasa por los waypoints proporcionados.
Un waypoint consta de los siguientes campos:
location(obligatorio) especifica la dirección del waypoint.stopover(opcional) indica si este waypoint es una parada real de la ruta (true) o si, en lugar de ello, se trata solo de una alternativa preferida a la ruta en la ubicación indicada (false). De manera predeterminada, los booleanos stopover sontrue.
De forma predeterminada, el servicio de indicaciones calcula una ruta a través de los waypoints proporcionados en su respectivo orden. Como alternativa, puedes pasar optimizeWaypoints: true dentro de DirectionsRequest para permitir que el servicio de indicaciones optimice la ruta proporcionada reorganizando los waypoints de manera más eficaz. Esta optimización es una aplicación del problema del viajante. El tiempo de viaje es el factor principal que se optimiza, pero también se pueden considerar otros factores, como la distancia, la cantidad de giros y muchos más, para decidir la ruta más eficiente. Todos los waypoints deben ser stopovers para que el servicio de indicaciones optimice su ruta.
Si introduces en el servicio indicaciones una instrucción para que optimice el orden de sus waypoints, dicho orden se devolverá en el campo waypoint_order dentro del objeto DirectionsResult.
En el ejemplo siguiente se calculan rutas para recorrer Estados Unidos con varios puntos de partida y de llegada, y waypoints. (Para seleccionar varios waypoints, presiona Ctrl+clic al elegir elementos dentro de la lista). Ten en cuenta que se inspeccionan routes.start_address y routes.end_address para que proporcionen el texto del punto de partida y llegada de cada ruta.
function initMap() {
var directionsService = new google.maps.DirectionsService;
var directionsDisplay = new google.maps.DirectionsRenderer;
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 6,
center: {lat: 41.85, lng: -87.65}
});
directionsDisplay.setMap(map);
document.getElementById('submit').addEventListener('click', function() {
calculateAndDisplayRoute(directionsService, directionsDisplay);
});
}
function calculateAndDisplayRoute(directionsService, directionsDisplay) {
var waypts = [];
var checkboxArray = document.getElementById('waypoints');
for (var i = 0; i < checkboxArray.length; i++) {
if (checkboxArray.options[i].selected) {
waypts.push({
location: checkboxArray[i].value,
stopover: true
});
}
}
directionsService.route({
origin: document.getElementById('start').value,
destination: document.getElementById('end').value,
waypoints: waypts,
optimizeWaypoints: true,
travelMode: 'DRIVING'
}, function(response, status) {
if (status === 'OK') {
directionsDisplay.setDirections(response);
var route = response.routes[0];
var summaryPanel = document.getElementById('directions-panel');
summaryPanel.innerHTML = '';
// For each route, display summary information.
for (var i = 0; i < route.legs.length; i++) {
var routeSegment = i + 1;
summaryPanel.innerHTML += '<b>Route Segment: ' + routeSegment +
'</b><br>';
summaryPanel.innerHTML += route.legs[i].start_address + ' to ';
summaryPanel.innerHTML += route.legs[i].end_address + '<br>';
summaryPanel.innerHTML += route.legs[i].distance.text + '<br><br>';
}
} else {
window.alert('Directions request failed due to ' + status);
}
});
}
<div id="map"></div> <div id="right-panel"> <div> <b>Start:</b> <select id="start"> <option value="Halifax, NS">Halifax, NS</option> <option value="Boston, MA">Boston, MA</option> <option value="New York, NY">New York, NY</option> <option value="Miami, FL">Miami, FL</option> </select> <br> <b>Waypoints:</b> <br> <i>(Ctrl+Click or Cmd+Click for multiple selection)</i> <br> <select multiple id="waypoints"> <option value="montreal, quebec">Montreal, QBC</option> <option value="toronto, ont">Toronto, ONT</option> <option value="chicago, il">Chicago</option> <option value="winnipeg, mb">Winnipeg</option> <option value="fargo, nd">Fargo</option> <option value="calgary, ab">Calgary</option> <option value="spokane, wa">Spokane</option> </select> <br> <b>End:</b> <select id="end"> <option value="Vancouver, BC">Vancouver, BC</option> <option value="Seattle, WA">Seattle, WA</option> <option value="San Francisco, CA">San Francisco, CA</option> <option value="Los Angeles, CA">Los Angeles, CA</option> </select> <br> <input type="submit" id="submit"> </div> <div id="directions-panel"></div> </div>
#right-panel {
font-family: 'Roboto','sans-serif';
line-height: 30px;
padding-left: 10px;
}
#right-panel select, #right-panel input {
font-size: 15px;
}
#right-panel select {
width: 100%;
}
#right-panel i {
font-size: 12px;
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#map {
height: 100%;
float: left;
width: 70%;
height: 100%;
}
#right-panel {
margin: 20px;
border-width: 2px;
width: 20%;
height: 400px;
float: left;
text-align: left;
padding-top: 0;
}
#directions-panel {
margin-top: 10px;
background-color: #FFEE77;
padding: 10px;
}
<!-- Replace the value of the key parameter with your own API key. --> <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap"> </script>
function initMap() {
var directionsService = new google.maps.DirectionsService;
var directionsDisplay = new google.maps.DirectionsRenderer;
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 6,
center: {lat: 41.85, lng: -87.65}
});
directionsDisplay.setMap(map);
document.getElementById('submit').addEventListener('click', function() {
calculateAndDisplayRoute(directionsService, directionsDisplay);
});
}
function calculateAndDisplayRoute(directionsService, directionsDisplay) {
var waypts = [];
var checkboxArray = document.getElementById('waypoints');
for (var i = 0; i < checkboxArray.length; i++) {
if (checkboxArray.options[i].selected) {
waypts.push({
location: checkboxArray[i].value,
stopover: true
});
}
}
directionsService.route({
origin: document.getElementById('start').value,
destination: document.getElementById('end').value,
waypoints: waypts,
optimizeWaypoints: true,
travelMode: 'DRIVING'
}, function(response, status) {
if (status === 'OK') {
directionsDisplay.setDirections(response);
var route = response.routes[0];
var summaryPanel = document.getElementById('directions-panel');
summaryPanel.innerHTML = '';
// For each route, display summary information.
for (var i = 0; i < route.legs.length; i++) {
var routeSegment = i + 1;
summaryPanel.innerHTML += '<b>Route Segment: ' + routeSegment +
'</b><br>';
summaryPanel.innerHTML += route.legs[i].start_address + ' to ';
summaryPanel.innerHTML += route.legs[i].end_address + '<br>';
summaryPanel.innerHTML += route.legs[i].distance.text + '<br><br>';
}
} else {
window.alert('Directions request failed due to ' + status);
}
});
}
Ver el ejemplo (directions-waypoints.html).
Límites y restricciones de los waypoints
Están en vigencia los límites y las restricciones de uso siguientes:
- Cuando se usa el servicio de indicaciones en la Google Maps JavaScript API, la máxima cantidad de waypoints permitida es 23, más el origen y el destino. En el servicio web de Google Maps Directions API, los límites son los mismos.
- En el servicio web de Google Maps Directions API, los clientes disponen de 23 waypoints, más el origen y el destino.
- Los clientes de Google Maps APIs Premium Plan disponen de 23 waypoints, más el origen y el destino.
- No se admiten waypoints para indicaciones de transporte.
Indicaciones arrastrables
Los usuarios pueden modificar indicaciones de desplazamiento en bicicleta, a pie o en auto mostradas mediante el uso dinámico de DirectionsRenderer en caso de que sean arrastrables, lo que permite a un usuario seleccionar y modificar rutas haciendo clic en los recorridos resultantes del mapa y arrastrándolos. Puedes indicar si en la pantalla de un representador se permiten indicaciones arrastrables fijando su propiedad draggable en el valor true. Las indicaciones de transporte no pueden convertirse en indicaciones arrastrables.
Cuando las indicaciones son arrastrables, un usuario puede seleccionar cualquier punto del recorrido (o waypoint) del resultado representado y mover el componente indicado hasta una ubicación nueva. DirectionsRenderer se actualizará en forma dinámica para mostrar el recorrido modificado. Después del lanzamiento, se agregará un waypoint transitorio al mapa (indicado por un marcador blanco pequeño). La selección y el movimiento de un segmento de recorrido modificará la etapa del recorrido en cuestión, mientras que la selección y el movimiento de un marcador de waypoint (incluidos el punto de partida y llegada) modificará las etapas de la ruta que pasa por un waypoint.
Debido a que el cliente es quien modifica y representa las indicaciones arrastrables, posiblemente te convenga controlar y administrar el evento directions_changed del elemento DirectionsRenderer, para que reciba notificaciones cuando el usuario modifique las indicaciones que se muestren.
En el siguiente código, se muestra un viaje desde Perth, en la costa occidental de Australia, hasta Sídney, en la costa oriental. El código controla el evento directions_changed para actualizar la distancia total de todas las etapas del viaje.
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: {lat: -24.345, lng: 134.46} // Australia.
});
var directionsService = new google.maps.DirectionsService;
var directionsDisplay = new google.maps.DirectionsRenderer({
draggable: true,
map: map,
panel: document.getElementById('right-panel')
});
directionsDisplay.addListener('directions_changed', function() {
computeTotalDistance(directionsDisplay.getDirections());
});
displayRoute('Perth, WA', 'Sydney, NSW', directionsService,
directionsDisplay);
}
function displayRoute(origin, destination, service, display) {
service.route({
origin: origin,
destination: destination,
waypoints: [{location: 'Adelaide, SA'}, {location: 'Broken Hill, NSW'}],
travelMode: 'DRIVING',
avoidTolls: true
}, function(response, status) {
if (status === 'OK') {
display.setDirections(response);
} else {
alert('Could not display directions due to: ' + status);
}
});
}
function computeTotalDistance(result) {
var total = 0;
var myroute = result.routes[0];
for (var i = 0; i < myroute.legs.length; i++) {
total += myroute.legs[i].distance.value;
}
total = total / 1000;
document.getElementById('total').innerHTML = total + ' km';
}
<div id="map"></div> <div id="right-panel"> <p>Total Distance: <span id="total"></span></p> </div>
#right-panel {
font-family: 'Roboto','sans-serif';
line-height: 30px;
padding-left: 10px;
}
#right-panel select, #right-panel input {
font-size: 15px;
}
#right-panel select {
width: 100%;
}
#right-panel i {
font-size: 12px;
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#map {
height: 100%;
float: left;
width: 63%;
height: 100%;
}
#right-panel {
float: right;
width: 34%;
height: 100%;
}
.panel {
height: 100%;
overflow: auto;
}
<!-- Replace the value of the key parameter with your own API key. --> <script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap"> </script>
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: {lat: -24.345, lng: 134.46} // Australia.
});
var directionsService = new google.maps.DirectionsService;
var directionsDisplay = new google.maps.DirectionsRenderer({
draggable: true,
map: map,
panel: document.getElementById('right-panel')
});
directionsDisplay.addListener('directions_changed', function() {
computeTotalDistance(directionsDisplay.getDirections());
});
displayRoute('Perth, WA', 'Sydney, NSW', directionsService,
directionsDisplay);
}
function displayRoute(origin, destination, service, display) {
service.route({
origin: origin,
destination: destination,
waypoints: [{location: 'Adelaide, SA'}, {location: 'Broken Hill, NSW'}],
travelMode: 'DRIVING',
avoidTolls: true
}, function(response, status) {
if (status === 'OK') {
display.setDirections(response);
} else {
alert('Could not display directions due to: ' + status);
}
});
}
function computeTotalDistance(result) {
var total = 0;
var myroute = result.routes[0];
for (var i = 0; i < myroute.legs.length; i++) {
total += myroute.legs[i].distance.value;
}
total = total / 1000;
document.getElementById('total').innerHTML = total + ' km';
}
