まず、すべての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ループを使用すると、何でもできます。時間がかかる場合は、進行中のバーを追加して、何か起きていることをユーザに知らせることができます。
2点の位置には** distancebetween **を使用しましたが、巨大なデータの場合は実行可能な解決策ではありません。だから私は距離を計算する前に位置ポイントをフィルタリングしようとしていた – SudP