Я пытаюсь получить расстояние между двумя точками, используя API Карт Google. Теперь у меня есть код, который получает прямое расстояние:
Эта функция получает 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; }
Эта функция вычисляет расстояние между двумя точками на основе 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; }
Эта функция печатает расстояние на километры:
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; }
Применение:
$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';
Но этот код получает прямое расстояние. Мне нужно проехать. Как я могу проехать с помощью API карт Google?
Спасибо за вашу помощь!
Хорошо, я нашел решение с использованием матрицы расстояния: https://developers.google.com/maps/documentation/distancematrix/#DistanceMatrixRequests
Эта функция получает 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); $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; } }
Эта функция рассчитает расстояние и продолжительность движения:
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); }
Применение:
$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>'; }
Вернуть:
Расстояние: 11,2 км. Продолжительность поездки: 15 мин.
Вы можете сделать это с помощью API-интерфейсов Google Distance Matrix:
// $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>";
Вот ссылка API-интерфейсов Google Distance Matrix: https://developers.google.com/maps/documentation/distancematrix/?csw=1
API-матрица расстояний будет выполнять работу, тогда нет необходимости вычислять координаты с помощью адреса, а затем Расстояние !!
Код 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 );
Это метод, который я получил. В нем вы можете ввести любое ручное расстояние от сеансов или базы данных.
$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); ?>
Теперь трудная часть заключалась в том, как показать расстояние. Ну, с исследованиями, я получил этот ответ:
<div class=""> <?php echo $response_a['rows'][0]['elements'][0]['distance']['text']; ?> </div>
Вы можете распечатать этот результат в любом месте. Это работает для меня.