计算位置是"越野"

时间:2016-10-03 21:37:40

标签: google-maps google-distancematrix-api

当选择当前位置时,是否有办法让Google Distance Matrix API返回最近的可驾驶位置?

一点背景:在报价过程中,我需要计算预计装运地点的估计运费。

最终目标是使用生成报价单的人输入的地址进行实时距离计算。然而,这目前通过使用邮政编码数据库来处理,其中包括我们每个工厂的里程数。例如:

| START | END   | DIST  |
-------------------------
| 47601 | 47715 | 29725 |
| 47601 | 47716 | 31741 |

这些数据已经过时了,所以我的任务是更新它,直到我们推出交互式版本为止。

我使用Google地图距离矩阵(已成功)更新了许多距离。但是,我发现了一些我似乎无法通过代码更改来解决的问题。提供给Google的邮政编码是以#34;为中心的#34;在水中(相关帖子:Distance Matrix API: Zip Code 70128 returns zero results)或在岛上(例如02543:https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=47601,%20USA&destinations=02543,%20USA),返回的状态为" ZERO_RESULTS"。

虽然可以驾车到伍兹霍尔,马萨诸塞州02543。例如266 Woods Hole Road,Woods Hole,MA 02543. Woods Hold Oceanographic Institution的地址。

由于美国邮政编码不是特定的地点,我不是在寻找确切的距离...所以"附近"可以用于引用目的。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

对失败的邮政编码进行地理编码,然后对生成的坐标进行反向地理编码,看起来会给出一组可以使用的结果。

我从你的例子中得到的结果是:

  

Boonville,IN 47601,USA至16-22 Albatross St,Woods Hole,MA 02543,USA:1,759 km in 16 hours 39 mins

     

Boonville,IN 47601,USA至23 Albatross St,Woods Hole,MA 02543,USA:1,759 km in 16 hours 39 mins

     

Boonville,IN 47601,USA to 520 Main St,Falmouth,MA 02540,USA:1,754 km in 16 hours 33 mins

代码段(使用Google Maps Javascript API DistanceMatrix服务):

var geocoder = new google.maps.Geocoder();
var service = new google.maps.DistanceMatrixService();
var map;
// https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=47601,%20USA&destinations=02543,%20USA
function initialize() {
  var map = new google.maps.Map(
    document.getElementById("map_canvas"), {
      center: new google.maps.LatLng(37.4419, -122.1419),
      zoom: 13,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

  service.getDistanceMatrix({
    origins: ["47601, USA"],
    destinations: ["02543, USA"],
    travelMode: 'DRIVING',
    unitSystem: google.maps.UnitSystem.METRIC,
    avoidHighways: false,
    avoidTolls: false
  }, function(response, status) {
    console.log("status=" + status + ", response=" + response);
    if (status != 'OK') {
      alert('Error was: ' + status);
    } else {
      var originList = response.originAddresses;
      var destinationList = response.destinationAddresses;
      var outputDiv = document.getElementById('output');
      outputDiv.innerHTML = '';

      for (var i = 0; i < originList.length; i++) {
        var results = response.rows[i].elements;
        for (var j = 0; j < results.length; j++) {
          if (results[j].status != 'OK') {
            alert("result[" + j + "] Error was: " + results[j].status);
            geocoder.geocode({
              'address': destinationList[i]
            }, reverseGeocodeResult);
            break;
          }
          outputDiv.innerHTML += originList[i] + ' to ' + destinationList[j] +
            ': ' + results[j].distance.text + ' in ' +
            results[j].duration.text + '<br>';
        }
      }
    }
  });
}

function reverseGeocodeResult(response, status) {
  if (status == 'OK') {
    geocoder.geocode({
      latLng: response[0].geometry.location
    }, findDistancesToResponses);
  }
}

function findDistancesToResponses(response, status) {
  var destArr = [];
  for (var i = 0; i < response.length; i++) {
    destArr.push(response[i].geometry.location);
  }
  service.getDistanceMatrix({
    origins: ["47601, USA"],
    destinations: destArr,
    travelMode: 'DRIVING',
    unitSystem: google.maps.UnitSystem.METRIC,
    avoidHighways: false,
    avoidTolls: false
  }, function(response, status) {
    var originList = response.originAddresses;
    var destinationList = response.destinationAddresses;
    var outputDiv = document.getElementById('output');
    outputDiv.innerHTML = '';

    for (var i = 0; i < originList.length; i++) {
      var results = response.rows[i].elements;
      for (var j = 0; j < results.length; j++) {
        if (results[j].status != 'OK') {
          alert("result[" + j + "] " + destinationList[j] + " Error was: " + results[j].status);
        }
        outputDiv.innerHTML += originList[i] + ' to ' + destinationList[j] +
          ': ' + results[j].distance.text + ' in ' +
          results[j].duration.text + '<br>';
      }
    }
  })
}
google.maps.event.addDomListener(window, "load", initialize);
html,
body,
#map_canvas {
  height: 100%;
  width: 100%;
  margin: 0px;
  padding: 0px
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=geometry,places&ext=.js"></script>
<div id="map_canvas"></div>
<div id="output"></div>