我有大约1000分。我试图根据距离对这个点进行分组。我使用的是harversine配方,但它似乎超级慢。在android中1000分需要4秒。在我的本地环境需要60毫秒。
我不关心岁差,这些点之间的距离不超过25公里。
我可以使用其他公式吗?
答案 0 :(得分:6)
首先,对于彼此靠近的物品,地球的曲率不会太重要。因此,你可以将它视为平面,此时你正在研究毕达哥拉斯定理的距离(x / y距离的平方和的平方根)。
其次,如果你所做的只是排序/分组,你可以放弃平方根计算,只需在距离的平方上排序/分组。在没有浮点协处理器的设备上,例如前几代Android手机,那里会做很多好事。
第三,您没有指出用于点的坐标系,但如果您可以使用定点数学计算,那么这也将提高性能,特别是在无协处理器设备上。这就是为什么Android版Google地图加载项使用GeoPoint
和微度加权,而不是double
从Location
回来的LocationManager
度。
答案 1 :(得分:2)
只要你不需要在民意调查附近处理,并且aproximation可以分组,它应该是。然后你可以计算出一次性的度数度和经度度之间的相对比例,并将其用于每个直线X平方+ y平方计算,对于相对距离,你可以跳过平方根。
如果您使用度数将它们缩放为相对于纬度和经度的相对距离,则使用该等值的cos。我会将纬度缩放到经度,然后每个度数映射到一个很好的知道距离,计算将是类似的。
(lattitude diference for two points) * 1/cos(latitude)
假设纬度在样本集上没有太大变化,你只计算所有点的1/cos(latitude)
。
答案 2 :(得分:2)
也许删除地球曲率的计算..? 如果您的应用程序的功能允许这样做,请执行此操作。
此格式始终适用。给定两点,您可以随时绘制它们,绘制直角三角形,然后找到斜边的长度。斜边的长度是两点之间的距离。由于此格式始终有效,因此可将其转换为公式:
距离= sqrt((x2 - x1)^ 2 +(y2 - y1)^ 2)
使用正确的表示法进行更新:
double distance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
答案 3 :(得分:0)
据我所知,最好的方法是使用图论,它有Dikstra's algorithm,这是我对这类任务所知的最快的算法。
非常值得学习,非常好地优化工作。