class FakeRedis::GeoSet::Point
def deg_to_rad(deg)
def deg_to_rad(deg) deg * Math::PI / 180.0 end
def distance_to(other)
def distance_to(other) lat1 = deg_to_rad(@lat) lon1 = deg_to_rad(@lon) lat2 = deg_to_rad(other.lat) lon2 = deg_to_rad(other.lon) haversine_distance(lat1, lon1, lat2, lon2) end
def geohash(precision = 10)
def geohash(precision = 10) latlon = [@lat, @lon] ranges = [[-90.0, 90.0], [-180.0, 180.0]] coordinate = 1 (0...precision).map do index = 0 # index into base32 map 5.times do |bit| mid = (ranges[coordinate][0] + ranges[coordinate][1]) / 2 if latlon[coordinate] >= mid index = index * 2 + 1 ranges[coordinate][0] = mid else index *= 2 ranges[coordinate][1] = mid end coordinate ^= 1 end BASE32[index] end.join end
def haversine_distance(lat1, lon1, lat2, lon2)
def haversine_distance(lat1, lon1, lat2, lon2) h = Math.sin((lat2 - lat1) / 2) ** 2 + Math.cos(lat1) * Math.cos(lat2) * Math.sin((lon2 - lon1) / 2) ** 2 2 * EARTH_RADIUS_IN_M * Math.asin(Math.sqrt(h)) end
def initialize(lon, lat, name)
def initialize(lon, lat, name) @lon = Float(lon) @lat = Float(lat) @name = name end