2

まず、次のように考えを述べさせてください。

指定したルートまでのユーザーの距離を確認したい。ルートは複数のロケーション ポイント (図では、ポイント a、b、c、d) で構成されています。隣接する 2 つの点がベクトルを表します (図の青い線 ab、bc、cd)

ベクトル位置距離

次に、アプリケーションに移動します(特にアンドロイドですが、それはこの質問の一部ではありません)ユーザーがルートに沿って移動している間、ユーザーの位置が追跡されます。私が確認したいすべての新しい場所で、ユーザーがまだルート上にいる (または X の距離内にある) かどうかを確認します。

ルートに沿って 3 つの可能な場所を描きました。

  • 場所 1 は問題ありません。ポイント 1 からベクトル ab に垂線を下ろします。これにより、このベクトル上の位置ポイントが得られ、2 つのポイント間の距離を計算できます (android: を使用Location.distanceTo()) 。

  • 場所 2 ベクトルを扱っているため、開始も終了もありません。黒い線は、ベクトル ab の射影です。最も近い距離を計算すると、ベクトル ab までの距離は近いが、ベクトル bc からは遠い距離になります。実際、bc までの距離を計算する必要があります。これがルートの進行方法だからです。しかし、距離を計算するためにどのベクトルを選択する必要があるかをアルゴリズムで知るにはどうすればよいでしょうか?

  • 場所 3 は、ベクトル ab または bc で計算する可能性を与えてくれます。どちらもほぼ同じくらい近いです。どちらを選択するかを知る方法は?

これを切り上げるには:

私は位置点を持つ配列を持っています:

{[lat1, lon1], [lat2, lon2],[...]}

私のアプリケーションは、ユーザーの位置を追跡しています。新しい場所を配列内のこのトラックと比較したいと思います。

誰かが問題をカバーしているアルゴリズムを知っていますか、または誰かがアルゴリズムで私を助けてくれますか? (疑似コードで十分です)

//編集: Quadtree アルゴリズムについて読みました。おそらくそれは、Soonts の実装に加えてオプションです。

4

1 に答える 1

2

最初に、次の式を使用して、すべてのデータ (ユーザーの位置、ポイント) を緯度/経度から x / y km に変換します。

Y = 緯度 * 111、X = 経度 * 111 * cos(緯度)

(これは、1000 マイルを超えるルートではわずかに失敗し、極の近くで、またはパスが 180 番目の子午線を横切るときに劇的に失敗します。タスクに問題がないことを願っています)。

次に、次の式を使用して、ポイントと各セグメントの間の距離を見つけます: https://stackoverflow.com/a/1501725/126995、最小距離を検索します。ルートに 200 を超えるセグメントがある場合は、パフォーマンスの最適化が必要です。

PSこの方法の制限に不満がある場合は、球上の点と線分の間の距離の式を探してください。ただし、それらには多くの三角法が含まれていることを保証できます。安価なAndroid携帯ではうまくいかないでしょう。長いルートで高速です。

于 2013-02-16T17:51:16.960 に答える