根据动态半径查找另一个gps位置

时间:2017-01-23 16:07:40

标签: ruby-on-rails ruby-on-rails-4 geocoding

我有GpsLocation模型,此模型有latitudelongituderadius属性。

我希望根据纬度,经度和半径找到GpsLocation。

所以我想说我在位置[52,4],我想找到一个具有这些精确坐标或距离radius米的GpsLocation实例。

我正在使用geocoder gem,但near函数不能正常工作。还尝试了猴子修补near函数,所以我可以在查询中使用数据库列而不是变量,但仍然没有运气,有些机制在提供半径参数时将lat / long转换为范围。

感谢任何帮助

1 个答案:

答案 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)