【问题标题】:calculate distance between a location and a list of locations计算位置和位置列表之间的距离
【发布时间】:2016-06-06 18:32:11
【问题描述】:

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

[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

这些值是一个例子

【问题讨论】:

  • 如果您担心性能,并且您使用的是 Android,为什么不将您的数据放入 SQLite 数据库并进行查询。更多答案:stackoverflow.com/questions/3126830/…
  • 我知道是为了举例,但你所有的位置都是一样的。
  • 您的示例数组具有所有相同的项目。如果很有可能会有很多重复项,那么在调用 GETDISTANCE(LOCATION, LOCATION2) 之前删除它们会提高性能。
  • 我向作为下一个客户端的服务器请求并发送我的位置,服务器进行此计算并返回一个列表
  • 这些值是一个例子

标签: java android ios performance location


【解决方案1】:

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

问题是您的点是 (lat, long) 对,而不是 (x,y) 对,因此您不能使用“常规”三角法,例如圆方程。
取而代之的是,您必须找到一个包围该圆圈的正方形。向北和南走 90 度,找到那个正方形的上经度和下经度。对东和西做同样的事情,找到高纬度和低纬度:

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

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

这在计算上真的很便宜。
唯一的问题是蓝色区域内的点:

它们在正方形内,但不在圆形内,因此您必须对它们使用 Haversine 公式。
如果您的大部分点不在正方形中,此方法将节省您的时间,因为消除它们非常容易。

【讨论】:

  • 如果我继续使用相同的公式,服务器可以不断执行计算?
  • 我向作为下一个客户端的服务器请求并发送我的位置,服务器进行此计算并返回一个列表
  • 您要求更快的方法,我认为我的解决方案比对每个点使用 Haversine 公式更快。由您决定使用哪种方法以及是在服务器还是客户端执行此操作。
  • @nasch 这些是它们与中心的距离大于R的点。
  • 啊,当然,所以您计算的是正方形内每个点的距离,而不是列表中的每个点。有道理,谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-20
    • 2011-12-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2018-09-21
    相关资源
    最近更新 更多