2016-04-26 7 views
12

検索はいくつか行いましたが、適切な回答が見つかりませんでした。サーバーに保存された場所の近接性に関する警告

私のアプリは近接のために複数の場所と比較する必要があります。これは、locationManagerを使用して近接性を確認するために、すべての場所をアプリに保存できないことを意味します。私は近接確認がサーバーで行われるようにしたい

これを実装する最良の方法は何でしょうか?

デバイスが移動するたびに近接性の確認を求めるのが賢明でしょうか?

+0

デバイスがデバイスに通知されるまでの時間が近づいてからどの程度の遅延が予想されますか?また、100マイル以上の場所から半径5マイル以内の近接度を計算すると思われますか? –

+0

待ち時間は最優先の品質問題ではありません。数秒で応答が得られることを願っています。また、私は半径5マイル以内の多くの場所を期待しており、その場所は動的に変化する可能性があります。 –

答えて

8

GPSからの位置情報の更新が1秒に1回行われるため、別の方法を試してみます( )。大量のデバイスを使用している場合は、毎秒サーバーに近接度を求めるのは良い考えではないと思います。このアイデアの
考える -

  1. デバイスの初期位置を取得し、それをサーバに送信します。
  2. 次の5〜10分間、デバイスがその範囲内にとどまるような適切な半径を決めます。 また、その半径に「あまりにも多くの」点がないか、その場合は半径を狭めることができます。 使用方法に応じて半径とポイント数を決定するのはあなた次第です。 ポイント数など
  3. その半径内のすべての位置をデバイスに送信してデバイスに送信します。
  4. デバイスに近接度を計算させます。
  5. デバイスが最初の半径から移動したら、サーバーを更新して新しい 関連する場所を取得します。 これは簡単に行うことができます。半径はrです。デバイスの初期位置を保存し、現在位置と初期位置の間の距離 を計算します。 rに「十分に近い」 - サーバーを更新します。
5

あなたの場合は、受信した場所をサーバーに送信し、サーバーで必要な計算を行うだけです。しかし、あなたは

  • がどのように多くのデバイスサーバーに場所を送るこれらの質問に対処されることを忘れてはいけないのですか?
  • 各デバイスがどのくらいの頻度でロケーションを送信するかサーバ?また、検出装置の責任は、私はあなたがジオフェンシングのAPIを使用して、すべての物事の複雑さを減らすことができると思いサーバー

    link

      をエリアに入った

  • 各場所をサーバーに送信する必要はありません。
  • 各デバイスが個別に検出したため、 領域に入ります。

EDIT

各デバイスの位置が変更された時はいつでもそうしないと、入力したことになるだろう/、デバイスの無制限の数のため、サーバー上で計算を終了しました。

前の会社で同様のことをする前に、入力/終了時間を計算し、期間を入力してください。バス上の実際のGPSデバイスを経由して

  • 私たちはほぼ100ポイント(地勢)を都市に持っています。したがって、これらのポイントは少数のルートにあると考えることができます

  • バス上の各gpsデバイスは、サーバーに定期的に位置情報を送信しています。バスが完了したことは、サーバ件のデバイスのすべての受信場所、ルートルート

  • 各ジオフェンスとバスの各位置を比較します。

これは実際のシナリオです。これを「サーバーベースのジオフェンシング」と呼ぶことができます。

+0

ジオフェンシングには100の場所しかないという制限があります。私は私の場所の検出に制限がないようにしたい。 あなたの質問にも答えてください> Q1サーバに位置情報を送信するデバイスの数はいくつですか? :A1 Unlimited> Q2各デバイスがサーバーに位置情報を送信する頻度? :A2デバイスが動いたとき。 –

5

サーバー側で単純なk-dツリーの実装を行い、座標を格納することができます。

デバイスの座標を送信します。必要な間隔でデバイスの座標を送信できます。それが5秒ごと、または10秒であれば、それは本当に重要ではありません。これは、主に座標/半径の最小距離によって決定されます。近くにいる場合は、より頻繁に更新する必要があります。

最も近いネイバーを見つけるk-dツリーを使用すると、O(log(n))になります。ただし、デバイス座標の特定の半径内にある限り、ノードをリストに追加することができます。実際にはkdツリーとしてローカルに保存すると、O(log(n))の最も遠いノードを選択することができます

もう一度デバイスの場所が送信されるとすぐに、あなたが既存の場所を持っているからです。 x方向に5で移動したとしましょう。半径の外側にある点をx - 5にドロップします。新しい近接点は、同じ最近傍点探索を行い、半径内にあるようにノードに追加します。今回は移動中の方向に最も近いキャッシュされたノードから始めます。

これを半径の区間ツリーと組み合わせます。あなたの間隔として0から1,1,2から2,3のように言います。 O(log(n))時間内にある半径内のすべてを取り出すこともできます。それらは、k-dツリーのノードへのポインタでなければなりません。効率を上げるためにメモリを犠牲にしたい場合は、半径計算を簡素化し、場所を見つけることができます。

5

サーバー側で「高速」に実装するには、mondodb $の近くの地理空間クエリを使用できます。

https://docs.mongodb.org/manual/reference/operator/query/near/

モバイル側にあなたが位置情報の更新のためのminDistanceプロパティを使用することができますが。あなたは、あなたの場所間の平均距離に応じて合理的な距離20m/50mに設定することができます。

http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String,%20long,%20float,%20android.location.LocationListener)

0

この目的のための無料サービスがあります - >Radar

あなたが無制限の円や多角形ジオフェンスを登録し、そのユーザーを追跡するためのアプリでユーザーを登録することができます。ユーザーが1つのジオフェンスに入力した場合、レーダーはサーバーに通知を送信し、以下のデータを送信します。
ユーザーID、ユーザーが入力または終了したジオフェンスID、オーバーラップを持つジオフェンスに使用される信頼性(低、中、高)。
このSDKはわずか10分で使用できます。

関連する問題