当选择当前位置时,是否有办法让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的地址。
由于美国邮政编码不是特定的地点,我不是在寻找确切的距离...所以"附近"可以用于引用目的。有什么建议吗?
答案 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>