Arrière-plan: Je reçois les paramètres long et lat as d'un service Web. Ils sont généralement jusqu'à 6 décimales. Quand une nouvelle requête est reçue, je calcule la distance entre le dernier loc enregistré et le long/lat dans les paramètres de la requête. Si la distance est supérieure à un certain seuil de miles, je mets à jour la loc actuelle.Calculs de virgule flottante avec les latitudes et les longitudes de précisions variables
Problème: J'utilise geokit gem/plugin pour calculer la distance entre les locs. Très rarement, un bug apparaît (le bug de distance zéro mentionné sur le site de l'auteur - j'utilise 1.4.1 qui prétend que le bug est corrigé, mais je le vois quand même shrug) qui fait que la distance calc retourne quelque chose faussement inexact lors du calcul de la distance entre deux points identiques (cela se produit si l'utilisateur ne bouge pas). Cela provoque des mises à jour de la loc actuelle de l'utilisateur qui ne devrait pas se produire. Vous vous demandez probablement - eh bien si c'est juste la mise à jour de la loco pour être exactement les mêmes coordonnées, qui s'en soucie? Eh bien, la réponse est qu'un tas d'autres conneries se produit lorsque la loc est mis à jour qui en fait un problème réel.
Tentative Solution: J'ai essayé d'ajouter en logique pour vérifier manuellement si les deux locos sont identiques avant de calculer la distance, puis de sauter le calc et de ne pas mettre à jour si c'est le cas. Les paramètres entrants sont longs/lats avec une précision décimale de 6; alors que dans ma base de données, je stocke les valeurs sous forme de flottants, ce qui semble ne stocker que 4 décimales. Cela provoque toujours l'échec de ma comparaison de flottant et les mises à jour inappropriées loc continuent à se produire.
Ouf, ok donc la vraie question est: Comment dois-je effectuer cette comparaison? Devrais-je tronquer 2 des positions décimales des lat/int, arrondir en quelque sorte de sorte que le quatrième chiffre soit correct et ensuite comparer? Ou, devrais-je faire une sorte de comparaison "dans une certaine plage" (par exemple report_loc.long> current_loc.long - .0001 & & reported_loc.long < current_loc.long + .0001)? Aussi, toutes les recommandations pour ruby gem/plugins existants ou intégrées dans des fonctions pour faire ce genre de chose seraient très appréciées.
Voici un exemple de sortie du journal:
[update_loc] Last location history record at lat: 41.5024, long: -81.6816
[update_loc] Current loc at lat: 41.502467, long: -81.681623
[update_loc] Distance from current loc and last loc history: 5795.10615113555 miles
[update_loc] Locs not identical and distance greater than threshold, inserting new loc history
[update_loc] Location update complete
Merci
Tom