2016-07-13 3 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는 사용자의 LatLng를해야한다.

는 ENDP 당신은 그 종류 그 목록 후, 사용자의 LatLng를과의 다른 LatLng를 사이의 모든 거리를 삽입 목록을 만들 수있는 모든 다른 LatLng를

해야한다. 이제는 사용자의 LatLng과 나머지 LatLng 사이의 거리가있는 정렬 된 목록이 있으므로 for 루프를 사용하면 원하는 모든 작업을 수행 할 수 있습니다. 시간이 걸리는 경우 사용자에게 무언가가 진행 중임을 알리는 진행 표시 줄을 추가 할 수 있습니다.

+0

2 개의 위치 점에 대해 ** distancebetween **를 사용해 보았습니다. 그러나 거대한 데이터의 경우 이는 실현 가능한 해결책이 아닙니다. 그래서 거리를 계산하기 전에 위치 지점을 필터링하려고했습니다. – SudP