2016-10-03 93 views
0

有没有办法让Google距离矩阵API返回当前位置选取的位置时最近的驾驶位置?位置“越野”时计算距离

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

最终目标是使用生成报价单的人员输入的地址进行实时距离计算。但是,目前这是通过使用邮政编码数据库处理的,每个工厂都有里程数。例如:

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

这个数据是旧的,所以我一直负责更新它,直到我们可以推出交互式版本。

我正在使用Google Maps Distance Matrix(成功)更新许多距离。不过,我遇到了一些我似乎无法通过代码更改散列出来的东西。当提供给Google的邮政编码“在水中”(相关帖子: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”。

虽然有可能开车去伍兹霍尔,MA 02543。例如,伍兹霍尔266 Woods Hole Road,MA 02543.伍兹举办海洋学研究所的地址。

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

+0

多少地方是什么呢?你有没有尝试对他们进行地理编码,看看你是否得到了结果?它看起来像对邮编进行地理编码,然后反向地理编码得到的坐标可能会给你一组可用的结果。 – geocodezip

回答

1

对发生故障的邮政编码进行地理编码,然后对得到的坐标进行反向地理编码,就像它会给出一组可用的结果。

结果我从这样做,你的例子得到的是:

布恩维尔,IN 47601,USA以16-22信天翁街,伍兹霍尔,MA 02543,USA:在16小时内39分钟1759公里

布恩维尔,IN 47601,USA至23信天翁圣,伍兹霍尔,MA 02543,USA:1759公里在16小时内39分钟

布恩维尔,IN 47601,USA以520 MAIN ST,法尔茅斯,MA 02540,美国:16小时1,754千米33分钟

代码段(使用谷歌地图API的Javascript服务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>

+0

有趣的是,如果它处理了这个问题,我会给予这个机会并接受。 – DragonYen