首先让我说出这个想法:
我想检查用户到指定路线的距离。该路线由多个位置点组成(在图中,点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],[...]}
我的应用是跟踪用户位置。我现在想要将新位置与数组中的此轨道进行比较。
有人知道一个覆盖问题的算法,还是有人可以帮我算法? (伪代码就足够了)
//编辑:我刚刚读到了关于Quadtree算法的内容。除了Soonts的实施之外,也许这是一个选择。
答案 0 :(得分:1)
首先使用以下公式将所有数据(用户位置,点)从纬度/经度转换为x / y km:
Y = lat * 111,X = lon * 111 * cos(lat)
(这会稍微失败,路线长度超过1000英里,并且在极点附近或当你的路径越过第180个子午线时显着失败,希望你的任务没问题。)
然后使用以下公式查找点与每个线段之间的距离:https://stackoverflow.com/a/1501725/126995,并搜索最小距离。您的路线需要进行一些性能优化,其中有超过200个段。
P.S。如果你对这个方法的局限性不满意 - 寻找球体上点和线段之间距离的公式,但我可以向你保证那些将包含很多三角法,我怀疑便宜的Android手机会做到这一点快速的路线。