Для баз данных, которые не поддерживают trig (например, SQLite), вы можете использовать пифагор. Даже если ваша база данных поддерживает триг, пифагор гораздо быстрее. Предостережения:
- вам нужно хранить координаты в сетке x, y вместо (или также) lat, lng;
- в расчете принимается «плоская земля», но это хорошо для сравнительно локальных поисков.
Вот пример из проекта Rails, над которым я работаю (важный бит - SQL в середине):
class User < ActiveRecord::Base
...
# has integer x & y coordinates
...
# Returns array of {:user => <User>, :distance => <distance>}, sorted by distance (in metres).
# Distance is rounded to nearest integer.
# point is a Geo::LatLng.
# radius is in metres.
# limit specifies the maximum number of records to return (default 100).
def self.find_within_radius(point, radius, limit = 100)
sql = <<-SQL
select id, lat, lng, (#{point.x} - x) * (#{point.x} - x) + (#{point.y} - y) * (#{point.y} - y) d
from users where #{(radius ** 2)} >= d
order by d limit #{limit}
SQL
users = User.find_by_sql(sql)
users.each {|user| user.d = Math.sqrt(user.d.to_f).round}
return users
end