在 DirectionFinder 中更改 setAvoid() 后计算持续时间和距离时出现问题



无论我是否希望避开高速公路或收费站,我都会收到相同的持续时间和距离

怀疑问题要么是我的操作顺序,要么是我计算距离和持续时间的方式

我尝试以两种不同的方式设置 setVoid(请参阅代码(,并更改了我的 if 语句以适应 HTML 表单(复选框(可能返回的内容。

我也尝试将 if 语句切换为"return formObject.avoid1"这向我表明 if 语句运行正常 - 所以 .setReduce 没有按照我编写的方式工作,或者距离和持续时间计算没有考虑 setVoid。

function processForm(formObject) {
  var allDestinations = [formObject.destination1, formObject.destination2, formObject.destination3, formObject.destination4];
  var allDest = [formObject.dest1, formObject.dest2, formObject.dest3, formObject.dest4];
  var numWaypoints = 0;
  var waypoints = [];
  for (var i=0; i<=allDestinations.length; ++i){
    if (allDestinations[i] == "TRUE"){
      numWaypoints ++;
      waypoints.push(allDest[i]);
      }
    }  
  var mapObj = Maps.newDirectionFinder();
  mapObj.setOrigin(formObject.origin)
        .setDestination('my address, never changes');
//the purpose of legOne is to get the distance & duration from me to the input origin. I will always be the first and last stop. I do it this way because the input origin always needs to be the first stop. This prevents 'optimize waypoints' from altering the input origin.
  var legOne = mapObj.getDirections();
  var totalDistance = legOne["routes"][0]["legs"][0]["distance"]["value"];
  var totalDuration = legOne["routes"][0]["legs"][0]["duration"]["value"];
  for (var cc=0; cc<numWaypoints; ++cc){
    mapObj.addWaypoint(waypoints[cc]);
    }
  if (formObject.optimize == "true"){
    mapObj.setOptimizeWaypoints(true);
    }
  if (formObject.avoid1 == "yes"){
    mapObj.setAvoid(Maps.DirectionFinder.Avoid.HIGHWAYS);
    }
  if (formObject.avoid2 == "yes"){
    mapObj.setAvoid("tolls");
    }
  var directions = mapObj.getDirections();
  var bestRoute = directions["routes"][0];
  var numLegs = bestRoute["legs"].length;
  for (var c=0; c<numLegs; ++c){
    var legNum = directions["routes"][0]["legs"][c];
    var legDistance = legNum["distance"]["value"];
    var legDuration = legNum["duration"]["value"];
    totalDistance += legDistance;
    totalDuration += legDuration;
    }
  var miles = totalDistance * 0.000621371;
  var driveTime = totalDuration / 60 / 60;
  var numPallets = formObject.numPallets;
  var parkTime = numWaypoints * (1/6);
  var onOffLoadTime = numPallets * .5;
  var totalTime = driveTime + parkTime + onOffLoadTime;
  var dataArray = [miles, totalTime, driveTime, numPallets, onOffLoadTime, numWaypoints, parkTime]; 
  return dataArray;  
}

如果我们实际上避开高速公路,我希望持续时间会增加,但无论我们是否避开高速公路,我都会得到相同的持续时间

一次

只能设置一种setAvoid()模式,即可以避开高速公路或收费站,但不能同时设置两者。API 中存在解决此问题的方法,但从我测试的内容来看,应用程序脚本中似乎不可用。

一些测试:

var directions = Maps.newDirectionFinder()
  .setOrigin('Times Square, New York, NY')
  .setDestination('Space Needle, Seattle, WA')
Logger.log(directions.getDirections().routes[0].legs[0].duration.text) //1 day 18 hours
directions.setAvoid("highways")
Logger.log(directions.getDirections().routes[0].legs[0].duration.text) //2 days 8 hours
directions.setAvoid("tolls")
Logger.log(directions.getDirections().routes[0].legs[0].duration.text) //1 day 20 hours

这意味着您的 if 语句应该是:

  if (formObject.avoid1 == "yes"){
    mapObj.setAvoid(Maps.DirectionFinder.Avoid.HIGHWAYS);
  } else if (formObject.avoid2 == "yes"){
    mapObj.setAvoid(Maps.DirectionFinder.Avoid.TOLLS);
    }
(

优先考虑避开高速公路(,或者,您的表单应仅包含单个避免选项(例如,mapObj.setAvoid(formObj.avoid);(。使用给定的代码,avoid2 "yes"可能会导致设置setAvoid()以避免通行费,这可能不是您路线上的一个因素。

最新更新