Поиск ближайших местоположений с использованием API Карт Google - программирование
Подтвердить что ты не робот

Поиск ближайших местоположений с использованием API Карт Google

Привет, я пишу приложение, показывающее велосипедные станции возле адреса. У меня есть список местоположений широты и долготы каждой велосипедной станции из службы.

Я могу отметить свое текущее местоположение или любой адрес до сих пор. Как показать все велосипедные станции возле моего местоположения на карте. Сначала я получаю ближайшие места Google из текущего местоположения, а затем получаю доступ к базе данных для размещения велосипедов и маркерам на карте? Каков наилучший подход?

4b9b3361

Ответ 1

Если у вас уже есть координаты ваших велосипедных станций, и если вы доверяете этим данным, просто используйте его, чтобы нарисовать маркеры. Теперь вы должны определить, что означает "близко".

У вас есть разные решения для этого. Либо вы выбираете маркеры для всех велосипедных станций в пределах границ карты (но это может быть много маркеров для рисования в зависимости от уровня масштабирования, или вам нужно не допустить, чтобы ваш script рисовал маркеры до того, как определенный уровень масштабирования ) или вы можете нарисовать маркеры в пределах n километров вокруг места (может быть местоположение пользователя, координаты центра карты и т.д.).

Для второго решения, и если вы храните свои велосипедные станции в базе данных MySQL, вы можете сделать такой запрос:

$sql = "SELECT *, ( 6371 * acos( cos( radians(" . $db->real_escape_string($lat) . ") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(" . $db->real_escape_string($lng) . ") ) + sin( radians(" . $db->real_escape_string($lat) . ") ) * sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING distance < 15";

$lat и $lng являются вашими центральными координатами

lat и lng являются вашими именами столбцов MySQL

15 - радиус (в км) вокруг ваших координат

Это использует формулу Хаверсина. Хорошую информацию можно найти здесь.

Надеюсь, что это поможет, но мы не знаем, как вы организовали свои данные в своем приложении. Дайте нам больше информации, если вам нужна дополнительная помощь!

Ответ 2

На всякий случай, если кто-то ищет правильный ответ в 2016 году.

Google создает очень полезную библиотеку. В библиотеке Geometry есть много разных методов, которые могут помочь в решении этой проблемы:

computeDistanceBetween()

Этот ответ объясняет, как именно его использовать.

Обычно он рассчитывает расстояние между двумя переданными объектами LatLng.

Так что вы можете просто:

  • Получить все места расположения велосипедных станций.
  • Храните их в массиве.
  • Найти текущее местоположение пользователя.
  • Зацикливайте массив и конвертируйте местоположения в расстояния, используя упомянутый метод.
  • Сортируйте массив, чтобы получить наименьшее расстояние.

Результаты на расстоянии выражены в метрах.

Предыдущий алгоритм не может быть оптимизирован, потому что некоторые из нас могут иметь массив тысяч координат, это где метод containsLocation() становится удобно, так как вы можете сузить область испытующе, указав многоугольник можно найти внутри.

Возможно, это не самый оптимальный метод поиска ближайшего местоположения, но я считаю, что он подойдет, если в вашей базе данных имеется достаточное количество станций.

Ответ 3

У меня та же задача, и я решил с помощью формулы haversine. Вот мой пример в PHP

private function distance($latA, $lngA,$latB, $lngB) {
    $R = 6371000;
    $radiansLAT_A = deg2rad($latA);
    $radiansLAT_B = deg2rad($latB);
    $variationLAT = deg2rad($latB - $latA);
    $variationLNG = deg2rad($lngB - $lngA);

    $a = sin($variationLAT/2) * sin($variationLAT/2) 
                + cos($radiansLAT_A) * cos($radiansLAT_B) * sin($variationLNG/2) * sin($variationLNG/2);

    $c = 2 * atan2(sqrt($a), sqrt(1-$a));

    $d = $R * $c;

    return $d;
}  

И для теста я использовал эти координаты

$distance = $this->distance(-12.0972,-77.0267,-13.160616,-74.227440);

Результат должен быть 325932.546518 в метрах. Если вы хотите в км, просто разделите 325932.546518/1000= 325.932546518km

Эту же формулу можно перевести на javascript, следуя руководству haversine

Ответ 4

Google может уже иметь эти результаты, Но если у вас уже есть свои координаты для мест, которые, похоже, могут быть более простыми, чтобы просто нарисовать ваши очки.