$address = 'ул. Габричевского, 8';
echo findMetro($address); // Щукинская
function findMetro($address) {
// Определение координат заданного адреса
$address = str_replace(' ', '%20', $address);
$contentGeocoder = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?key=QWERTY1234&address=Москва,%20$address"); // ключ получил на console.developers.google.com/apis
$jsonGeocoder = json_decode($contentGeocoder, true);
$latitudeFrom = $jsonGeocoder["results"][0]["geometry"]["location"]["lat"];
$longitudeFrom = $jsonGeocoder["results"][0]["geometry"]["location"]["lng"];
// Подключение к базе данных с таблицей метро
include '../php/db_connection.php';
$link = mysqli_connect($host, $user, $password, $database) or die("Не удалось подключиться к базе данных");
// Определение ближайшего метро путём перебора
$min = 10000000;
for($metroI = 1; $metroI <= 250; $metroI++) {
// Запрос на выборку для определения координат и названия станции метро
$result = mysqli_query($link, "SELECT name, latitude, longitude FROM metro WHERE id = $metroI");
$row = mysqli_fetch_assoc($result);
// Вычисление расстояния между заданным адресом и станцией метро по формуле Хаверсина
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($row[latitude]);
$lonTo = deg2rad($row[longitude]);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) + cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
$distance = $angle * 6371000;
// Если расстояние до станции метро меньше, чем минимальное найденное,— назначаем его минимальным, запоминаем название
if($distance < $min) {
$min = $distance;
$closestMetro = $row[name];
}
}
return $closestMetro;
}
Таблица БД с метро: название станции, координаты по широте, долготе