当前位置:文档之家› 3两点经纬度距离算法

3两点经纬度距离算法

Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2))); s = s * EARTH_RADIUS; s = Math.Round(s * 10000) / 10000; return s; }
参考资料 2 给出计算经纬度距离的 matlab 版本(代码太长,读者可自己链接,这是参考了 .au/geodesy/calcs/ 的方法);
8
9 /// <param name="to">Point in long/lat decimal degrees</param>
10
11 /// <returns>Distance in kilometers</returns>
12
13 private double CalcDistance(Point from, Point to)
}
GaussSphere 为自定义枚举类型 /// <summary> /// 高斯投影中所选用的参考椭球 /// </summary> public enum GaussSphere
{ Beijing54, Xian80, WGS84,
}
参考资料 5 给出了计算两点经纬度距离的众多方法,给出了计算公式(包括源码)和 改进的方法。所有这些公司都是基于地球是球体的假设,这个假设对众多的目的应用已经足够了 (实际上地球是一个类似椭球体,用一个球体计算模型最大的误差在 0.3%,详见该网页中的笔 记部分)。
参考资料
1.

Blog /yichangxin/archive/2009/02/16/3897553.aspx
2.
经纬度计算距离的 matlab 版本 /?p=197
3.
用 C#根据经纬度求两点间距离的函数代
码 /xionglee/articles/1493276.html
<OA>*<OB>=|OA|*|OB|*cosK 可以得到;
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) {
24
25
double p2X = to.X / 180 * Matle p2Y = to.Y / 180 * Math.PI;
28
29
30
31
return Math.Acos(Math.Sin(p1Y) * Math.Sin(p2Y) +
32
33
Math.Cos(p1Y) * Math.Cos(p2Y) * Math.Cos(p2X - p1X))
34 * rad;
35
}
(第二部分)
计算地球上两经纬度点 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.
x,y,a,b 都是角度,最后结果中给出的 arccos 因为弧度形式;
2.
所谓的“东经为正,西经为负,北纬为正,南纬为负”是为了计算的方便。比如
某点为西经 145°,南纬 36°,那么计算时可用(-145°,-36°);
3.
AB 对球心所张角的球法实际上是求<OA>和<OB>两向量的夹角 K。用公式
gs == GaussSphere.Xian80 ? 6378140.0 :
6378245.0)); }
s = Math.Round(s * 10000) / 10000; return s;
private static double Rad(double d) { return d * Math.PI / 180.0;
{ double radLat1 = Rad(lat1); double radLat2 = Rad(lat2); double a = radLat1 - radLat2; double b = Rad(lng1) - Rad(lng2);
double s = 2 * Math.Asin(Math.Sqrt(
14
15 {
16
17
double rad = 6371; //Earth radius in Km
18
19
//Convert to radians
20
21
double p1X = from.X / 180 * Math.PI;
22
23
double p1Y = from.Y / 180 * Math.PI;
return d * Math.PI / 180.0;
}
public static double GetDistance(double lat1, double lng1, double lat2, double lng2) {
double radLat1 = rad(lat1); double radLat2 = rad(lat2); double a = radLat1 - radLat2; double b = rad(lng1) - rad(lng2); double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) +
4.
权威计算方法 .au/geodesy/calcs/
5.
计算脚本网页 /scripts/latlong.html
参考资料 3 给出了从 Google Map 得到启示的 C#版本;
下面就是用 C#根据经纬度求两点间距离的函数代码
public static double DistanceOfTwoPoints(double lng1,double lat1, ng2, double lat2, GaussSphere gs)
/// <summary>
1
2 /// Calculates the distance between to lat/long points and returns the
3 approximate distance in kilometers
4
5 /// </summary>
6
7 /// <param name="from">Point in long/lat decimal degrees</param>
double l
Math.Pow(Math.Sin(a / 2), 2) + 2)
Math.Cos(radLat1) * Math.Cos(radLat
* Math.Pow(Math.Sin(b / 2), 2))); s = s * (gs == GaussSphere.WGS84 ? 6378137.0 : (
相关主题