2016-07-13 15 views
-2

Mein Anwendungsserver mit Tausenden von Benutzern mit ihrem Standort (LatLng). Ich möchte 50 Benutzer von jedem Benutzerstandort in der App angezeigt werden? Wie kann ich schnell filtern, um die nächsten 50 Benutzer (LatLng) aus der Server-Datenbank zu bekommen?Nearst 50 Benutzer von "Mein Standort" aus Tausenden von Benutzern mit Standort von meinem Anwendungsserver

Ich versuchte mit Sort list of lon\lat points, start with nearest ... aber viel Zeit zu sortieren und Ergebnis auf Karte zu plotten. Bitte vorschlagen.

Antwort

0

Zuerst nehmen wir an, Sie haben alle LatLng Punkte in einer Liste. (von der Datenbank empfangen, auch wenn sie nicht sortiert sind oder nicht)

Verwenden Sie diese Funktion, um zwischen LatLng-Punkten zu berechnen.

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 sollte die LatLng des Benutzers sein.

EndP sollten alle anderen LatLngs

sein Sie können eine Liste erstellen, die alle Abstände zwischen den LatLng des Benutzers Einsetzen und anderen LatLng, danach Art dieser Liste. Jetzt haben Sie eine sortierte Liste mit den Distanzen zwischen dem LatLng des Benutzers und den restlichen LatLngs, also können Sie mit einer for-Schleife tun, was immer Sie wollen. Wenn es Zeit braucht, können Sie einen Fortschrittsbalken hinzufügen, der den Benutzer darüber informiert, dass etwas passiert/lädt usw.

+0

Ich habe versucht ** distanzbetween ** für 2 Standortpunkte zu verwenden, aber für riesige Daten ist dies keine machbare Lösung. Also habe ich versucht, Positionspunkte zu filtern, bevor ich die Entfernung berechne – SudP