2010-05-19 5 views
0

J'utilise le plugin Geokit pour calculer la distance entre le current_user et les autres utilisateurs (géocodage réellement stocké dans le modèle de profil). Pour tester, j'ai créé deux utilisateurs, un à Minneapolis, MN et un à St. Paul, MN. J'ai utilisé la gemme Geokit pour géocoder la paire lat/lng des profils dans une session IRB.Geokit distance calcul bizarrerie

J'ai changé la vue Index pour lister le nom, l'emplacement et la paire lat/lng de chaque profil. Ces valeurs correspondent aux valeurs de la base de données.

J'ai changé la vue Index pour afficher la paire lat/lng de current_user. Je me suis authentifié en tant que chaque utilisateur pour m'assurer que la paire lat/lng de current_user correspondait aux attentes. Ça faisait.

I a ajouté une méthode d'instance du modèle de profil, nommé ll, pour renvoyer les champs lat/lng comme objet LatLng:

def ll 
    #if lat and lng fields aren't empty 
    LatLng.new(self.lat,self.lng) if (!self.lat.nil? && !self.lng.nil?) 
end 

J'ai changé la requête dans l'action Index du ProfileController pour calculer les distances entre chaque utilisateur et current_user:

@profiles = Profile.find(:all, 
    :conditions => conditions, # set WHERE clause 
    :order => order_by, # set ORDER BY clause 
    :origin => current_user.profile.ll, # calculate distance based on current_user's location 
    :units => :miles # use miles 

Enfin, j'ai changé le point de vue de l'index pour afficher la distance entre le current_user et chaque utilisateur:

<%=h profile.location %> (<%= profile.ll %>) - 
<%= profile.distance.to_f.round(1) %> mi 

Lorsque j'authentifié comme utilisateur A (44,9799654, -93,2638361), les calculs de distance étaient correctes:

A (44,9799654, -93,2638361) - 0,0 mi B (44,9444101, -93,0932742) - 8,7 m

Cependant, quand j'authentifié en tant qu'utilisateur B (44,9444101, -93,0932742), les calculs de distance étaient incorrects:

A (44,9799654, -93,2638361) - 32,8 mi B (44,9444101, -93,0932742) - 41,1 mi

j'ai pu vérifier les calculs de distance entre les paires « premières » lat/lng:

a = LatLng.new(44.9799654,-93.2638361) 
=> #<Geokit::LatLng:0x1034af778 @lat=44.9799654, @lng=-93.2638361> 
>> b = LatLng.new(44.9444101,-93.0932742) 
=> #<Geokit::LatLng:0x1034aab88 @lat=44.9444101, @lng=-93.0932742> 
>> a.distance_to(b) 
=> 8.70261379563918 
>> b.distance_to(a) 
=> 8.70261379563918 

Je suis à une perte pour expliquer ce qui se passe. Toute idée serait appréciée.

Répondre

1

Qu'advient-il si vous faites:

@profiles = Profile.find(:all, 
    :conditions => conditions, # set WHERE clause 
    :order => order_by, # set ORDER BY clause 
    :origin => current_user.profile, # .ll # calculate distance based on current_user's location 
    :units => :miles # use miles 

Votre erreur me fait suspecte qu'il ya des problèmes arrondi données/de conversion en cours et: l'origine doit être capable de capter directement le lat et lng. Vous pouvez également vérifier (logger.debug) tous les types impliqués juste avant d'appeler Profile.find (...)

Je n'ai pas été capable de trouver une conversion simple qui donne ces erreurs particulières, mais c'est mon soupçon. Si cela ne vous aide pas, pouvez-vous ajouter votre sql généré à la sortie? Il pourrait être possible de comprendre ce qui ne va pas sur cette base.

Edité à ajouter:

Craig, pour faire le débogage des types, donner:

logger.debug("lat: #{current_user.profile.lat} #{current_user.profile.lat.class.to_s} lng: #{current_user.profile.lng} #{current_user.profile.lng.class.to_s}") 
logger.debug("lat: #{current_user.profile.ll.lat} #{current_user.profile.ll.lat.class.to_s} lng: #{current_user.profile.ll.lng} #{current_user.profile.ll.lng.class.to_s}") 

un essai lorsque vous rencontrez en fait l'erreur puis regardez votre development.log. (note: il peut y avoir un bogue dans ce code parce que je ne fais que le taper dans la fenêtre, mais vous avez l'idée.) Sinon, vous devriez probablement vérifier ce qui est affiché dans la requête SQL car cela afficherait le post- numéros de conversion de chaîne.

+0

MERCI! JE VOUS REMERCIE! JE VOUS REMERCIE! Cela semble être une question de conversion, mais je serai damné si je peux déterminer ce que c'est. Je voudrais jeter un oeil sur les types (logger.debug) et le sql généré. Pourriez-vous me dire comment le faire? – craig