如何计算一个位置与另一个位置之间的距离/接近度(c#)
Posted
技术标签:
【中文标题】如何计算一个位置与另一个位置之间的距离/接近度(c#)【英文标题】:How do I calculate distance/proximity between one location and another (c#) 【发布时间】:2011-07-18 12:09:59 【问题描述】:您好,我想知道当用户靠近另一个指定位置 30 英尺时如何非常准确地计算,可能有许多指定位置,那么最好的方法是什么?
*示例场景;移动应用程序用户移动到其应用程序之一的许多指定位置附近(30 英尺)..(我将如何计算 2 个位置之间的距离,即移动用户和其他位置)
提前致谢
【问题讨论】:
可能不太明白这个问题。你有用户坐标和“有趣的东西”坐标吗? 我假设您要求的不仅仅是“我如何计算两点之间的距离”? 它有点像标签,多部手机都带有 gps wp7.. 上传到天蓝色的玩家和位置列表会在服务器和其他玩家手机上不断更新.. 当前用户得到一个列表在来自 azure 服务的这些玩家位置中,我想根据返回的位置计算接近度,因为如果用户在另一个移动设备的 20 或 30 英尺范围内,我希望做一些事情。 【参考方案1】:最好的方法是使用“空间启用”数据结构来存储要测试的位置列表。距离本身是使用网络上各处记录的众所周知的公式计算的(great circle distance、geographical distance、vincenty's formulae...)
最简单的这种结构是kd-tree:它允许存储一组坐标并快速找到离给定位置最近的点。结构很容易掌握,操作也很容易编程(你甚至可以找到一个库来完成这一切),而且它的速度足以满足移动需求。
除了 kd-tree,您的问题可以通过最近邻搜索解决,即well documented on wikipedia。你会发现有大量的数据结构来存储你的位置,并搜索最近的位置。
在任何情况下,都不要执行全面搜索(将您的当前位置与整个存储位置集进行比较)。这种算法的时间复杂度很大程度上取决于您测试的位置数量,您进行的比较越少,您找到解决方案的速度就越快。全搜索涉及太多比较,如果位置数量与您设备的处理能力相比太高,您将使移动设备在找到最近的位置之前停止。
【讨论】:
【参考方案2】:回到我的高中数学知识,你可以使用Pythagorean theorem 来获得那个距离。取点 a 和 b,将它们平方并相加。然后取平方根。
var distance = Math.Sqrt(a*a + b*b);
【讨论】:
【参考方案3】:为了扩展上面 Kon 的答案,这正是我开始为我目前正在开发的应用程序所做的事情。这可能是使用相对较少的航点的最佳方式。
然而,在我的应用程序中,我可以有数以万计的航点进行比较,而不是一遍又一遍地进行数学运算,我稍微扩展了这个想法。由于所有的点都在英国境内,我选择了三个固定点(在我的例子中,苏格兰北部的一个点,康沃尔附近的一个点,多佛附近的英吉利海峡的一个点),当我保存一个新的航路点时,我计算距离这些固定点中的每一个。如果我需要拉出靠近另一个已知位置的点,我可以在数据库中相当简单地比较这些航点的距离,并且只拉回那些靠近的点。通过使用三角测量,所涉及的数学是微不足道的,我看到速度显着提高。
编辑我现在还要查看 Adrien Plisson 的 NNS 链接,看看这是否能进一步帮助我。 :)
【讨论】:
【参考方案4】:最简单的方法是使用 GeoCoordinate 类,该类有一个方法 GetDistanceTo,它采用另一个方法并返回两者之间的距离。
【讨论】:
是否需要一个列表,因为我有多个位置,效率如何?以上是关于如何计算一个位置与另一个位置之间的距离/接近度(c#)的主要内容,如果未能解决你的问题,请参考以下文章