我有GpsLocation
模型,此模型有latitude
,longitude
和radius
属性。
我希望根据纬度,经度和半径找到GpsLocation。
所以我想说我在位置[52,4],我想找到一个具有这些精确坐标或距离radius
米的GpsLocation实例。
我正在使用geocoder
gem,但near
函数不能正常工作。还尝试了猴子修补near函数,所以我可以在查询中使用数据库列而不是变量,但仍然没有运气,有些机制在提供半径参数时将lat / long转换为范围。
感谢任何帮助
答案 0 :(得分:1)
使用Haversine formula计算球体上两点之间的距离。有一个名为haversine的宝石可以提供帮助。或者,如果您正在使用PostgreSQL,那么还有earthdistance模块。
然而,您可能会发现更容易放松对“近”的定义,因为处理圈子可能很烦人。相反,请考虑使用正方形或矩形。
假设您将“近”定义为10英里内。如果将其视为给定点的纬度和经度附近的正负因子,则可以进行简单查询以一次查找所有附近点,而不是一系列的Haversine计算。您的查询可能如下所示:
# Only accurate in the U.S.
MILES_PER_LATITUDE = 69.0
MILES_PER_LONGITUDE = 55.0
min_latitude = thisLocation.latitude - (10.0 / MILES_PER_LATITUDE)
max_latitude = thisLocation.latitude + (10.0 / MILES_PER_LATITUDE)
min_longitude = thisLocation.longitude - (10.0 / MILES_PER_LONGITUDE)
max_longitude = thisLocation.longitude + (10.0 / MILES_PER_LONGITUDE)
nearby_points = GpsLocation.where(latitude: min_latitude..max_latitude).where(longitude: min_longitude..max_longitude)