Я использую эту формулу для расчета расстояния между записями в моей базе данных (My)SQL, которые имеют поля широты и долготы в десятичном формате:
6371 * ACOS(SIN(RADIANS( %lat1% )) * SIN(RADIANS( %lat2% )) +
COS(RADIANS( %lat1% )) * COS(RADIANS( %lat2% )) * COS(RADIANS( %lon2% ) -
RADIANS( %lon1% )))
Заменив %lat1% и %lat2% соответствующим образом, его можно использовать в предложении WHERE для поиска записей в пределах определенного радиуса от другой записи, используя его в предложении ORDER BY вместе с LIMIT, можно найти ближайшие x записей и т. д.
Я пишу это в основном как заметку для себя, но улучшения всегда приветствуются. :)
Примечание. Как упоминает Валерион ниже, это рассчитывается в километрах. Замените 6371 на подходящий альтернативный номер, чтобы использовать метры, мили и т. д.