我在C#中找到了Haversine Formula,还有比这更好的其他方法。
public double HaversineDistance(LatLng pos1, LatLng pos2, DistanceUnit unit)
{
double R = (unit == DistanceUnit.Miles) ? 3960 : 6371;
var lat = (pos2.Latitude - pos1.Latitude).ToRadians();
var lng = (pos2.Longitude - pos1.Longitude).ToRadians();
var h1 = Math.Sin(lat / 2) * Math.Sin(lat / 2) +
Math.Cos(pos1.Latitude.ToRadians()) * Math.Cos(pos2.Latitude.ToRadians()) *
Math.Sin(lng / 2) * Math.Sin(lng / 2);
var h2 = 2 * Math.Asin(Math.Min(1, Math.Sqrt(h1)));
return R * h2;
}
答案 0 :(得分:1)
我想这是你想用它做什么的问题。我的猜测是你试图根据ZIP(Post)代码计算距离,你想知道pos2是否在pos1的x距离内。
您首先需要了解的是(除非您有一些令人敬畏的Geo Spatial数据可供使用),所有计算通常不会考虑给定区域的高程或任何其他地形属性,因此您的计算将不准确。此外,这些计算是“当乌鸦飞行”,这意味着点x到点y是直线,因此当点y可能位于中心点x的25英里内时,从中心点x到点y可能实际上是30英里。
有人说,除非你计算小距离(<~12英里),否则Haversine公式是你最好的选择,在这种情况下你可以使用毕达哥拉斯定理,表示为:
d = sqrt((X2 - X1)^ 2 +(Y2 - Y1)^ 2)
显然,X和Y是你的坐标。这速度要快得多,但远远不那么准确,尤其是距离增加时。
Haversine公式很慢,特别是如果你反复调用它但我不知道任何更快的方法来计算基于这个公式的距离。