показать ближайшие места в радиусе 1 км от широты и долготы пользователя

Я недавно заявил о работе над gps-картами. У меня есть база данных со списком широты и долготы. когда пользователь обращается к моему веб-приложению, я хочу отображать места в 1 км или указанном радиусе от точки пользователя. Я пробовал использовать запрос mysql

ВЫБРАТЬ * ИЗ местоположений
ГДЕ (широта между MINLATITUDE и MAXLATITUDE)
и (долгота между MINLONGITUDE и MAXLONGITUDE)

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


person user1677685    schedule 15.01.2013    source источник
comment
Этот вопрос похож на это обсуждение stackoverflow: stackoverflow.com/questions/3168904/   -  person jeffmurphy    schedule 15.01.2013
comment
@jeffmurphy Спасибо за ваш пост. Я удивляюсь, как я могу рассчитать близость, если в моей базе данных предварительно сохранены все широты и долготы. Похоже, я должен запустить запрос, чтобы он вычислял близость, проверяя каждую запись, а в db у меня более 10000 записей. Не могли бы вы предложить лучший способ?   -  person user1677685    schedule 15.01.2013
comment
@jeffmurphy Я вычислил расстояние между широтой и долготой по формуле Хаверсина. Тем не менее, я не мог найти способ быстрее вычислить расстояние, теперь я запускаю свой алгоритм для вызова каждой записи в моей БД, что занимает много времени. Не могли бы вы предложить мне какое-либо решение для этого?   -  person user1677685    schedule 15.01.2013
comment
где вы делаете расчет? Какую базу данных вы используете в своей базе данных или в своем веб-приложении и на чем построено ваше веб-приложение? т.е. C #, Vb и т. д.   -  person 03Usr    schedule 15.01.2013
comment
Я использую C # с MySQL, я думаю, что было бы лучше выполнить расчет в базе данных и сохранить результат в столбце близости и получить записи на основе близости. Не могли бы вы сказать мне, это лучший способ быстро запустить программу?   -  person user1677685    schedule 16.01.2013


Ответы (1)


Для расстояний около 1 км Хаверсин - излишество. Используйте гораздо более простую равнопрямоугольную проекцию, чтобы узнать координаты x и y. Помните, что формула ниже широта и долгота В РАДИАНАХ. Расстояние d указано в км, потому что радиус Земли (R) указан в км. И широта / долгота выражены в радианах (да, я снова это сказал). Это устраняет несколько триггерных функций по сравнению с Haversine, что должно ускорить ваши запросы.

var R = 6371; // radius of the earth in km
var x = (lon2-lon1) * Math.cos((lat1+lat2)/2);
var y = (lat2-lat1);
var d = Math.sqrt(x*x + y*y) * R;  // distance in km

Это веб-приложение, поэтому я предполагаю, что Санта (северный полюс) и люди на станции Антарктида не будут использовать ваше приложение. Исходя из этого предположения, вы можете организовать свои точки широты и долготы в своей базе данных по долготе. Итак, если у кого-то есть долгота -76,1, вы знаете, что долготы в вашей базе данных, которые меньше -78 градусов, больше 1 км. Вы также знаете, что долгота больше -74 градуса - это тоже очень далеко. Это уменьшит количество баллов, которые вам нужно будет зарегистрировать в своей базе данных.

person TreyA    schedule 15.01.2013
comment
результат, который я получил, неверен, когда я использовал вашу формулу. Используя формулу гаверсинуса, результат верен, и спасибо за ваше объяснение о поиске координат. - person user1677685; 16.01.2013
comment
Делаете хаверсин по всем пунктам? Сначала вам нужно отсортировать данные, а затем применить приведенную выше формулу к оставшимся точкам. Нет необходимости использовать хаверсин для вычисления расстояния от Нью-Йорка до Китая. Вы знаете, что это уже больше 1 км. Приведенная выше формула действительна (movable-type.co.uk/scripts/latlong. html). Трудно сказать, не увидев часть вашего кода. - person TreyA; 16.01.2013
comment
Вы правы, мне не нужно использовать гаверсинус для большего расстояния, но мне нужно найти расстояние для одного региона (например, point1 -34.9281, 138.60132 и point2 -34.9281, 138.61932) в моей базе данных таких будет больше. Мне нужно показать только те, которые находятся в пределах 1 км. - person user1677685; 16.01.2013