计算一个位置和一个位置列表之间的距离

我有一个位置列表,遵循这种模式:

[1] = {lat = -40.2452, longitude = -76.2489}, [2] = {lat = -40.2452, longitude = -76.2489}, [3] = {lat = -40.2452, longitude = -76.2489}, [4] = {lat = -40.2452, longitude = -76.2489} 

和一个地方

 location = {lat = -40.2452, longitude = -76.2489} 

我想要计算这个距离内的哪个位置。

我find了一个计算两点之间距离的公式。

但如果这个清单很大!

有没有更快的方法?

或者你可以在循环中通过列表?

 FOR LOCATION IN LISTLOCATION DO IF GETDISTANCE(LOCATION, LOCATION2) <= DISTANCE SAVE THIS LOCATION END END 

这些值是一个例子

基本上你必须检查每一个点,没有其他select。 距离公式(Haversine)的确很慢,因为它使用了很less的三angular函数。 你真正想要的是围绕你的点绘制一个圆,其半径R是距离,并检查每个点是否在圆内:
在这里输入图像说明

问题是,你的观点是(拉特,长)对,而不是(X,Y)对,所以你不能使用“正则”三angular函数方法,如圆的方程。
相反,你必须find一个正方形来界定那个圆圈。 向北和向南走90度,find那个广场的上,下经度。 同样东西走,find上,下纬度:
在这里输入图像说明

现在你可以检查每一点,如果它在盒子里,你可以用简单的比较方便地做到这一点:

 if lon > lon1 and lon < lon2 and lat > lat2 and lat < lat1 

这实际上是廉价的。
唯一的问题是在蓝色区域内的点:
在这里输入图像说明

他们在广场内,但不在圈内,所以你必须使用Haversine公式。
如果你的观点大部分不在广场上,这种方法会节省你的时间,因为消除它们是非常简单的。

如果你在Android上,那么你可以使用Location类的“distanceBetween”方法 。 这个方法有它在Java中的实现(你可以做一个循环来testing你的位置和位置列表元素之间的距离),所以如果你想要更高的性能,你应该在本地执行(NDK)。 如果你这样做,你应该把完整的列表传递给本地方法,而不是一个接一个,因为在虚拟环境和本地环境之间的上下文变化可能是昂贵的。