Как узнать ближайшую станцию метро к определённому адресу?

Я парсю адреса московских библиотек. Как мне в 2018 году по адресу получить одну ближайшую станцию метро?
$address = 'Москва, ул. Габричевского, 8';
echo findMetro($address); // Щукинская

JS API карт последней версии на данный момент
  • Вопрос задан
  • 3990 просмотров
Пригласить эксперта
Ответы на вопрос 3
@sidorchik Автор вопроса
$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;
}

Таблица БД с метро: название станции, координаты по широте, долготе
Ответ написан
Комментировать
iCoderXXI
@iCoderXXI
React.JS/FrontEnd engineer
Станций метро конечное число, я складывал их координаты в базу, а потом по методу гипотенузы вычислял расстояния в попугаях от нужной точки до разных станций и брал ближайшие в определенном радиусе.

Даже можно без базы решить, будет еще быстрее и более автономно. Даже без бэкенда можно, если на то пошло.
Ответ написан
Комментировать
inside22
@inside22
При помощи https://developers.google.com/places/supported_typ... получите список всех станций в нужном радиусе, сохраните это все в БД. Будут у вас станции о координаты.

Далее передаете адрес библиотеки и получите координаты, тоже соберите это все в БД.
https://maps.googleapis.com/maps/api/geocode/json?...

Далее передаете координаты метро и библиотеки вот этой функции и она вам вернет расстояние.
public function getDistance(float $latitudeFrom, float $longitudeFrom, float $latitudeTo, float $longitudeTo): int
    {
        $rad = M_PI / 180;
        $theta = $longitudeFrom - $longitudeTo;
        $dist = sin($latitudeFrom * $rad) * sin($latitudeTo * $rad) + cos($latitudeFrom * $rad) * cos($latitudeTo * $rad) * cos($theta * $rad);

        return acos($dist) / $rad * 60 * 1.853;
    }


Можно запариться и при помощи Google Matrix API просчитать сколько пешком топать и сколько на машине ехать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы