将基准坐标与n个坐标列表进行比较并确定最接近的m坐标的最佳算法?

时间:2010-10-31 18:39:08

标签: java algorithm math gps coordinates

我现在有一些代码正在执行此操作。它适用于中小型列表,但是当我有一个大小为n的列表时, 5000然后我的算法在移动设备上运行几乎需要1分钟。我基本上将Java中的Coordinate对象与Coordinate对象的列表(Vector)进行比较。

这是我的基本算法:

  • 遍历列表中的每个元素nx
  • 如果“最近的10个”列表中的项目少于10个,则将nx添加到列表中 并转到下一个元素
  • 如果“最近的10个”列表已经有10个项目,那么计算出来 nx和基地之间的距离 坐标
  • 如果距离小于“最近的10”中的最远距离 列表“然后删除最远的项目 从该列表中替换为nx

我一直在关注这一点,并试图找到一种更有效的方法。这有点像排序算法问题所以必须有更好的方法。

这是我的距离计算方法:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) {

  double theta = lon1 - lon2;

  double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));

  dist = acos(dist);

  dist = rad2deg(dist);

  dist = dist * 60 * 1.1515;

  if (unit == 'K') {

    dist = dist * 1.609344;

  } else if (unit == 'N') {

    dist = dist * 0.8684;

    }

  return (dist);

}

3 个答案:

答案 0 :(得分:2)

您可以将坐标存储在某些space partitioning tree

或者,对于更简单的方法,您可以使用二维数组的桶,并首先检查最近的存储桶,直到找到足够的最近邻居。这只适用于坐标均匀分布的情况。

编辑:要比较距离,您可以在球体上预先计算3D坐标,并在比较中使用欧氏距离的平方:

dx * dx + dy * dy + dz * dz

答案 1 :(得分:0)

好吧,使用数组执行此操作可能会更快。你可以比较距离的平方而不是距离,这意味着你不必使用平方根。

拥有实际代码会很好。

答案 2 :(得分:0)

您可以在此website使用类似方法来限制实际需要您计算距离的点数。

该网站显示了如何计算点和给定距离的lat,lon边界坐标。这与您所拥有的问题不完全相同,但它可以作为过滤器使用。在你的情况下,你显然试图找到给定点的10(或n)个最近点。您可以应用以下算法来查找10(或n)个最近点:

  

对于前n个点,你可以通过全面的距离   你有计算,保存每个点的距离。

     

保存整体最长距离。计算lat,lon边界   如上面的网站上所示的框。

     

继续完成其余的要点。

     

如果任何点在lat,lon bounding box之外,则不能   比当前最近的10个点更接近。如果它在里面   边界框,计算距离。

     

丢弃前一组10个“最近”点中最远的一个。

     

根据新的最远点重新计算lat,lon边界框。

     

重复直到处理完所有点。

这种方法的好处是,您可以避免对大量积分进行繁重的计算。根据您的点数的分布,您仍然可能会遇到性能不佳的情况,例如,如果点数被调整为使得它们与目标点的距离减小(点[0]最远且点[N]是最接近的))。