2010-08-12 93 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