我现在有一些代码正在执行此操作。它适用于中小型列表,但是当我有一个大小为n的列表时, 5000然后我的算法在移动设备上运行几乎需要1分钟。我基本上将Java中的Coordinate对象与Coordinate对象的列表(Vector)进行比较。
这是我的基本算法:
我一直在关注这一点,并试图找到一种更有效的方法。这有点像排序算法问题所以必须有更好的方法。
这是我的距离计算方法:
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);
}
答案 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]是最接近的))。