(第一部分)
/// <summary>
/// Calculates the distance between to lat/long points and returns the approximate distance in kilometers
/// </summary>
/// <param name="from">Point in long/lat decimal degrees</param>
/// <param name="to">Point in long/lat decimal degrees</param>
/// <returns>Distance in kilometers</returns>
private double CalcDistance(Point from, Point to)
{
double rad = 6371; //Earth radius in Km
//Convert to radians
double p1X = from.X / 180 * Math.PI;
double p1Y = from.Y / 180 * Math.PI;
double p2X = to.X / 180 * Math.PI;
double p2Y = to.Y / 180 * Math.PI;
return Math.Acos(Math.Sin(p1Y) * Math.Sin(p2Y) +
Math.Cos(p1Y) * Math.Cos(p2Y) * Math.Cos(p2X - p1X)) * rad;
}
(第一部分)
/// <summary> /// Calculates the distance between to lat/long points and returns the approximate distance in kilometers /// </summary> /// <param name="from">Point in long/lat decimal degrees</param> /// <param name="to">Point in long/lat decimal degrees</param> /// <returns>Distance in kilometers</returns> private double CalcDistance(Point from, Point to) { double rad = 6371; //Earth radius in Km //Convert to radians double p1X = from.X / 180 * Math.PI; double p1Y = from.Y / 180 * Math.PI; double p2X = to.X / 180 * Math.PI; double p2Y = to.Y / 180 * Math.PI; return Math.Acos(Math.Sin(p1Y) * Math.Sin(p2Y) + Math.Cos(p1Y) * Math.Cos(p2Y) * Math.Cos(p2X - p1X)) * rad; }
(第二部分)
计算地球上两经纬度点A B间距离
在GIS应用中,计算两点之间距离的公式非常重要,这里仅列出几种计算方法。
假设地球是一个标准球体,半径为R,并且假设东经为正,西经为负,北纬为正,南纬为负,
则 A(x,y)的坐标可表示为(R*cosy*cosx,R*cosy*sinx,R*siny) B(a,b)可表示为(R*cosb*cosa,R*cosb*sina,R*sinb)
于是,AB对于球心所张的角的余弦大小为
cosb*cosy*(cosa*cosx+sina*sinx)+sinb*siny
=cosb*cosy*cos(a-x)+sinb*siny
因此AB两点的球面距离为
R*{arccos[cosb*cosy*cos(a-x)+sinb*siny]}
注意几点:
1.
2.
3.
4.
参考资料1给出了计算通过两个点的经纬度计算距离;
原理为:
地球赤道上环绕地球一周走一圈共40075.04公里,而@一圈分成360°,而每1°(度)有60,每一度一秒在赤道上的长度计算如下:
40075.04km/360°=111.31955km
111.31955km/60=1.8553258km=1855.3m
而每一分又有60秒,每一秒就代表1855.3m/60=30.92m
任意两点距离计算公式为
d=111.12cos{1/[sinΦAsinΦB十cosΦAcosΦBcos(λB—λA)]}
其中A点经度,纬度分别为λA和ΦA,B点的经度、纬度分别为λB和ΦB,d为距离。
c#代码
private const double EARTH_RADIUS = 6378.137; //地球半径
private static double rad(double d)
{
}
public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
{
}
参考资料2给出计算经纬度距离的matlab版本(代码太长,读者可自己链接,这是参考了http://www.ga.gov.au/geodesy/calcs/ 的方法);
public
Math.Pow(Math.Sin(a
*
gs
6378245.0));
参考资料
1.
2.
3.
4.
5.