2010-08-12 101 views
4

我使用的geokit宝石和插件与轨道3似乎有一个已知的问题与他们,可以在这里看到http://github.com/andre/geokit-rails/issues#issue/15Geokit和轨道3

现在,我试图按照在提供的解决方案底部。我将该函数定义粘贴到文件末尾,位于acts_as_mapable上方,第一次被调用后,但每次都没有发生。

任何想法还有什么可以做的?

感谢

回答

1

对于那些仍然有geokit麻烦,我转移到使用mongodb ...其中内置的距离搜索n所有...

0

嘿艾米特,不知道如果你整理了这一点,但是我会告诉你我以防万一做。

我分叉安德烈的geokit护栏源,然后克隆它在本地和在lib/geokit-rails/acts-as-mappable.rb34线从this gist添加的代码,只需读取module ClassMethods # :nodoc:行之后。

然后我将这些变化提交回github上的分叉回购,并使用我的fork将源代码安装为我的rails 3应用程序的插件。这似乎马上工作,但请确保您已将acts_as_mappable行添加到您希望进行距离计算的任何模型中,并确保在该数据库:lat:lng之间有两个float列。

+0

嘿!是的,这工作,但由于某种原因,该插件没有与轨道3 nemore ...所以我只是自己做的插件;) – Amit 2010-10-08 07:40:22

7

我碰到类似的问题,将我的应用程序升级到rails 3.我仍然使用Geokit进行地理编码,但Active Record范围用于基于距离的数据库查询。这非常方便,你仍然可以获得Active Record 3的所有优点。下面是我的用户模型的示例:

scope :near, lambda{ |*args| 
        origin = *args.first[:origin] 
        if (origin).is_a?(Array) 
        origin_lat, origin_lng = origin 
        else 
        origin_lat, origin_lng = origin.lat, origin.lng 
        end 
        origin_lat, origin_lng = deg2rad(origin_lat), deg2rad(origin_lng) 
        within = *args.first[:within] 
        { 
        :conditions => %(
         (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+ 
         COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+ 
         SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) <= #{within} 
        ), 
        :select => %(users.*, 
         (ACOS(COS(#{origin_lat})*COS(#{origin_lng})*COS(RADIANS(users.lat))*COS(RADIANS(users.lng))+ 
         COS(#{origin_lat})*SIN(#{origin_lng})*COS(RADIANS(users.lat))*SIN(RADIANS(users.lng))+ 
         SIN(#{origin_lat})*SIN(RADIANS(users.lat)))*3963) AS distance 
        ) 
        } 
       } 

这里有一个博客帖子关于这个问题的更详细一点:http://stcorbett.com/code/distance-queries-with-rails-3-without-geokit/

+0

有用的博客帖子stcorbett。从数据库获得距离很方便,可链式示波器很好。我要提醒的是,新字段将显示在用户模型(在这种情况下),您可能想要命名该字段以指示其不是用户的永久属性,而是与其他用户的距离。 – 2010-10-12 21:26:32

+0

Ahh,有趣的一点。我可以看到,根据查询计算距离的用户来命名新属性。例如:“distance_to_user _#{origin.id}”。当你想要使用距离数据时,这会给你一个额外的跳跃。好东西。 – stcorbett 2010-10-12 21:31:08

4

jlecour's port to rails 3应该解决你去年遇到的任何问题。

如果您正在进行距离计算,请确保您使用的是mysql或postgres。

3

在Rails 3.1上安装geokit-rails3 gem出现问题后,我转移到geocoder gem。它也有距离计算(请务必不要忘记@ your_model.nearby * s *(5)中的s)。还有一个Railscast