我正在使用地理编码器查找用户位置附近的地方。但是它只给出经度/纬度(或者如果以前存储了某些地方,则为附近的地方)。我想得到的是当用户将区域名称称为“自由女神像”时,结果应该显示“自由女神像”附近有特定标签的地方说“酒店”
有一个网络有很好的实施。您可以查看Here
我不是要求完整的代码片段,而是我正在寻找有用的建议,我可以如何使我的应用程序工作或我必须改变我的宝石。任何帮助将不胜感激
答案 0 :(得分:0)
要找到一个Place
附近有“酒店”Tag
的“自由女神像”,它将如下所示:
Place.near("statue of liberty").where(tags: [:hotel]).all
由于您绝对没有提供有关架构或模型的信息,因此我使用了通用名称。这就是我一直这样做的原因。
有关其他信息,请参阅GeoCoder docs。
答案 1 :(得分:0)
使用Geonames_api。
然后您可以开发功能,并发送到zipcode
和radius
(距离),如下所示:
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)
我个人使用geokit
和geokit-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
,并且有一个方法可以立即检索位置(如果它位于缓存中)。这样,您可以大大降低地理位置超时错误的风险。