Google API distance matrix with coordinates

时间:2018-03-22 23:39:42

标签: java google-maps

I am trying to write a code that would fetch destination between two physical points. My request string look like this:

"https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins="+initial[0]+"|"+initial[1]+"&destinations="+destination[0]+"|"+destination[1]+"&key="+api_key;

As a link it looks like this:

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=42.9814292|-70.9477546&destinations=51.5073509|-0.1277583&key=

The JSON response is

    {
       "destination_addresses" : [ "", "" ],
       "origin_addresses" : [ "", "" ],
       "rows" : [
          {
             "elements" : [
                {
                   "status" : "NOT_FOUND"
                },
                {
                   "status" : "NOT_FOUND"
                }
             ]
          },
          {
             "elements" : [
                {
                   "status" : "NOT_FOUND"
                },
                {
                   "status" : "NOT_FOUND"
                }
             ]
          }
       ],
       "status" : "OK"
    }

When tried without "|" the response is

    {
   "destination_addresses" : [ "51.5073509,-0.1277583" ],
   "origin_addresses" : [ "42.9814292,-70.9477546" ],
   "rows" : [
      {
         "elements" : [
            {
               "status" : "ZERO_RESULTS"
            }
         ]
      }
   ],
   "status" : "OK"
}

Where exactly is the problem? I know that it has to be the coordinates and how i put them into url but I don't understand what I have to change.

1 个答案:

答案 0 :(得分:1)

1) Your request is using a | pipe character rather than a , comma to separate the lat/lngs. Using a pipe instead of a comma is passing four origin/destinations as single number queries rather than two. You have to use the comma between the latitude and longitude

2) The supported travel modes for the Distance Matrix API are driving, transit, bicycling, and walking to get travel distances. However, the coordinates you are using correspond to the following locations:

Origin 42.9814292,-70.9477546 = 130 Water St, Exeter, NH 03833, USA

Destination 51.5073509,-0.1277583 = A4, London WC2N 5DU, UK

None of those modes will be able to give travel distances from the US to the UK, and flight mode is not a supported mode.

Please review the Distance Matrix API documentation

If you are just trying to get the absolute distance between those two lat/lngs with the Google Maps APIs, you may need to look into using computeDistanceBetween() function in the Geometry library in the Javascript API

Simple JSBin adapted from Google's Navigation functions example

<!DOCTYPE html>
<html>
  <head>
    <title>Distance between two points</title>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <style>
      /* Always set the map height explicitly to define the size of the div
       * element that contains the map. */
      #map {
        height: 100%;
      }
      /* Optional: Makes the sample page fill the window. */
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>
  <body>
    <div id="map"></div>    
    <script>
      // This example requires the Geometry library. Include the libraries=geometry
      // parameter when you first load the API. For example:
      // <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=geometry">

      var marker1, marker2;
      var poly, geodesicPoly;

      function initMap() {
        var map = new google.maps.Map(document.getElementById('map'), {
          zoom: 4,
          center: {lat: 34, lng: -40.605}
        });

        marker1 = new google.maps.Marker({
          map: map,

          position: {lat: 42.9814292, lng: -70.9477546}
        });

        marker2 = new google.maps.Marker({
          map: map,

          position: {lat: 51.5073509, lng: -0.1277583}
        });

        var bounds = new google.maps.LatLngBounds(
            marker1.getPosition(), marker2.getPosition());
        map.fitBounds(bounds);

        poly = new google.maps.Polyline({
          strokeColor: '#FF0000',
          strokeOpacity: 1.0,
          strokeWeight: 3,
          map: map,
        });

        geodesicPoly = new google.maps.Polyline({
          strokeColor: '#CC0099',
          strokeOpacity: 1.0,
          strokeWeight: 3,
          geodesic: true,
          map: map
        });

        var path = [marker1.getPosition(), marker2.getPosition()];
        poly.setPath(path);
        geodesicPoly.setPath(path);
        var heading = google.maps.geometry.spherical.computeHeading(path[0], path[1]);
        var distance = google.maps.geometry.spherical.computeDistanceBetween(path[0], path[1]);
        var midpoint = google.maps.geometry.spherical.interpolate(path[0], path[1], 0.5);
        var infoWindow = new google.maps.InfoWindow({
          content: "Distance: " + distance/1000 + " kilometers",
          position: midpoint
        });
        infoWindow.open(map);
      }
    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_KEY&libraries=geometry&callback=initMap"
        async defer></script>
  </body>
</html>