谷歌距离矩阵 JSON 最短路径 (PHP)

Posted

技术标签:

【中文标题】谷歌距离矩阵 JSON 最短路径 (PHP)【英文标题】:Google Distance Matrix JSON shortest path (PHP) 【发布时间】:2013-09-05 15:18:57 【问题描述】:

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

8.7公里 14公里 13.8公里

如您所见,8.7 公里与 11.7 公里相差甚远。

我会考虑 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,但没有成功。

【问题讨论】:

为什么不给我们目标字符串或地理代码让我们自己测试呢? 你能否澄清一下,你被要求计算距离,然后你谈论旅行时间。距离,你的意思是=公里?分钟?你的目标是什么? 对不起,我不清楚。旅行时间与它无关。结果应该是以公里为单位的最短距离。这些距离是通过起点“kievitwijk 28, helchteren”和目的地“bomerstraat 18, peer”获得的。结果的 URL 将是 maps.googleapis.com/maps/api/distancematrix/… 啊,API 以什么方式提供了错误的最短距离——它实际上在地理上不正确吗?还是不是乌鸦飞的那样? 如果您在路线请求中使用 provideRouteAlternatives 选项,则返回 9.0 公里的结果:example 【参考方案1】:

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

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;

【讨论】:

【参考方案2】:

我也有类似的问题。

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

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

我在两个地址的经纬度上使用数学计算了直接的点到点距离 - 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

【讨论】:

【参考方案3】:

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-参数时,您还会获得替代路线,当您检查返回的结果时,您会看到它还包含 9 公里路线。但是这条路线的时长为 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 会考虑当前的交通状况,但服务不会(除非您有营业执照)

【讨论】:

这正是我所需要的。谢谢。

以上是关于谷歌距离矩阵 JSON 最短路径 (PHP)的主要内容,如果未能解决你的问题,请参考以下文章

最短路径(dijistra)

算法Dijkstra算法(单源最短路径问题) 邻接矩阵和邻接表实现

谷歌距离地图,从给定地址/Lat,Lng 和自定义标记的最短路径,一个是默认选择当前位置,一个是自定义

最短路径算法

算法总结图论-最短路径

Floyd 的最短路径算法 C++