2015-02-05 68 views
-1

我使用谷歌地图距离矩阵API来查找一组源和目标之间的距离和持续时间。我试图找到澳大利亚悉尼任何两个郊区之间的距离。对于特定的来源和目的地,当我更改来源的目的地和目的地来源时,我会得到不同的结果。我在PHP函数如下:谷歌距离矩阵给出了不同的距离,以改变源和目的地

private function getDistance($from, $to, &$error,&$estimated_time) { 
     $start =urlencode($from.'+Sydney+Australia'); 
     $destination = urlencode($to.'+Sydney+Australia'); 
     $mode = "driving"; 
     $json_resp = file_get_contents("http://maps.googleapis.com/maps/api/distancematrix/json?origins=$start&destinations=$destination&mode=$mode&language=en-EN&sensor=false"); 
     dd($json_resp); 
     $data = json_decode($json_resp); 
     $distance = $data->rows[0]->elements[0]->distance->value; 
     $time = $data->rows[0]->elements[0]->duration->value; 
     if(empty($distance) || empty($time)){ 
      $error='Empty data received. Could not find distance and duration between '.$from.' and '.$to; 
      $estimated_time='N/A'; 
      return 0.00;    
     }else{ 
      $estimated_time=$this->secondsToTime($time); 
      return floatval($distance/1000); 
     } 
    } 

以下是来自API的响应时,从=“CBD”和$到='悉尼诠释源$。飞机场'。

串(569)“{ “destination_addresses”: “是的Optus的悉尼 国际机场,机场路,吉祥物NSW 2020年,澳大利亚”], “origin_addresses”: “悉尼新南威尔士州,澳大利亚”], “行数”:[{“distance”:{“text”:“9.5 km”,“value”:9482}, “duration”:{“text”:“16分钟”,“值 “:930}, ”状态“: ”OK“} ]}], ”状态“: ”OK“}”

但是,输出是非常不同的,当从='悉尼诠释源$。机场'和$至='CBD',如下所示。

串(572)“{ “destination_addresses”: “悉尼新南威尔士州,澳大利亚”], “origin_addresses”: “是的Optus的悉尼国际机场, 机场路,吉祥物NSW 2020年,澳大利亚”], “rows”:[{“elements” :[{“distance”:{“text”:“17.5 km”,“value”:17513},“duration” :{“text”:“18 mins”值 “:1075}, ”状态“: ”OK“}]}], ”状态“: ”OK“}”

对于同一套郊区的,我越来越9.5公里和17.5公里这是相当不同的。任何人都可以建议吗?我使用Laravel框架在PHP中进行编程。

+2

也许谷歌足够聪明,可以识别单向街道....或者你应该问谷歌自己 – 2015-02-05 15:55:05

+0

@MarkBaker谷歌确实会这么说,因为他们应该在这里有员工,但是,你有没有测试过OP这在谷歌地图确切的查询和位置,看看你的API返回的数据是否与谷歌地图相匹配,因为马克可能是正确的,它遵循一种方式街道会改变数字 – 2018-03-09 12:28:47

回答

0

这是我的代码来检查步骤。

$origin =urlencode('Optus Sydney International Airport, Airport Drive, Mascot NSW 2020, Australia'); 
$destination = urlencode('Sydney NSW, Australia'); 

$url = "http://maps.googleapis.com/maps/api/directions/json?origin=$origin&destination=$destination&sensor=false"; 
$data = @file_get_contents($url); 
$data = json_decode($data,true); 
foreach($data[routes][0][legs] as $val){ 
    echo '<h4>' . $val[distance][text].'</h4>'; 
    foreach ($val[steps] as $v){ 
    echo $v[distance][text] . ' ' . $v[duration][text] . ' ' . $v[html_instructions] . ' ' . $v[end_location][lat] . ',' . $v[end_location][lng] . '<br>'; 
    } 
} 
echo "<hr>"; 
$url = "http://maps.googleapis.com/maps/api/directions/json?origin=$destination&destination=$origin&sensor=false"; 
$data = @file_get_contents($url); 
$data = json_decode($data,true); 
foreach($data[routes][0][legs] as $val){ 
    echo '<h4>' . $val[distance][text].'</h4>'; 
    foreach ($val[steps] as $v){ 
    echo $v[distance][text] . ' ' . $v[duration][text] . ' ' . $v[html_instructions] . ' ' . $v[end_location][lat] . ',' . $v[end_location][lng] . '<br>'; 
    } 
} 

结果

1.0 km 1 min Head west on Airport Dr toward Link Rd -33.9311912,151.1638899 
0.4 km 1 min Take the ramp on the right to Metroad 5/Metroad 3/Rockdale/Sydney/Sydney Southwest -33.9338978,151.1613411 
0.9 km 1 min Continue onto Marsh St -33.937509,151.1533556 
0.3 km 1 min Slight left onto the Metroad 5 ramp to Port Botany/Sydney -33.939696,151.1553088 
1.8 km 2 mins Merge onto M5 -33.9459699,151.1724068 
11.4 km 10 mins Continue onto M1 
Partial toll road 
-33.871314,151.2179597 
0.3 km 1 min Take the exit toward City North 
Toll road 
-33.8685533,151.2180181 
29 m 1 min Slight left toward Sir John Young Cres (signs for Macquarie Street/City) -33.8683378,151.2178461 
0.2 km 1 min Keep left, follow signs for Sir John Young Cres -33.867197,151.2163908 
0.2 km 1 min Slight left onto Sir John Young Cres -33.8665953,151.2146068 
0.2 km 1 min Continue onto Shakespeare Pl -33.8658241,151.2129679 
0.1 km 1 min Turn left onto Macquarie St -33.8665564,151.2124343 
0.5 km 2 mins Turn right onto Hunter St -33.865537,151.2072971 
0.2 km 1 min Turn left onto George St -33.8674649,151.207086 

1.7 km 4 mins Head south on George St toward Barrack St -33.8828335,151.2041774 
0.3 km 1 min Slight left onto Lee St -33.8853847,151.2029028 
1.2 km 2 mins Continue onto Regent St -33.8951109,151.1991316 
0.7 km 1 min Continue onto Botany Rd -33.9014863,151.2011191 
0.1 km 1 min Turn right onto McEvoy St -33.9017513,151.200088 
0.5 km 1 min Turn left at the 1st cross street onto Wyndham St -33.905706,151.2019072 
54 m 1 min Continue onto Green Square -33.9061048,151.2022107 
3.1 km 4 mins Turn right onto O'Riordan St -33.9306923,151.186595 
0.2 km 1 min Turn right onto Robey St -33.9312613,151.1842737 
1.0 km 1 min Turn right onto Qantas Dr -33.9259671,151.1785015 
0.5 km 1 min Continue onto Airport Dr 

你可以尝试使用方向,而不是距离,并指定航点。

单航点

$waypoints= '-33.9306923,151.186595' 

多个航点

$waypoints= '-33.9306923,151.186595|33.9312613,151.1842737' 

用于API:

destination=$destination&waypoints=-`33.9306923,151.186595|33.9312613,151.1842737&sensor` 

最简单的方法将是谷歌向路线
enter image description here enter image description here

+0

有什么意义?在这两种情况下,我看到了相同的经纬度和经度? – sangam 2015-02-05 16:22:13

+0

现在你明白了吗? – Misunderstood 2015-02-05 16:59:48

+0

好吧,明白了。收费公路略有差异。主要的差异似乎在路线本身。我怎么能在两种情况下取​​得相同的结果,请问你能提出建议吗?我想要获得最快路线的距离。 – sangam 2015-02-05 17:44:15

0

您得到不同结果的原因是因为您正在使用API​​ API调用而不是距离矩阵API。

方向API将为您提供当前场景中行程时间最短的路线。根据路线的不同,路线可能会发生变化,并可能为同一组起点和目的地有不同的路线。

要获得相同的距离使用距离矩阵API调用看起来像这样:

https://maps.googleapis.com/maps/api/distancematrix/output?parameters 

希望这将帮助!

+0

这就是导致问题的原因。如果您注意到OP代码中的API链接:http://maps.googleapis.com/maps/api/distancematrix/json?origins=$start&destinations=$destination&mode=$mode&language= en-EN&sensor = false'我正在使用distance来了解为什么在路由和路由之间存在差异。 – Misunderstood 2015-02-05 18:44:10

+0

顺便说一下:API的距离和方向都给出了相同的值。 – Misunderstood 2015-02-05 19:01:29

-1

您可以尝试检索从谷歌服务器JSON:

例子:

https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=Hyderabad+Telangana+%20India&destinations=Mumbai+Maharashtra+India

返回:

{ 
    "destination_addresses" : [ "Mumbai, Maharashtra, Índia" ], 
    "origin_addresses" : [ "Hyderabad, Telangana, Índia" ], 
    "rows" : [ 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "441 mi", 
        "value" : 709884 
       }, 
       "duration" : { 
        "text" : "13 horas 3 minutos", 
        "value" : 46984 
       }, 
       "status" : "OK" 
      } 
     ] 
     } 
    ], 
    "status" : "OK" 
} 

然后,使用任何信息需要,如:

$url = 'https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=Hyderabad+Telangana+%20India&destinations=Mumbai+Maharashtra+India'; 
$json = file_get_contents($url); 
$result = json_decode($json, true); 
echo $result['rows'][0]['elements'][0]['distance']['text']."<br/>"; 
echo $result['rows'][0]['elements'][0]['duration']['text']; 
+1

只有代码的答案是不可接受的,请解释为什么这个答案可以解决OP有问题。 – 2018-03-09 12:29:31