6

一位客户要求我计算从某个地址到某个固定地址的距离。我使用 Google Distance Matrix API 制作了一个 PHP 脚本来计算距离。但是,这并没有给我最短的距离。它似乎只是给出谷歌认为最好的任何东西。例如,我的脚本在 2 个地址之间返回 11.7 公里,而 Google 地图给出了以下结果:

  • 8.7公里
  • 14公里
  • 13.8公里

如您所见,8.7km 与 11.7km 有相当大的差异。

我会考虑除 Google 距离矩阵 API 之外的其他选项。

我的脚本:(简而言之)

if ($this->getVar('to', false) && $this->getVar('to', false) != '') {
    $to = urlencode(urldecode($this->getVar('to', false)));
    $url = 'http://maps.googleapis.com/maps/api/distancematrix/json?origins=Etterbeeksesteenweg+180+Brussel&destinations='.$to.'&mode=driving&language=nl-BE&sensor=false';
    $this->view->response = json_decode(file_get_contents($url));
}

我尝试添加&alternatives=true,但没有成功。

4

3 回答 3

19

DistanceMatrixService(和 DirectionsService 也是)通常不会返回最短路线,它们会返回最快路线。

使用 DirectionsService 并将附加参数alternatives设置为 true:

http://maps.googleapis.com/maps/api/directions/json?origin=bomerstraat%2018,%20peer&destination=kievitwijk%2028,%20helchteren&alternatives=true&sensor=false

当您添加alternatives-parameter 时,您还会获得替代路线,当您检查返回的结果时,您会看到它还包含 9km 路线。但是这条路线的持续时间为 17 分钟,而建议的(较长的)路线的持续时间为 16 分钟,这就是为什么较长的路线是建议的路线。

所以从返回的路线中取出最短的路线。

例子:

<?php
  //request the directions
$routes=json_decode(file_get_contents('http://maps.googleapis.com/maps/api/directions/json?origin=bomerstraat%2018,%20peer&destination=kievitwijk%2028,%20helchteren&alternatives=true&sensor=false'))->routes;

  //sort the routes based on the distance
usort($routes,create_function('$a,$b','return intval($a->legs[0]->distance->value) - intval($b->legs[0]->distance->value);'));

 //print the shortest distance
echo $routes[0]->legs[0]->distance->text;//returns 9.0 km
?>

注意:您可能会在 google-maps 和服务上得到不同的结果,因为 google-maps 会考虑当前的交通情况,但服务不会(除非您有营业执照)

于 2013-09-02T21:45:50.777 回答
3

我有一个类似的问题。

我的客户想要两个数据点。最短的路线,最短的距离“如乌鸦飞”。

我仍然将距离矩阵用于“最快”路线,因为我发现这在考虑本地数据甚至流量的情况下非常准确。

我使用两个地址的经纬度上的数学计算了直接的点到点距离 - http://www.movable-type.co.uk/scripts/latlong.html

不过,这里也可能存在问题。在我的一个案例中,距离矩阵在海港大桥上选择了一条路线,显示的距离比 lat long calc 的距离要大得多,这当然是直接在水上。

另一个小警告:任何 IP 可以对 Google Maps API 进行的调用次数是有限制的。我使用最终客户端配额而不是服务器配额将大部分点击量转移到 JavaScript 中的 API - https://developers.google.com/maps/documentation/geocoding/#Limits

于 2013-09-02T22:34:24.413 回答
0

如果有多条腿,上述解决方案将不起作用。所以,这里是我的替代版本。

public function get_shortest_route($routes)
{
    if(!$routes){
        return null;
    }

    $shortest_route = $routes[0];
    foreach($routes as $index => $route){

        if(!isset($routes[$index+1])){
            break;
        }

        $totalDistance1 = 0;
        foreach($route->legs as $leg){
            $totalDistance1 += $leg->distance->value;
        }

        $totalDistance2 = 0;
        foreach($route[$index+1]->legs as $leg){
            $totalDistance2 += $leg->distance->value;
        }

        $shortest_route = $totalDistance1 < $totalDistance2 ? $route : $routes[$index+1];

    }

    return $shortest_route;
}
于 2017-11-01T11:18:01.333 回答