Обнаружение, если вы находитесь в одном километре от достопримечательности - PullRequest
4 голосов
/ 26 сентября 2011

У меня интересный вопрос.У меня есть значение широты 51.445376 и значение долготы -0.190624 (в качестве примера, скажем, это было получено слушателем местоположения андроида).Это конкретное местоположение (и его значения) представляет интерес и хранится в моей базе данных.Я использую прослушиватель местоположения на своем андроиде, и я отправлю текущее местоположение пользователей на сервер, чтобы определить, находится ли пользователь в радиусе одного километра от этой конкретной точки интереса.Кто-нибудь знает, какой алгоритм использовать, чтобы проверить, находятся ли текущие значения долготы и широты пользователей в радиусе одного километра от точки интереса долготы и широты?Или что-то, что я вижу?

Возможно, кто-то может мне помочь, так как моя математика не самая лучшая в мире.

Ответы [ 3 ]

4 голосов
/ 26 сентября 2011

Для географических координат используйте эту функцию (общественное достояние):

public static double distanceInKM(
           double latStart,double lonStart,
           double latEnd,double lonEnd
){
      latStart=Math.toRadians(latStart);
      latEnd=Math.toRadians(latEnd);
      return 6370.997*Math.acos(
              Math.cos(Math.toRadians(lonEnd - lonStart))*Math.cos(latStart)*
              Math.cos(latEnd)+Math.sin(latStart)*Math.sin(latEnd));
}

Существует как минимум два популярных способа расчета географического расстояния: метод Гаверсайна и метод Винсенти.Хотя Винсенти очень точен, он также немного сложен для ваших нужд.Метод выше показывает функцию расстояния, основанную на сферическом законе косинусов.

1 голос
/ 26 сентября 2011

Эта публикация за 2008 год может быть полезной .

Он ссылается на описание MovableType о том, как использовать формулу Хаверсайна для вычисления расстояния между двумя точками на сфере. Важно отметить, что она не на 100% точна, поскольку Земля не является идеальной сферой (ее экваториальный радиус составляет около 20 км от полярного радиуса), но ее должно быть достаточно для ваших нужд.

Ссылка MovableType также описывает, как использовать равноугольную проекцию (перевод широты / долготы в прямоугольные координаты) и теорему Пифагора для определения более грубой (но более быстрой) аппроксимации расстояния (хорошо для небольших расстояний ~ 1 -2km.)

0 голосов
/ 26 сентября 2011

Простое решение: просто найдите расстояние, сначала найдя dx и dy.

Скажем, у меня есть точка 1 (p1) и точка 2 (p2)

dx = p2.x- p1.x;dy = p2.y - p1.y;

Теперь найдите расстояние d следующим образом:

d = sqrt (dx ^ 2 + dy ^ 2)

В программированииВ языке, подобном Java, вы можете использовать следующие строки:

double d = Math.sqrt(dx*dx + dy*dy);

Надеюсь, что это поможет вам в качестве отправной точки!

Примечание: x & y должно быть рассчитано соответственно для вашей широковещательной информации.Я собирался написать небольшой фрагмент кода, но увидел, что у кого-то есть хорошее решение (я проголосовал за его ответ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...