Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get driving distance between two points using Google Maps API

Tags:

php

I'm trying to get driving distance between two points using Google Maps API. Now, I have code which get direct distance:

This function get lat and 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&region=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:

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?

Thanks for your help!

like image 773
Newester Avatar asked Mar 12 '15 06:03

Newester


People also ask

Can Google Maps API calculate distance between two points?

The API returns information based on the recommended route between start and end points. You can request distance data for different travel modes, request distance data in different units such kilometers or miles, and estimate travel time in traffic.

Is Google Distance Matrix API free?

The Distance Matrix API uses a pay-as-you-go pricing model.


1 Answers

OK, I found solution using distance matrix: 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&region=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

like image 58
Newester Avatar answered Oct 14 '22 03:10

Newester