三角関数をサポートしないデータベース (SQLite など) では、ピタゴラスの定理を使用できます。
データベースが三角関数をサポートしている場合でも、これはより高速な方法ですが、次の注意事項があります。
- lat、lngの代わりに(または同様に)x、yグリッドに座標を保存する必要があります。
- 計算は「平らな地球」を前提としていますが、これは比較的ローカルな検索には問題ありません。
これは、私が取り組んでいる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