我有一个位置列表,遵循以下模式:
[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}
我想计算距离内的哪个位置。
我找到了一个计算两点之间距离的公式。
但如果此列表很大!
有更快的方法吗?
或者您可以循环浏览列表?
FOR LOCATION IN LISTLOCATION DO
IF GETDISTANCE(LOCATION, LOCATION2) <= DISTANCE
SAVE THIS LOCATION
END
END
这些值是一个例子
答案 0 :(得分:1)
基本上你必须检查每一点,没有其他选择。距离公式(Haversine)确实很慢,因为它使用很少的三角函数。您真正想要的是在您的点周围绘制一个圆,其半径R
是距离,并检查每个点是否在该圆内:
问题在于你的点是(纬度,长度)对,而不是(x,y)对,所以你不能使用“常规”三角函数方法,比如圆的方程。
相反,你必须找到一个限定该圆圈的正方形。向北和向南90度,找到该广场的上下经度。对东西方做同样的事情,找到上下纬度:
现在您可以检查每个点是否在框内,并且您可以通过简单的比较轻松完成:
if lon > lon1 and lon < lon2
and lat > lat2 and lat < lat1
他们在广场内,但不在圈内,所以你必须使用Haversine公式。
如果你的大部分点都不在广场上,这种方法可以节省你的时间,因为消除它们非常容易。
答案 1 :(得分:0)
如果您使用的是Android,则可以使用"distanceBetween" method of the Location class。 这个方法在Java中实现它(你可以循环测试你的位置和位置列表元素之间的距离),所以如果你想要更高的性能,你应该本地(NDK)。如果你这样做,你应该将完整列表传递给本机方法,而不是逐个传递,因为虚拟环境和本机环境之间的上下文变化可能是昂贵的。