Эффективный способ выделить все точки внутри радиуса - PullRequest
0 голосов
/ 05 февраля 2019

Я работаю с приложением середины стека.поэтому у меня есть коллекция mongodb, которая содержит места по всему миру.Схемы выглядят следующим образом.

[{
address : "example address",
langitude : 79.8816,
latitude : 6.773
},
{...}]

Какой эффективный способ выделить все точки внутри окружности (предварительно определенная точка и предварительно определенный радиус) .. ??

Используя SQL-запрос, мы также можем это сделать.Но я хочу эффективный способ, не повторяя одну за другой, и проверяю, находится ли он внутри этого радиуса или нет.

1 Ответ

0 голосов
/ 05 февраля 2019

Расстояние d между двумя точками с координатами {lat1, lon1} и {lat2, lon2} задается как

d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
    cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))

Выше формула дает d в радианах.Чтобы получить ответ в км, используйте формулу ниже.

distance_km ≈ radius_km * distance_radians ≈ 6371 * d

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

Лучший подход

Вы можете использовать Elasticsearch , которыйподдерживает геолокационные запросы для повышения производительности.

...