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

时间:2016-06-06 18:32:12

标签: java android ios performance location

我有一个位置列表,遵循以下模式:

[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

这些值是一个例子

2 个答案:

答案 0 :(得分:1)

基本上你必须检查每一点,没有其他选择。距离公式(Haversine)确实很慢,因为它使用很少的三角函数。您真正想要的是在您的点周围绘制一个圆,其半径R是距离,并检查每个点是否在该圆内: enter image description here

问题在于你的点是(纬度,长度)对,而不是(x,y)对,所以你不能使用“常规”三角函数方法,比如圆的方程。
相反,你必须找到一个限定该圆圈的正方形。向北和向南90度,找到该广场的上下经度。对东西方做同样的事情,找到上下纬度:
enter image description here

现在您可以检查每个点是否在框内,并且您可以通过简单的比较轻松完成:

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

这实际上非常便宜 唯一的问题是蓝色区域内的点:
enter image description here

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

答案 1 :(得分:0)

如果您使用的是Android,则可以使用"distanceBetween" method of the Location class。 这个方法在Java中实现它(你可以循环测试你的位置和位置列表元素之间的距离),所以如果你想要更高的性能,你应该本地(NDK)。如果你这样做,你应该将完整列表传递给本机方法,而不是逐个传递,因为虚拟环境和本机环境之间的上下文变化可能是昂贵的。