GPS 使用 GeoUtils 库计算距离在印度运行良好,但在美国对 android 不起作用
Posted
技术标签:
【中文标题】GPS 使用 GeoUtils 库计算距离在印度运行良好,但在美国对 android 不起作用【英文标题】:GPS calculate distance using GeoUtils library works well in India but didnt work in USA for android 【发布时间】:2013-11-13 13:57:05 【问题描述】:我的代码在印度运行良好。此代码计算两个位置之间的大致距离。我使用了下面提到的代码。但是如果我在美国运行同样的代码。然后为每个位置更新计算不同的距离。 我将源和目的地的纬度和经度传递给了这个函数。该应用程序在印度运行良好。但不适用于美国。在同一个地方它显示不同的计算。 提前致谢。任何帮助将不胜感激。
public static double distanceKm(double lat1, double lon1, double lat2, double lon2)
double lat1Rad = Math.toRadians(lat1);
double lat2Rad = Math.toRadians(lat2);
double deltaLonRad = Math.toRadians(lon2 - lon1);
return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad)
* Math.cos(deltaLonRad))
* 6371;
【问题讨论】:
尝试双距离 = FIRSTLOCATION.distanceTo(SECONDLOCATION); 这个公式可能存在已知的限制。你能解释一下吗? b/ 对于印度和美国的一些示例测量,您的预期与实际结果是什么。 (另外,有内置的android方法可以做到这一点) @njzk2 感谢您的快速回复。详细信息是印度 CurrentLat :18.50849876 CurrentLon:73.79455861 我家 dist:743 下一个位置已更改 : CurrentLat :18.50846096 CurrentLon:73.79453276 我家 dist:701 位置在 3 秒后更改和1米。 requestonLocationUpdates 请发布 lat1,lon1,lat2,lon2 的数字以及您认为错误的距离。可能你的公式有效。使用距离标尺工具在 Google 地球中输入它们。 【参考方案1】:公式是大圆公式。 众所周知,它不适用于小距离。 原因是这部分:
Math.cos(deltaRad).
这是一个非常小的值的余弦,它在数字上是“病态的”:它们在计算机上不能很好地工作。 (现在双精度效果不太明显) 因此,对于小距离,haversine 公式更适合。
如果您仍然对haversine distance 公式有疑问,那么显然您的输入数据就是问题所在。 (例如,如果在没有适当预过滤的情况下从 GPS 读取)
虽然使用更大的圆形变体,但您的实现提供正确结果的机会很高。您声称的“正确距离”错误的可能性很高。
【讨论】:
感谢您的宝贵时间。我使用了那个haversine距离公式。它对我有用。非常感谢!【参考方案2】:我正在使用一个非常相似的公式,并且从未有任何抱怨。 我的公式的主要区别是 deltaLonRad,我计算如下:
double deltaLonRad = Math.toRadians(lon2) - Math.toRadians(lon1);
【讨论】:
感谢您的回复,但它在任何国家/地区都有效吗?我的意思是你确定吗? 非常确定。我在应用程序中使用它大约 2 年了。只需尝试使用来自美国的示例,这些示例与您的代码有关。我猜美国的负经度值会导致问题。 我会更改并测试它,然后通知您。 您的变体在数学上是等效的。 fa - fb = f*(a-b);到弧度只是一个因素。 (180.0/ Pi) 所以你的回答不是他问题的原因。 我不确定,360 度“模”行为是否也能在这种等价中幸存下来。但你是对的,转换后的 2*Pi 也是如此。我认为这个问题已经具有误导性。它与印度的坐标与美国的坐标并没有真正的关系,但与随着时间的推移非常小的坐标差异有关。 (就我后来添加的 cmets 而言。)以上是关于GPS 使用 GeoUtils 库计算距离在印度运行良好,但在美国对 android 不起作用的主要内容,如果未能解决你的问题,请参考以下文章