我从互联网上的某个地方借用了以下方法(不记得在哪里)。但是它做的很简单,找到了两个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中,他们说经度和纬度点(位于