Java: правильно отформатируйте расстояния по сравнению с местоположением

Я работаю над приложением Android, для которого серверная часть находится на Java. Когда я получаю координаты от пользователя, я получаю список ресторанов, вычисляю расстояние от пользователя и сортирую их по возрастанию.

Прямо сейчас все работает. Единственная проблема заключается в том, что вычисленное расстояние имеет очень высокую чувствительность. То, что я ищу, это расстояние, показанное таким образом, то есть 1,2 км, 200 м, 12,2 км и т. Д., Которое рассчитывает и прибавляет Км или Метры соответственно. Как мне этого добиться?

Выход в настоящее время:

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

Код для расчета и сортировки:

 @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;
    }

Пожалуйста, дайте мне знать, что я скучаю. Большое спасибо.:-)

1 ответ

Решение

Если расстояние меньше 1000 м, то в зависимости от применения используйте либо точное значение интегральных метров, либо округлите до следующих 10 метров:

473.343 -> 470 м или 473 в зависимости от цели вашего приложения

Если расстояние превышает 1 км, но меньше 100 км, используйте одну цифру после десятичной точки:

1,5 км, 10,3 км, 99,5 км

Если выше 100 км, округлить до целых километров: 101 км, 9453 км

Другие вопросы по тегам