使用Geocoder - Rails 4寻找附近的地方

时间:2015-09-28 13:03:46

标签: ruby-on-rails rails-geocoder

我正在使用地理编码器查找用户位置附近的地方。但是它只给出经度/纬度(或者如果以前存储了某些地方,则为附近的地方)。我想得到的是当用户将区域名称称为“自由女神像”时,结果应该显示“自由女神像”附近有特定标签的地方说“酒店”

有一个网络有很好的实施。您可以查看Here

我不是要求完整的代码片段,而是我正在寻找有用的建议,我可以如何使我的应用程序工作或我必须改变我的宝石。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:0)

要找到一个Place附近有“酒店”Tag的“自由女神像”,它将如下所示:

Place.near("statue of liberty").where(tags: [:hotel]).all

由于您绝对没有提供有关架构或模型的信息,因此我使用了通用名称。这就是我一直这样做的原因。

有关其他信息,请参阅GeoCoder docs

答案 1 :(得分:0)

使用Geonames_api

然后您可以开发功能,并发送到zipcoderadius(距离),如下所示:

def nearby(zipcode, radius)
  GeoNamesAPI.username = "yourusername@yourdomain.com"
  GeoNamesAPI.lang = :en
  geo_name_objects = GeoNamesAPI::NearbyPostalCode.where(country: "US", postalcode: zipcode, radius: radius)
  zip_codes_names = geo_name_objects.postal_codes.map{|h| h.slice("postalCode").values}.flatten.uniq - [zipcode]
end

此函数将返回当前邮政编码附近的所有邮政编码,距离小于/等于存在半径

答案 2 :(得分:0)

我个人使用geokitgeokit-rails宝石。要使用它们,您只需将acts_as_mappable :default_units => :kms(或英里)添加到您希望能够找到的模型中,然后只需使用:

示例模型:location.rb

Location.closest(origin: "statue of liberty")

作为普通的activerecord查询,可以用任何你想要的.where(tags: [:hotel])链接。

提示:geokit使用外部地理编码器,默认为谷歌地理编码器,如果过于频繁地调用则会出现超时错误。我建议使用Redis以键值方式缓存地理编码结果,例如$redis[address] = location_id,并且有一个方法可以立即检索位置(如果它位于缓存中)。这样,您可以大大降低地理位置超时错误的风险。

相关问题