Scheme 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为距离。
表 Select NLat As 纬度,NLon As 经度 From t_Data_G0001 Where STID='' And DStampTime='';
Select LLat As 纬度2,LLon As 经度2 From o_GISLabel Where SID =@SID;
时间为基准
经纬度的计算函数是这样的:
double D_jw(double wd1,double jd1,double wd2,double jd2)
{
double x,y,out;
double PI=3.14159265;
double R=6.371229*1e6;
x=(jd2-jd1)*PI*R*cos( ((wd1+wd2)/2) *PI/180)/180;
y=(wd2-wd1)*PI*R/180;
out=hypot(x,y);
return out/1000;
}
//Not Accurate
Scheme 2:
c# 根据经纬度计算两点之间的距离。项目中实际使用。大家放心使用。
public static double Fun_Rad(double d)
{
return d * Math.PI / 180.0;
}
public static double Fun_GetDistance(double lat1, double lng1, double lat2, double lng2)
{
double d_EarthRadius = 6378.137;
double radLat1 = Fun_Rad(lat1);
double radLat2 = Fun_Rad(lat2);
double radLat = Fun_Rad(lat1) - Fun_Rad(lat2);
double radLng = Fun_Rad(lng1) - Fun_Rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(radLat / 2), 2) +
Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(radLng / 2), 2)));
s = s * d_EarthRadius;
s = Math.Round(s * 10000) / 10000;
return s;
//More Accurate
Scheme 3:
C# co de
// 计算已知经纬度的两点间的距离 // Thu 2005.08.04 using System; struct JWD { double JD, JF, JM; double WD, WF, WM; public double Jd, Wd, J, W; public const double Ea = 6378137 ; // 赤道半径 public const double Eb = 6356725 ; // 极半径 public readonly double Ec; public readonly double Ed; // 构造函数, 经度: a 度, b 分, c 秒; 纬度: d 度, e 分, f 秒 public JWD( double a, double b, double c, double d, double e, double f) { JD = a; JF = b; JM = c; WD = d; WF = e; WM = f; Jd = JD + JF / 60 + JM / 3600 ; Wd = WD + WF / 60 + WM / 3600 ; J = Jd * Math.PI / 180 ; W = Wd * Math.PI / 180 ; Ec = Eb + (Ea - Eb) * ( 90 - Wd) / 90 ; Ed = Ec * Math.Cos(W); } } class Test { static void Main() { JWD A0 = new JWD( 120 , 36 , 0 , 28 , 0 , 0 ); JWD A1 = new JWD( 130 , 0 , 0 , 30 , 0 , 0 ); Calc(A0, A1); } static void Calc(JWD A, JWD B) { double dx = (B.J - A.J) * A.Ed; double dy = (B.W - A.W) * A.Ec; double d = Math.Sqrt(dx * dx + dy * dy); Console.WriteLine( " {0:N1}M " , d); } }