The Google Maps Distance Matrix API is a service that provides travel distance and time for a matrix of origins and destinations.
This service is also available as part of the Google Maps JavaScript API, or with the Java, Python and Go client libraries.
This document is intended for developers who wish to compute travel distance and time between a number of points within maps provided by one of the Google Maps APIs. It provides an introduction to using the API and reference material on the available parameters.
Introduction
The Google Maps Distance Matrix API returns information based on the recommended route
between start and end points, as calculated by the Google Maps API, and consists of rows
containing duration and distance values for each pair.
This service does not return detailed route information. Route information can be obtained by passing the desired single origin and destination to the Google Maps Directions API.
Before you start developing with the Distance Matrix API, review the authentication requirements (you need an API key) and the API usage limits.
Distance Matrix Requests
A Google Maps Distance Matrix API request takes the following form:
https://maps.googleapis.com/maps/api/distancematrix/outputFormat?parameters
where outputFormat may be either of the following values:
json(recommended), indicates output in JavaScript Object Notation (JSON); orxml, indicates output as XML.
Note: URLs must be properly encoded to be valid and are limited to 2048 characters for all web services. Be aware of this limit when constructing your URLs. Note that different browsers, proxies, and servers may have different URL character limits as well.
HTTPS or HTTP
Security is important and HTTPS is recommended whenever possible, especially for applications that include sensitive user data, such as a user's location, in requests. Using HTTPS encryption makes your application more secure, and more resistant to snooping or tampering.
If HTTPS is not possible, to access the Google Maps Distance Matrix API over HTTP, use:
http://maps.googleapis.com/maps/api/distancematrix/outputFormat?parameters
Request Parameters
Certain parameters are required while others are optional. As is
standard in URLs, all parameters are separated using the ampersand
(&) character.
Required parameters
origins— The starting point for calculating travel distance and time. You can supply one or more locations separated by the pipe character (|), in the form of an address, latitude/longitude coordinates, or a place ID:- If you pass an address, the service geocodes the string and converts it to
a latitude/longitude coordinate to calculate distance. This coordinate may be
different from that returned by the Google Maps Geocoding API, for example a building
entrance rather than its center.
origins=Bobcaygeon+ON|24+Sussex+Drive+Ottawa+ON
- If you pass latitude/longitude coordinates, they are used unchanged
to calculate distance. Ensure that no space exists between the latitude
and longitude values.
origins=41.43206,-81.38992|-33.86748,151.20699
- If you supply a place ID, you must prefix it with
place_id:. You can only specify a place ID if the request includes an API key or a Google Maps APIs Premium Plan client ID. You can retrieve place IDs from the Google Maps Geocoding API and the Google Places API (including Place Autocomplete). For an example using place IDs from Place Autocomplete, see Place Autocomplete and Directions. For more about place IDs, see the place ID overview.origins=place_id:ChIJ3S-JXmauEmsRUcIaWtf4MzE
- Alternatively, you can supply an encoded set of coordinates using the
Encoded
Polyline Algorithm. This is particularly useful if you have a large
number of origin points, because the URL is significantly shorter when
using an encoded polyline.
- Encoded polylines must be prefixed with
enc:and followed by a colon (:).For example:origins=enc:gfo}EtohhU: - You can also include multiple encoded polylines, separated by the pipe
character (
|). For example:origins=enc:wc~oAwquwMdlTxiKtqLyiK:|enc:c~vnAamswMvlTor@tjGi}L:|enc:udymA{~bxM:
- Encoded polylines must be prefixed with
- If you pass an address, the service geocodes the string and converts it to
a latitude/longitude coordinate to calculate distance. This coordinate may be
different from that returned by the Google Maps Geocoding API, for example a building
entrance rather than its center.
destinations— One or more locations to use as the finishing point for calculating travel distance and time. The options for thedestinationsparameter are the same as for theoriginsparameter, described above.key— Your application's API key. This key identifies your application for purposes of quota management. Learn how to get a key.Note: Google Maps APIs Premium Plan customers may use either an API key, or a valid client ID and digital signature, in your Distance Matrix requests. Get more information on authentication parameters for Premium Plan customers.
The following example uses latitude/longitude coordinates to specify the destination coordinates:
https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=40.6655101,-73.89188969999998&destinations=40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626&key=YOUR_API_KEY
The following example shows the same request using an encoded polyline:
https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=40.6655101,-73.89188969999998&destinations=enc:_kjwFjtsbMt%60EgnKcqLcaOzkGari%40naPxhVg%7CJjjb%40cqLcaOzkGari%40naPxhV:&key=YOUR_API_KEY
Optional parameters
mode(defaults todriving) — Specifies the mode of transport to use when calculating distance. Valid values and other request details are specified in the Travel Modes section of this document.language— The language in which to return results. See the list of supported domain languages. Note that we often update supported languages so this list may not be exhaustive.avoid— Introduces restrictions to the route. Valid values are specified in the Restrictions section of this document. Only one restriction can be specified.units— Specifies the unit system to use when expressing distance as text. See the Unit Systems section of this document for more information.arrival_time— Specifies the desired time of arrival for transit requests, in seconds since midnight, January 1, 1970 UTC. You can specify eitherdeparture_timeorarrival_time, but not both. Note thatarrival_timemust be specified as an integer.departure_time— The desired time of departure. You can specify the time as an integer in seconds since midnight, January 1, 1970 UTC. Alternatively, you can specify a value ofnow, which sets the departure time to the current time (correct to the nearest second). The departure time may be specified in two cases:- For requests where the travel mode is transit: You can optionally
specify one of
departure_timeorarrival_time. If neither time is specified, thedeparture_timedefaults to now (that is, the departure time defaults to the current time). - For requests where the travel mode is driving: You can specify the
departure_timeto receive a route and trip duration (response field:duration_in_traffic) that take traffic conditions into account. This option is only available if the request contains a valid API key, or a valid Google Maps APIs Premium Plan client ID and signature. Thedeparture_timemust be set to the current time or some time in the future. It cannot be in the past.
- For requests where the travel mode is transit: You can optionally
specify one of
traffic_model(defaults tobest_guess) — Specifies the assumptions to use when calculating time in traffic. This setting affects the value returned in theduration_in_trafficfield in the response, which contains the predicted time in traffic based on historical averages. Thetraffic_modelparameter may only be specified for requests where the travel mode isdriving, and where the request includes adeparture_time, and only if the request includes an API key or a Google Maps APIs Premium Plan client ID. The available values for this parameter are:best_guess(default) indicates that the returnedduration_in_trafficshould be the best estimate of travel time given what is known about both historical traffic conditions and live traffic. Live traffic becomes more important the closer thedeparture_timeis to now.pessimisticindicates that the returnedduration_in_trafficshould be longer than the actual travel time on most days, though occasional days with particularly bad traffic conditions may exceed this value.optimisticindicates that the returnedduration_in_trafficshould be shorter than the actual travel time on most days, though occasional days with particularly good traffic conditions may be faster than this value.
transit_mode— Specifies one or more preferred modes of transit. This parameter may only be specified for requests where themodeistransit. The parameter supports the following arguments:busindicates that the calculated route should prefer travel by bus.subwayindicates that the calculated route should prefer travel by subway.trainindicates that the calculated route should prefer travel by train.tramindicates that the calculated route should prefer travel by tram and light rail.railindicates that the calculated route should prefer travel by train, tram, light rail, and subway. This is equivalent totransit_mode=train|tram|subway.
transit_routing_preference— Specifies preferences for transit requests. Using this parameter, you can bias the options returned, rather than accepting the default best route chosen by the API. This parameter may only be specified for requests where themodeistransit. The parameter supports the following arguments:less_walkingindicates that the calculated route should prefer limited amounts of walking.fewer_transfersindicates that the calculated route should prefer a limited number of transfers.
Travel Modes
For the calculation of distances, you may specify
the transportation mode to use. By default,
distances are calculated for driving mode. The following
travel modes are supported:
driving(default) indicates distance calculation using the road network.walkingrequests distance calculation for walking via pedestrian paths & sidewalks (where available).bicyclingrequests distance calculation for bicycling via bicycle paths & preferred streets (where available).transitrequests distance calculation via public transit routes (where available). This value may only be specified if the request includes an API key or a Google Maps APIs Premium Plan client ID. If you set the mode totransityou can optionally specify either adeparture_timeor anarrival_time. If neither time is specified, thedeparture_timedefaults to now (that is, the departure time defaults to the current time). You can also optionally include atransit_modeand/or atransit_routing_preference.
* Note: Both walking and
bicycling routes may sometimes not include clear pedestrian or
bicycling paths, so these responses will return warnings
in the returned result which you must display to the user.
Restrictions
Distances may be calculated that adhere to certain restrictions.
Restrictions are indicated by use of the avoid parameter, and
an argument to that parameter indicating the restriction to avoid. The
following estrictions are supported:
avoid=tollsavoid=highwaysavoid=ferriesavoid=indoor
* Note: the addition of restrictions does not preclude routes that include the restricted feature; it simply biases the result to more favorable routes.
Unit Systems
Distance Matrix results contain text within
distance fields to indicate the distance of the calculated
route. The unit system to use can be specified:
units=metric(default) returns distances in kilometers and meters.units=imperialreturns distances in miles and feet.
* Note: this unit system
setting only affects the text displayed within
distance fields. The distance fields also contain
values which are always expressed in meters.
Distance Matrix Responses
Responses to Google Maps Distance Matrix API queries are returned in the format
indicated by the output flag within the URL request's path.
Two sample HTTP requests are shown below, requesting distance and duration from Vancouver, BC, Canada and from Seattle, WA, USA, to San Francisco, CA, USA and to Victoria, BC, Canada.
This request demonstrates using the JSON output flag:
https://maps.googleapis.com/maps/api/distancematrix/json?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Victoria+BC&mode=bicycling&language=fr-FR&key=YOUR_API_KEY
This request demonstrates using the XML output flag:
https://maps.googleapis.com/maps/api/distancematrix/xml?origins=Vancouver+BC|Seattle&destinations=San+Francisco|Vancouver+BC&mode=bicycling&language=fr-FR&key=YOUR_API_KEY
This request will return four elements - two origins times two destinations:
| Vancouver to San Francisco | Vancouver to Victoria |
| Seattle to San Francisco | Seattle to Victoria |
Results are returned in rows, each row containing one origin paired with each destination.
Try it! Click here to send the sample request in your browser. (If prompted to choose an application with which to open the file, you can select your browser or your favorite text editor.)
Click the tabs below to see the sample JSON and XML responses.
{
"status": "OK",
"origin_addresses": [ "Vancouver, BC, Canada", "Seattle, État de Washington, États-Unis" ],
"destination_addresses": [ "San Francisco, Californie, États-Unis", "Victoria, BC, Canada" ],
"rows": [ {
"elements": [ {
"status": "OK",
"duration": {
"value": 340110,
"text": "3 jours 22 heures"
},
"distance": {
"value": 1734542,
"text": "1 735 km"
}
}, {
"status": "OK",
"duration": {
"value": 24487,
"text": "6 heures 48 minutes"
},
"distance": {
"value": 129324,
"text": "129 km"
}
} ]
}, {
"elements": [ {
"status": "OK",
"duration": {
"value": 288834,
"text": "3 jours 8 heures"
},
"distance": {
"value": 1489604,
"text": "1 490 km"
}
}, {
"status": "OK",
"duration": {
"value": 14388,
"text": "4 heures 0 minutes"
},
"distance": {
"value": 135822,
"text": "136 km"
}
} ]
} ]
}
Note that these results generally need to be parsed if you wish to extract values from the results. Parsing JSON is relatively easy. See Parsing JSON for some recommended design patterns.
<?xml version="1.0" encoding="UTF-8"?>
<DistanceMatrixResponse>
<status>OK</status>
<origin_address>Vancouver, BC, Canada</origin_address>
<origin_address>Seattle, État de Washington, États-Unis</origin_address>
<destination_address>San Francisco, Californie, États-Unis</destination_address>
<destination_address>Victoria, BC, Canada</destination_address>
<row>
<element>
<status>OK</status>
<duration>
<value>340110</value>
<text>3 jours 22 heures</text>
</duration>
<distance>
<value>1734542</value>
<text>1 735 km</text>
</distance>
</element>
<element>
<status>OK</status>
<duration>
<value>24487</value>
<text>6 heures 48 minutes</text>
</duration>
<distance>
<value>129324</value>
<text>129 km</text>
</distance>
</element>
</row>
<row>
<element>
<status>OK</status>
<duration>
<value>288834</value>
<text>3 jours 8 heures</text>
</duration>
<distance>
<value>1489604</value>
<text>1 490 km</text>
</distance>
</element>
<element>
<status>OK</status>
<duration>
<value>14388</value>
<text>4 heures 0 minutes</text>
</duration>
<distance>
<value>135822</value>
<text>136 km</text>
</distance>
</element>
</row>
</DistanceMatrixResponse>
We recommend that you use json as the preferred output flag
unless your service requires xml for some reason. Processing
XML trees requires some care, so that you reference proper nodes and
elements. See
Parsing
XML with XPath
for some recommended design patterns for output processing.
The remainder of this documentation will use JSON syntax.
Distance Matrix Response Elements
Distance Matrix responses contain the following root elements:
statuscontains metadata on the request. See Status Codes below.origin_addressescontains an array of addresses as returned by the API from your original request. These are formatted by the geocoder and localized according to thelanguageparameter passed with the request.destination_addressescontains an array of addresses as returned by the API from your original request. As withorigin_addresses, these are localized if appropriate.rowscontains an array ofelements, which in turn each contain astatus,duration, anddistanceelement.
Status Codes
The status fields within the response object contain the
status of the request, and may contain useful debugging information. The
Distance Matrix API returns a top-level status field, with information
about the request in general, as well as a status field for each element
field, with information about that particular origin-destination pairing.
Top-level Status Codes
OKindicates the response contains a validresult.INVALID_REQUESTindicates that the provided request was invalid.MAX_ELEMENTS_EXCEEDEDindicates that the product of origins and destinations exceeds the per-query limit.OVER_QUERY_LIMITindicates the service has received too many requests from your application within the allowed time period.REQUEST_DENIEDindicates that the service denied use of the Distance Matrix service by your application.UNKNOWN_ERRORindicates a Distance Matrix request could not be processed due to a server error. The request may succeed if you try again.
Element-level Status Codes
OKindicates the response contains a validresult.NOT_FOUNDindicates that the origin and/or destination of this pairing could not be geocoded.ZERO_RESULTSindicates no route could be found between the origin and destination.
Error Messages
When the top-level status code is other than OK, there may be an additional
error_message field within the Distance Matrix response object. This field contains
more detailed information about the reasons behind the given status code.
Note: This field is not guaranteed to be always present, and its content is subject to change.
Rows
When the Google Maps Distance Matrix API returns results, it places them within a JSON
rows array. Even if no results are returned (such as when the
origins and/or destinations don't exist), it still returns an empty array.
XML responses consist of zero or more <row> elements.
Rows are ordered according to the values in the origin
parameter of the request. Each row corresponds to an origin, and each
element within that row corresponds to a pairing of the
origin with a destination value.
Each row array contains one or more element
entries, which in turn contain the information about a single
origin-destination pairing.
Elements
The information about each origin-destination pairing is returned in an
element entry. An element contains the following
fields:
status: See Status Codes for a list of possible status codes.duration: The length of time it takes to travel this route, expressed in seconds (thevaluefield) and astext. The textual representation is localized according to the query'slanguageparameter.duration_in_traffic: The length of time it takes to travel this route, based on current and historical traffic conditions. See thetraffic_modelrequest parameter for the options you can use to request that the returned value is optimistic, pessimistic, or a best-guess estimate. The duration is expressed in seconds (thevaluefield) and astext. The textual representation is localized according to the query'slanguageparameter. The duration in traffic is returned only if all of the following are true:- The request includes a
departure_timeparameter. - The request includes a valid API key, or a valid Google Maps APIs Premium Plan client ID and signature.
- Traffic conditions are available for the requested route.
- The
modeparameter is set todriving.
- The request includes a
distance: The total distance of this route, expressed in meters (value) and astext. The textual value uses the unit system specified with theunitparameter of the original request, or the origin's region.fare: If present, contains the total fare (that is, the total ticket costs) on this route. This property is only returned for transit requests and only for transit providers where fare information is available. The information includes:currency: An ISO 4217 currency code indicating the currency that the amount is expressed in.value: The total fare amount, in the currency specified above.text: The total fare amount, formatted in the requested language.
Below is an example of an element containing fare information:
{
"status": "OK",
"duration": {
"value": 340110,
"text": "3 jours 22 heures"
},
"distance": {
"value": 1734542,
"text": "1 735 km"
}
"fare" : {
"currency" : "USD",
"value" : 6,
"text" : "$6.00"
},
}
The sensor Parameter
The Google Maps API previously required that you include the
sensor parameter to indicate whether your application used a
sensor to determine the user's location. This parameter is no longer
required.
