当前位置: 首页 > 面试题库 >

计算两点之间地理距离的更快方法

曹兴贤
2023-03-14
问题内容

我从互联网上的某个地方借用了以下方法(不记得在哪里)。但是它做的很简单,找到了两个gps点之间的距离。它工作得很好,除了它可能有点慢之外,因为我正在数百万个点上运行它。我想知道是否有人知道这种方法在计算上会更便宜。

准确度必须在“正确”的一般范围内,但不必是100%准确。

private double distFrom(double lat1, double lng1, double lat2, double lng2) {
    double earthRadius = 3958.75;
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
           Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
           Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    return   earthRadius * c;
  }
}

附言:我确实确实发现了许多其他相关问题,但是它们并没有真正关注我的速度问题。


问题答案:

如果您不介意忽略地球的微小扁圆度(无论如何,您发布的Haversine代码也可以做到这一点),请考虑将每个球形(纬度/经度)坐标首先预先转换为3D
单位长度的 笛卡尔坐标,具体如下:

http://en.wikipedia.org/wiki/Spherical_coordinate_system

然后直角坐标系之间的球面距离p1,并p2很简单:

r * acos(p1 . p2)

由于p1并且p2将具有单位长度,因此每对减少为四个乘法,两个加法和一个反向触发操作。

还要注意,点积的计算是优化的理想选择,例如通过GPU,MMX扩展,向量库等。

此外,如果您打算按距离对对 排序
,可能会忽略更远的对,则可以r*acos()通过仅对点乘积值进行排序来推迟等式的昂贵部分,因为对于所有有效输入(即范围[-1, 1]),都可以保证那:

acos(x) < acos(y) if x > y

然后,您只需选择acos()您真正感兴趣的值即可。

关于:使用的潜在错误,acos()仅在使用单精度float变量时,这些错误才真正重要。使用double包含16个有效数字的数字,您可以将距离准确地控制在1米以内。



 类似资料:
  • 问题内容: 我需要创建一个类来计算两点之间的距离。我被困住了,我是一个完全的初学者。这是我的课程: 第二课。 我不确定如何在两个定义的点之间获取点对象(中间点)。 我可以创建点对象,但不确定如何通过位于这两个点对象之间的方法返回点对象。 问题答案: 平面上的两个点(x1,y1)和(x2,y2)之间的距离为: 但是,如果您想要的只是两个点的中点,则应将中点函数更改为: 这将返回一个全新的点对象,其点

  • 我试图使用Scala类计算两点之间的距离。但它给出了一个错误说 类型不匹配;发现:其他。需要类型(具有基础类型点):?{def x:?}请注意,隐式转换不适用,因为它们是不明确的:在[A](x:A)类型的对象Predef中确保[A]的方法any2Ensuring和在[A](x:A)“ArroAssoc[A]类型的对象Predef中的方法Ani2ArrowasSoc都是可能的其他转换函数。输入到?{

  • 本文向大家介绍php两点地理坐标距离的计算方法,包括了php两点地理坐标距离的计算方法的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php计算两点地理坐标距离的具体代码,供大家参考,具体内容如下 功能:根据圆周率和地球半径系数与两点坐标的经纬度,计算两点之间的球面距离。 获取两点坐标距离: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我需要测量以字符串形式提供名称的两个地方之间的物理距离。由于有时名称的书写方式略有不同,因此我一直在寻找一个可以帮助我测量差异的库,然后将其与纬度和经度结合起来以选择正确的匹配项。首选语言:Java或PHP。 有什么建议? 问题答案: 看看Levenshtein距离。这是一种测量两个字符串彼此之间有多不同的方法。 希望我能正确理解你的问题;在与“经度”相同的句子中使用“距离”可能会造成

  • 问题内容: 您如何计算Google Maps V3中两个标记之间的距离?(类似于inV2中的功能。) 谢谢.. 问题答案: 如果要自己计算,可以使用Haversine公式:

  • 我知道如何开始,也知道如何安装扫描仪和其他东西,但是在学校里,我从来没有真正学习过经纬度公式,以及如何将这些点转换成弧度。所以我几乎被困在这个Java问题上。这是我目前掌握的情况: 在JavaIDE中,他们说经度和纬度点(位于