php 使用 Google Maps API 获取两点之间的行驶距离
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29003118/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Get driving distance between two points using Google Maps API
提问by Newester
I'm trying to get drivingdistance between two points using Google Maps API. Now, I have code which get direct distance:
我正在尝试使用 Google Maps API获取两点之间的行驶距离。现在,我有获得直接距离的代码:
This function get lat and lng:
此函数获取 lat 和 lng:
function get_coordinates($city, $street, $province)
{
$address = urlencode($city.','.$street.','.$province);
$url = "http://maps.google.com/maps/api/geocode/json?address=$address&sensor=false®ion=Poland";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response_a = json_decode($response);
$return = array('lat' => $response_a->results[0]->geometry->location->lat, 'long' => $long = $response_a->results[0]->geometry->location->lng);
return $return;
}
This function calculate distance between two points based on lat & lng:
此函数根据 lat & lng 计算两点之间的距离:
function getDistanceBetweenPoints($lat1, $lon1, $lat2, $lon2) {
$theta = $lon1 - $lon2;
$miles = (sin(deg2rad($lat1)) * sin(deg2rad($lat2))) + (cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)));
$miles = acos($miles);
$miles = rad2deg($miles);
$miles = $miles * 60 * 1.1515;
$kilometers = $miles * 1.609344;
return $kilometers;
}
This function print distance by kilometers:
此功能按公里打印距离:
function get_distance($lat1, $lat2, $long1, $long2)
{
/* These are two points in New York City */
$point1 = array('lat' => $lat1, 'long' => $long1);
$point2 = array('lat' => $lat2, 'long' => $long2);
$distance = getDistanceBetweenPoints($point1['lat'], $point1['long'], $point2['lat'], $point2['long']);
return $distance;
}
Usage:
用法:
$coordinates1 = get_coordinates('Katowice', 'Korfantego', 'Katowicki');
$coordinates2 = get_coordinates('Tychy', 'Jana Paw?a II', 'Tyski');
echo 'Distance: <b>'.round(get_distance($coordinates1['lat'], $coordinates2['lat'], $coordinates1['long'], $coordinates2['long']), 1).'</b> km';
But this code get direct distance. I need driving distance. How I can get driving distance using google maps API?
但是这段代码得到了直接的距离。我需要行驶距离。如何使用谷歌地图 API 获得行驶距离?
Thanks for your help!
谢谢你的帮助!
回答by Newester
OK, I found solution using distance matrix: https://developers.google.com/maps/documentation/distancematrix/#DistanceMatrixRequests
好的,我找到了使用距离矩阵的解决方案:https: //developers.google.com/maps/documentation/distancematrix/#DistanceMatrixRequests
This function get lat & lng from city, adress, province:
此函数从城市、地址、省获取纬度和经度:
function get_coordinates($city, $street, $province)
{
$address = urlencode($city.','.$street.','.$province);
$url = "http://maps.google.com/maps/api/geocode/json?address=$address&sensor=false®ion=Poland";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response_a = json_decode($response);
$status = $response_a->status;
if ( $status == 'ZERO_RESULTS' )
{
return FALSE;
}
else
{
$return = array('lat' => $response_a->results[0]->geometry->location->lat, 'long' => $long = $response_a->results[0]->geometry->location->lng);
return $return;
}
}
This function calculate driving distance and travel time duration:
此函数计算行驶距离和行驶时间:
function GetDrivingDistance($lat1, $lat2, $long1, $long2)
{
$url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$lat1.",".$long1."&destinations=".$lat2.",".$long2."&mode=driving&language=pl-PL";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response_a = json_decode($response, true);
$dist = $response_a['rows'][0]['elements'][0]['distance']['text'];
$time = $response_a['rows'][0]['elements'][0]['duration']['text'];
return array('distance' => $dist, 'time' => $time);
}
Usage:
用法:
$coordinates1 = get_coordinates('Tychy', 'Jana Paw?a II', '?l?skie');
$coordinates2 = get_coordinates('L?dziny', 'L?dzińska', '?l?skie');
if ( !$coordinates1 || !$coordinates2 )
{
echo 'Bad address.';
}
else
{
$dist = GetDrivingDistance($coordinates1['lat'], $coordinates2['lat'], $coordinates1['long'], $coordinates2['long']);
echo 'Distance: <b>'.$dist['distance'].'</b><br>Travel time duration: <b>'.$dist['time'].'</b>';
}
Return:
返回:
Distance: 11,2 km Travel time duration: 15 min
距离:11.2 公里旅行时间:15 分钟
回答by PHP Worm...
You can do this by using Google Distance Matrix API:
您可以使用 Google 距离矩阵 API 来完成此操作:
// $details = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=Seattle&destinations=San+Francisco&mode=driving&sensor=false";
//you can also pass latitude/longitude values in origins
$details = "http://maps.googleapis.com/maps/api/distancematrix/json?origins=41.43206,-81.38992&destinations=San+Francisco&mode=driving&sensor=false";
$json = file_get_contents($details);
$details = json_decode($json, TRUE);
echo "<pre>"; print_r($details); echo "</pre>";
Here is the link of Google Distance Matrix API :- https://developers.google.com/maps/documentation/distancematrix/?csw=1
这是谷歌距离矩阵 API 的链接:- https://developers.google.com/maps/documentation/distancematrix/?csw=1
回答by Shubh
This is the method I got. In it, you can enter any manual distance from sessions or database.
这是我得到的方法。在其中,您可以输入与会话或数据库的任何手动距离。
$origin = urlencode($_SESSION['source1']);
$destination = urlencode($_SESSION['dest1']);
$url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=$origin&destinations=$destination&key=Your api key";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response_a = json_decode($response, true);
?>
Now the tough part was how to show distance. Well, with research, I got this answer:
现在困难的部分是如何显示距离。好吧,通过研究,我得到了这个答案:
<div>
<?php echo $response_a['rows'][0]['elements'][0]['distance']['text']; ?>
</div>
You can print this result anywhere. It's working for me.
您可以在任何地方打印此结果。它对我有用。
回答by Vishnu Ugale
Distance matrix API will do job then no need to calculate coordinates by using address and then Distance!!
距离矩阵 API 将完成工作,然后无需使用地址然后使用距离来计算坐标!!
Here is the API
https://maps.googleapis.com/maps/api/distancematrix/json?origins=orginaddress&destinations=destinationaddress&key=YOUR_API_KEY
PHP Code :
PHP代码:
$ch = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=orginaddress&destinations=destinationaddress&key=YOUR_API_KEY";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response_a = json_decode($response, true);
//print_( $response_a );
回答by Zahid
You can try using Google Distance Matrix API. Here is a sample HTML, PHP code in bellow. Here you must change the 'YOUR_API_KEY' with your app key.
您可以尝试使用 Google 距离矩阵 API。下面是一个示例 HTML、PHP 代码。在这里,您必须使用您的应用密钥更改“YOUR_API_KEY”。
<!DOCTYPE html>
<html>
<body>
<form action="" method="post">
<label>Origin:</label> <input type="text" name="o" placeholder="Enter Origin location" required> <br><br>
<label>Destination:</label> <input type="text" name="d" placeholder="Enter Destination location" required> <br><br>
<input type="submit" value="Calculate distance & time" name="submit"> <br><br>
</form>
<?php
if(isset($_POST['submit'])){
$origin = $_POST['o']; $destination = $_POST['d'];
$api = file_get_contents("https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=".$origin."&destinations=".$destination."&key=YOUR_API_KEY");
$data = json_decode($api);
?>
<label><b>Distance: </b></label> <span><?php echo ((int)$data->rows[0]->elements[0]->distance->value / 1000).' Km'; ?></span> <br><br>
<label><b>Travel Time: </b></label> <span><?php echo $data->rows[0]->elements[0]->duration->text; ?></span>
<?php } ?>
</body>
</html>