Как рассчитать расстояние между двумя местами с помощью php?

Я хочу показать расстояние между отелем и пользователем.
Для расчета расстояния между отелем и адресом пользователя я использовал следующий код. Значение расстояния, которое я получаю при нажатии кнопки.

1) Сначала я получаю IP-адрес и получаю всю информацию об адресе пользователя с IP-адреса.

$ipAddress  = $_SERVER['REMOTE_ADDR'];
$result = json_decode(file_get_contents("http://ip-api.com/json/{$ipAddress}"));

Этот вызов даст мне такие детали, как город, страна, код страны, широта, долгота, почтовый индекс и т. Д. Сохранить широту и долготу.

$user_latitude = $result->lat;
$user_longitude = $result->lon;

2) У меня уже есть широта и долгота отеля в нашей базе данных.

now I have four value. User latitude/longitude and Hotel latitude/longitude
$lat1   =   $user_latitude;
$long1  =   $user_longitude;
$lat2   =   $hotel_latitude;
$long2  =   $hotel_longitude;

3) После этого, используя API Google Map, я получаю полный адрес (пользователя и отеля).

$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng={$lat1},{$long1}&sensor=true";
$url2 = "http://maps.googleapis.com/maps/api/geocode/json?latlng={$lat2},{$long2}&sensor=true";

# Get address of User
$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);
$address1 = $response_a['results'][0]['formatted_address'];

# Get address of Hotel
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url2);
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);
$address2 = $response_a['results'][0]['formatted_address'];

$find = array("'",'"');
$replace = array("","");
$address1 = str_replace($find,$replace,$address1);
$address2 = str_replace($find,$replace,$address2);

4) Наконец я использовал API матрицы расстояний от Google и получил расстояние между двумя точками.

$url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins=".$lat1.",".$long1."&destinations=".$lat2.",".$long2."&alternatives=true&mode=driving&language=de-DE&sensor=false";

$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);

$distance = $response_a['rows'][0]['elements'][0]['distance']['text'];
$time = $response_a['rows'][0]['elements'][0]['duration']['text'];

5) Расстояние сохраняется в $distance и общее время сэкономить в $ времени. Это также дает другие детали, которые вы просматриваете в $response_a, Распечатать значение $response_a,

Но все время это дает мне неправильное расстояние.

2

Решение

Этот поток имеет несколько реализаций Формула Haversine, который используется для расчета расстояния. В этот поток также включена реализация PHP, которую я явно скопировал и вставил ниже.

<?php function distance($lat1, $lon1, $lat2, $lon2) {

$pi80 = M_PI / 180;
$lat1 *= $pi80;
$lon1 *= $pi80;
$lat2 *= $pi80;
$lon2 *= $pi80;

$r = 6372.797; // mean radius of Earth in km
$dlat = $lat2 - $lat1;
$dlon = $lon2 - $lon1;
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlon / 2) * sin($dlon / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$km = $r * $c;

//echo '<br/>'.$km;
return $km;
}
?>

Все кредиты идут парню, который разместил реализацию в теме, связанной выше.

0

Другие решения

Если вы хотите расстояние между двумя точками, вы можете использовать тот, но если вы хотите расстояние маршрута, вы можете использовать API Google Directions или какой-то эквивалент.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector