2013-09-23 2 views
0

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

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

Соответствующая часть моего класса метки помечена ниже.

public class Placemark { 
    ... 

    public double distanceTo(double lat, double lon) 
    { 
     return Math.sqrt(Math.pow(lat - this.lat, 2) + Math.pow(lon - this.lon, 2)); 
    } 

    private String name; 
    private String description; 
    private double lat; 
    private double lon; 
} 

я сортировкой в ​​моем PlacemarkLoader используя PlacemarkComparator из которых в соответствующей части показано ниже.

@Override 
public List<Placemark> loadInBackground() { 
    List<Placemark> data = getPlacemarks(MainActivity.path); 
    Collections.sort(data, new PlacemarkComparator(location.getLatitude(), location.getLongitude())); 
    return data; 
} 

private static class PlacemarkComparator implements Comparator<Placemark> { 
    private double lat; 
    private double lon; 

    public PlacemarkComparator(double lat, double lon) 
    { 
     this.lat = lat; 
     this.lon = lon; 
    } 

    @Override 
    public int compare(final Placemark pm, final Placemark pm2) { 
    if(pm.distanceTo(lat, lon) < pm2.distanceTo(lat, lon)) 
    { 
     return -1; 
    } 
    else if(pm.distanceTo(lat, lon) > pm2.distanceTo(lat, lon)) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
    } 
} 

Любые предложения о том, где я ошибаюсь? Пожалуйста, дайте мне знать, если я должен написать больше кода или что-нибудь еще.

+0

Пожалуйста, используйте *, не сортируются, как они предполагают * , Что не так с заказом? – OldCurmudgeon

ответ

1

Вы должны использовать метод Проппер WGS84 расстояние:

public double distanceTo(double lat, double lon) { 
    float[] result = new float[1]; 
    Location.distanceBetween(this.lat, this.lon, lat, lon, result); 
    return result[0]; 
} 

Или включить его непосредственно в ваш Comperator:

@Override 
public int compare(final Placemark pm, final Placemark pm2) { 
    float[] left = new float[1]; 
    float[] right = new float[1]; 

    Location.distanceBetween(this.lat, this.lon, pm.lat, pm.lon, left); 
    Location.distanceBetween(this.lat, this.lon, pm2.lat, pm2.lon, right); 

    return left[0] - right[0]; // or is it right[0] - left[0] ? :x 
} 

См официальную документацию API здесь: [distanceBetween (двойной, двойной, двойной , double, float [])] (https://developer.android.com/reference/android/location/Location.html#distanceBetween(double, double, double, double, float []))

+0

Наш код дал те же результаты, которые я нашел нечетными, поэтому я погнулся дальше и обнаружил ошибку. Спасибо за поддержку. Я буду отмечать ваш ответ как принятый и удалить весь вопрос завтра. Я верю, что дам вам очки репутации ... но я могу ошибаться :) – user672009

+0

Угадайте, вы ошибаетесь. Но спасибо за попытку. – flx

Смежные вопросы