location Points:到指定路线的距离
Posted
技术标签:
【中文标题】location Points:到指定路线的距离【英文标题】:location Points: distance to a specified route 【发布时间】:2013-02-01 12:19:32 【问题描述】:首先让我陈述一下这个想法:
我想检查用户到指定路线的距离。路线由多个位置点组成(图中为点 a、b、c、d)。两个相邻点描述一个向量(图中蓝线ab、bc、cd)
现在到应用程序(尤其是android,但这不是这个问题的一部分) 在用户沿着路线行驶时跟踪用户的位置。对于我要检查的每个新位置,用户是否仍在路线上(或距离 X 内)。
我在路线上画了 3 个可能的位置:
位置 1 没问题。我将垂线从点 1 下降到矢量 ab。这给了我这个向量上的一个位置点,我可以计算两点之间的距离(使用android:Location.distanceTo()
)
当我处理向量时,位置 2 没有开始也没有结束。黑线是向量ab的投影。计算最近距离将使我与向量 ab 的距离很近,但与向量 bc 的距离很远。事实上,我需要计算到 bc 的距离,因为这就是路线的前进方式。但是我怎么知道在我的算法中我需要选择哪个向量来计算距离?
位置 3 使我可以使用向量 ab 或 bc 进行计算。两者几乎同样接近。如何知道选择哪一个?
四舍五入:
我有一个包含位置点的数组:
[lat1, lon1], [lat2, lon2],[...]
我的应用程序正在跟踪用户的位置。我现在想将新位置与数组中的这条轨道进行比较。
是否有人知道解决问题的算法,或者有人可以帮助我解决该算法吗? (伪代码就够了)
//编辑:我刚读到四叉树算法。也许这是除了实施 Soonts 之外的一种选择。
【问题讨论】:
//编辑:不要在这里过早优化。四叉树比较复杂,你会花一些时间来实现和调试。而且我认为即使是 100 美元的安卓手机也能在几分之一秒内计算出一个点和 1000 段路径之间的距离。 【参考方案1】:首先使用以下公式将所有数据(用户位置、点)从 lat/lon 转换为 x / y km:
Y = lat * 111, X = lon * 111 * cos( lat )
(如果路线超过 1000 英里,这会稍微失败,并且在两极附近或当你的路径穿过 180 条子午线时会严重失败,希望这对你的任务来说没问题)。
然后使用以下公式求该点与各段的距离:https://***.com/a/1501725/126995,并求最小距离。您的路线有超过 200 个路段,需要进行一些性能优化。
附:如果您对这种方法的局限性不满意 - 寻找球体上点和线段之间距离的公式,但我可以向您保证,这些公式将包含很多三角函数,我怀疑廉价的安卓手机会做到这一点路线长,速度快。
【讨论】:
我认为这些限制应该不是问题。我需要考虑一下,尤其是因为我需要确保用户在赛道上前进,但我想这应该不是问题。以上是关于location Points:到指定路线的距离的主要内容,如果未能解决你的问题,请参考以下文章