2016-07-13 2 views
-2

私のアプリケーションサーバーは、その場所(LatLng)を持つ何千人ものユーザーを持っています。 どのユーザーの場所からも最も近い50人のユーザーをアプリに表示したいですか? サーバーデータベースから最も近い50人のユーザー(LatLng)を高速化する方法はありますか?私の場所から50人近いユーザー私のアプリケーションサーバーからのロケーションを持つ何千人ものユーザーのうち

私はSort list of lon\lat points, start with nearestで試しましたが、マップ上で結果を並べ替えてプロットするのに多くの時間がかかりました。 お勧めします。

答えて

0

まず、すべてのLatLngポイントをリストに入れたとします。 (ソートされていない場合でもデータベースによって受信されます)

この関数を使用して、LatLngのポイントを計算します。

public double CalculationByDistance(LatLng StartP, LatLng EndP) { 

    int Radius = 6371;// radius of earth in Km 
    double lat1 = StartP.latitude; 
    double lat2 = EndP.latitude; 
    double lon1 = StartP.longitude; 
    double lon2 = EndP.longitude; 
    double dLat = Math.toRadians(lat2 - lat1); 
    double dLon = Math.toRadians(lon2 - lon1); 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) 
      + Math.cos(Math.toRadians(lat1)) 
      * Math.cos(Math.toRadians(lat2)) * Math.sin(dLon/2) 
      * Math.sin(dLon/2); 
    double c = 2 * Math.asin(Math.sqrt(a)); 
    double valueResult = Radius * c; 
    double km = valueResult/1; 
    DecimalFormat newFormat = new DecimalFormat("####"); 
    int kmInDec = Integer.valueOf(newFormat.format(km)); 
    double meter = valueResult % 1000; 
    int meterInDec = Integer.valueOf(newFormat.format(meter)); 

    return Radius * c; 

}

STARTPは、ユーザーの緯度経度でなければなりません。

ENDPは、あなたがそのソートそのリストの後に、ユーザーの緯度経度と緯度経度の他の間のすべての距離を挿入するリストを作成することができ、他のすべてのLatLngs

でなければなりません。今度は、ユーザーのLatLngと残りのLatLngsの距離をソートしたリストがあるので、forループを使用すると、何でもできます。時間がかかる場合は、進行中のバーを追加して、何か起きていることをユーザに知らせることができます。

+0

2点の位置には** distancebetween **を使用しましたが、巨大なデータの場合は実行可能な解決策ではありません。だから私は距離を計算する前に位置ポイントをフィルタリングしようとしていた – SudP

関連する問題