对于不支持三角函数的数据库(例如 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