Cómo ordenar puntos geográficos según la distancia desde la ubicación actual en Android

Tengo un objeto "Lugar" con una coordenada LatLng para cada uno:

import com.google.android.gms.maps.model.LatLng; public class Place{ public String name; public LatLng latlng; public Restaurant(String name, LatLng latlng) { this.name = name; this.latlng = latlng; } } 

y tengo un ArrayList de estos lugares, algo como esto:

  ArrayList<Place> places = new ArrayList<Place>(); places.add("Place 1", LatLng(90.0,90.0)); places.add("Place 2", LatLng(93.0,93.0)); places.add("Place 3", LatLng(83.0,92.0)); places.add("Place 4", LatLng(93.0,91.0)); 

y tengo "mi" LatLng:

  LatLng myLocation = new LatLng(10.0,10.0); 

¿Cómo puedo clasificar estos objetos de acuerdo a lo más cercano a mí? Gracias por la ayuda

Tomando el algoritmo de esta respuesta de la pregunta publicada por @shieldstroy, que utiliza la Gran Distancia Círculo , tengo este ejemplo trabajando.

Aquí está el Comparator :

 public class SortPlaces implements Comparator<Place> { LatLng currentLoc; public SortPlaces(LatLng current){ currentLoc = current; } @Override public int compare(final Place place1, final Place place2) { double lat1 = place1.latlng.latitude; double lon1 = place1.latlng.longitude; double lat2 = place2.latlng.latitude; double lon2 = place2.latlng.longitude; double distanceToPlace1 = distance(currentLoc.latitude, currentLoc.longitude, lat1, lon1); double distanceToPlace2 = distance(currentLoc.latitude, currentLoc.longitude, lat2, lon2); return (int) (distanceToPlace1 - distanceToPlace2); } public double distance(double fromLat, double fromLon, double toLat, double toLon) { double radius = 6378137; // approximate Earth radius, *in meters* double deltaLat = toLat - fromLat; double deltaLon = toLon - fromLon; double angle = 2 * Math.asin( Math.sqrt( Math.pow(Math.sin(deltaLat/2), 2) + Math.cos(fromLat) * Math.cos(toLat) * Math.pow(Math.sin(deltaLon/2), 2) ) ); return radius * angle; } } 

Aquí está el código de alto nivel, acabo de poner esto en onCreate() :

  //My location, San Francisco double lat = 37.77657; double lng = -122.417506; LatLng latLng = new LatLng(lat, lng); //set up list ArrayList<Place> places = new ArrayList<Place>(); places.add(new Place("New York", new LatLng(40.571256,73.98369))); places.add(new Place("Colorado", new LatLng(39.260658,-105.101615))); places.add(new Place("Los Angeles", new LatLng(33.986816,118.473819))); for (Place p: places){ Log.i("Places before sorting", "Place: " + p.name); } //sort the list, give the Comparator the current location Collections.sort(places, new SortPlaces(latLng)); for (Place p: places){ Log.i("Places after sorting", "Place: " + p.name); } 

Aquí está la salida del registro:

 04-17 23:04:16.074 12963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: New York 04-17 23:04:16.074 12963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: Colorado 04-17 23:04:16.074 12963-12963/com.maptest.daniel.maptest I/Places before sorting﹕ Place: Los Angeles 04-17 23:04:16.074 12963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: Los Angeles 04-17 23:04:16.074 12963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: Colorado 04-17 23:04:16.074 12963-12963/com.maptest.daniel.maptest I/Places after sorting﹕ Place: New York 

Para calcular la distancia hay diferentes métodos disponibles. Una muy simple es la fórmula de Haversine ( http://rosettacode.org/wiki/Haversine_formula#Java ). Un cálculo más exacto sería la fórmula de Vincenty. Si los dos lugares no están muy lejos, la solución de Haversine es suficiente.

Después de calcular la distancia, sólo tiene que ordenar su matriz con un comparador, como:

 Collections.sort(places, new Comparator<Place>() { public int compare(Place p1, Place p2) { return Double.compare(p1.getDistance(), p2.getDistance()); } }); 

A medida que tiene su ubicación actual, puede ordenar mediante el cálculo de la distancia de conducción (que es más adecuado para lugares como restaurantes) de la siguiente manera,

  1. Calcular la distancia a cada objeto

     http://maps.googleapis.com/maps/api/directions/json?origin="+yourLat+","+yourLong+"&destination="+toLat+","+toLong+"&sensor=false&mode=DRIVING 
  2. Una vez que usted calcula cada distancia, aplique un algoritmo de clasificación simple para esas distancias.

  • Android getLatitude () devuelve latitud geodésica o geocéntrica?
  • Distancia de viaje entre dos Lat y Long
  • Cómo recuperar la ubicación GPS a través de SMS
  • Cómo obtener lat y largo en evento de toque de google map?
  • Longitud y latitud del GPS de la foto geotiquetada
  • Cómo convertir la longitud de la latitud en formato de grado
  • Calcular la distancia entre dos ubicaciones geográficas
  • ¿Cómo obtener el área de la torre celular usando CellID y LAC en Android?
  • Obtener TimeZone usando latitud y longitud
  • Obtenga los puntos de latitud y longitud cada 10 metros, entre las dos ubicaciones diferentes en android
  • Mapview getLatitudeSpan y getLongitudeSpan no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.