背景: Web サービスへのパラメーターとして経度と緯度を受け取ります。通常、小数点以下 6 桁までです。新しいリクエストが受信されると、最後に記録された場所とリクエストのパラメーターの経度/緯度の間の距離を計算します。距離が特定のしきい値のマイルよりも大きい場合は、現在の場所を更新します。
問題: geokit gem/plugin を使用して、locs 間の距離を計算します。ごくまれに、距離計算が非常に不正確な何かを返す原因となるバグ (著者のサイトで言及されているゼロ距離バグ - バグが修正されたと主張する 1.4.1 を使用していますが、まだ発生していることがわかります)が表示されます。同一の 2 点間の距離を計算する場合 (これは、ユーザーが動いていない場合に発生します)。これにより、発生してはならないユーザーの現在の場所への更新が発生しています。あなたはおそらく疑問に思っているでしょう - 正確に同じ座標になるように loc を更新するだけなら、誰が気にしますか? まあ、答えは、loc が更新されると、実際の問題になる他の多くのがらくたが発生するということです。
試みられた解決策:距離を計算する前に2つの位置が同一であるかどうかを手動でチェックするロジックを追加しようとしました。その後、計算をスキップして、そうであれば更新しません。入力パラメーターは、小数点以下 6 桁の精度の long/lats です。一方、私のデータベースでは、値を float として保存しています。これは、小数点以下 4 桁しか保存していないように見えます。これにより、float 比較が常に失敗し、不適切な loc 更新が引き続き発生します。
さて、実際の質問は次のとおりです。この比較をどのように実行すればよいですか? 受信した緯度/経度から小数点以下 2 桁を切り捨て、4 桁目が正しくなるように切り上げてから比較する必要がありますか? または、「特定の範囲内」で比較する必要がありますか (たとえば、reported_loc.long > current_loc.long - .0001 &&reported_loc.long < current_loc.long + .0001)? また、この種のことを行うための既存の ruby gem/プラグインまたは組み込み関数に関する推奨事項も大歓迎です。
ログからの出力例を次に示します。
[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
ありがとうございました
トム