2

背景: 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

ありがとうございました

トム

4

2 に答える 2

3

2 つの数値が近いかどうかをテストする通常の方法は、 を使用することabsです。つまり、

 (reported_loc.long - current_loc.long).abs <= tol

ここで、tolは事前に指定された公差0.0001です。

于 2009-08-24T02:14:17.357 に答える
2

GPS 受信機は、数桁の精度で位置情報を提供できますが、測定値が実際にそれほど正確であるとは限りません。

通常、測定値の約 95% は数メートルの円内にあり、これは 32 ビット浮動小数点数で保存できる精度とほぼ同じです。

ただし、GPS ログを浮動小数点数としてマップにプロットすると、丸め誤差がはっきりとわかります。

とにかく、この比較を行うには、入力値を丸めてデータベース値と比較する代わりに、範囲を使用します。最小の動きを検出することはできなくなりますが、少なくとも誤検知はなくなります。

フロートを使用して物を保管しているので、とにかくミリメートルやセンチメートルを気にしないことは明らかです。

于 2009-08-24T02:10:47.923 に答える