0

タイトルが示すように、kml ファイルから読み込んだ目印を並べ替えようとしています。現在地までの距離で並べ替えたい。

問題は、目印が想定どおりに並べ替えられていないことです。それらを地図で見ると、明らかに本来あるべきように分類されていないことがわかります。

私の Placemark クラスの関連部分を以下に示します。

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

関連する部分を以下に示す PlacemarkComparator を使用して、PlacemarkLoader で並べ替えを行います。

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

どこが間違っているかについての提案はありますか? さらにコードを投稿する必要があるかどうかを教えてください。

4

1 に答える 1

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, double, double, double, float[])]( https://developer.android.com/reference/android/location/Location.html#distanceBetween(double , double, double 、double、float[]))

于 2013-09-23T10:48:55.163 に答える