Это не сложно, если у вас есть данные широты и долготы, и если кто-то даст вам формулу большого круга в формате mySQL.
@ Мэгги дала хорошую ссылку. Как эффективно найти ближайшие места поблизости от заданного местоположения
Стратегия индексации: имейте в виду, что одна минута широты (1/60 градуса) составляет одну морскую милю или 1,1515 статутных миль (приблизительно) по всему миру. Так что индексируйте столбец широты и выполняйте поиск следующим образом. (Если вы находитесь в той части мира, где используется км, вы можете преобразовать; извините за ответ на вопрос о старой Британской империи, но они определили морскую милю.)
WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
AND (the big distance formula) <= myradius
Это даст вам как приличную индексацию базы данных, так и достаточно точные дистанционные круги.
Еще одно уточнение: вы также можете индексировать долготу. Проблема в том, что расстояние от земли напрямую не связано с долготой. На экваторе это одна морская миля в минуту, но она становится меньше, а на полюсах есть особенности. Таким образом, вы можете добавить еще один термин в вашем ГДЕ. Это дает правильные результаты, но не так избирательно, как индексирование по широте. Но это все же помогает при поиске индексации, особенно если у вас есть много строк, чтобы просмотреть. Итак, вы получите:
WHERE mylat BETWEEN column.lat-(myradius*1.1515) AND column.lat+(myradius*1.1515)
AND mylon BETWEEN column.lon-(myradius*1.1515) AND column.lon+(myradius*1.1515)
AND (the big distance formula) < myradius