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.
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