2015-11-27 4 views
0

Je travaille sur une application Android pour laquelle le côté serveur est en Java. Lorsque je reçois des coordonnées de l'utilisateur, je récupère une liste de restaurants, je calcule la distance de l'utilisateur et je les classe de manière ascendante.Java: Formater les distances correctement, par rapport à l'emplacement

À l'heure actuelle, tout fonctionne. Le seul problème est que la distance calculée a une très haute sensibilité. Ce que je cherche, c'est la distance indiquée de cette manière, c'est-à-dire 1.2km, 200m, 12.2km, etc., qui calcule et ajoute des Km ou des Meters de manière appropriée. Comment puis-je atteindre cet objectif?

sortie est actuellement:

Restaurant distance is 6026.203669933703 
Restaurant distance is 1.0248447083638768 
Restaurant distance is 1.0248447083638768 
Restaurant distance is 1.0248447083638768 
code

pour le calcul & de tri:

@Override 
    public List<Restaurant> getNearbyRestaurants(double longitude, double latitude) { 

     final int R = 6371; // Radius of the earth 
     List<Restaurant> restaurantList = this.listRestaurants(); 
     List<Restaurant> nearbyRestaurantList = new ArrayList<>(); 
     for(Restaurant restaurant : restaurantList){ 
      Double latDistance = toRad(latitude-restaurant.getLatitude()); 
      Double lonDistance = toRad(longitude-restaurant.getLongitude()); 
      Double a = Math.sin(latDistance/2) * Math.sin(latDistance/2) + 
        Math.cos(toRad(latitude)) * Math.cos(toRad(restaurant.getLatitude())) * 
          Math.sin(lonDistance/2) * Math.sin(lonDistance/2); 
      Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
      Double distance = R * c; 
      restaurant.setDistanceFromUser(distance); 
      if(distance < 10){ 
       nearbyRestaurantList.add(restaurant); 
      } 
     } 
     if(!(nearbyRestaurantList.isEmpty())) { 

      Collections.sort(nearbyRestaurantList, new Comparator<Restaurant>() { 
       @Override 
       public int compare(Restaurant o1, Restaurant o2) { 
        if (o1.getDistanceFromUser() > o2.getDistanceFromUser()) { 
         return 1; 
        } 
        if (o1.getDistanceFromUser() < o2.getDistanceFromUser()) { 
         return -1; 
        } 
        return 0; 
       } 
      }); 


      for(Restaurant restaurant : restaurantList){ 
       System.out.println("Restaurant distance is "+restaurant.getDistanceFromUser()); 
      } 
      return nearbyRestaurantList; 
     } 
     return null; 
    } 

bien vouloir me faire savoir ce que je manque. Merci beaucoup. :-)

+0

des commentaires à ma réponse? – AlexWien

+0

@AlexWien: Désolé, je travaille sur certains problèmes d'interface utilisateur. Est-ce que ça va si je te donne demain? Mes excuses .. :-( –

Répondre

4

Si la distance est inférieure à 1000m puis en fonction de l'utilisation de l'application, soit la valeur eaxt des mètres entiers, ou rond aux 10 mètres suivants:

473,343 -> 470m ou 473 en fonction de l'objectif de votre application

Si la distance est supérieure à 1 km mais inférieure à 100 kilomètres utiliser un chiffre après la virgule:

1,5 km, 10,3 km, 99,5 km

Si ci-dessus 100 km autour de kilomètres intégrantes: 101km, 9453km

+0

Désolé pour le retard, je pensais que vous aurez quelque chose de plus facile comme la réponse de M. Ed dans ce: http://stackoverflow.com/questions/3263892/format-file-size-as-mb -gb-etc .. Pouvez-vous s'il vous plaît vérifier s'il vous plaît –

+2

Ma réponse contient 3 si des déclarations ou des phrases, donc cela devrait être facilement traduisible en logiciel par vous. – AlexWien