一些参数需要知道,
Aj:A点经度 Aw:A点纬度
Bj:B点经度 Bw:B点纬度
北纬为正,南纬为负;东经为正,西经为负
地球平均半径R(已知),AB两点距离L,B点相对于A点的偏向角Azimuth
需要精确到32位左右。
参考文献: http://blog.sina.com.cn/s/blog_658a93570101hynw.html
1.根据两点的经纬度求偏向角
public static double test1(double Aj, double Aw, double Bj, double Bw) {
double cosC = Math.cos((90 - Bw) * pi / 180) * Math.cos((90 - Aw) * pi / 180)
+ Math.sin((90 - Bw) * pi / 180) * Math.sin((90 - Aw) * pi / 180) * Math.cos((Bj - Aj) * pi / 180);
double sinC = Math.sqrt(1 - Math.pow(cosC, 2));
double sinA = Math.sin((90 - Bw) * pi / 180) * Math.sin((Bj - Aj) * pi / 180) / sinC;
return Math.asin(sinA) * 180 / pi;
}
其中
B点在第一象限,Azimuth=A;
B在第二象限,Azimuth=360+A;
B在第三四象限,Azimuth=180-A。
2.根据两点的经纬度求两点的距离L
public static double test2(double Aj, double Aw, double Bj, double Bw) {
double cosC = Math.cos((90 - Bw) * pi / 180) * Math.cos((90 - Aw) * pi / 180)
+ Math.sin((90 - Bw) * pi / 180) * Math.sin((90 - Aw) * pi / 180) * Math.cos((Bj - Aj) * pi / 180);
double C = Math.acos(cosC);
return C * R;
}
3.根据一点的经纬度、偏向角和距离求另一点的经纬度
public static void test3(double Aj, double Aw, double Azimuth) {
double c = L / R * 180 / pi;
double a = Math.acos(Math.cos(90 - Aw) * Math.cos(c) + Math.sin(90 - Aw) * Math.sin(c) * Math.cos(Azimuth * pi / 180));
double Bw = 90 - a * 180 / pi;
double C = Math.asin(Math.sin(c) * Math.sin(Azimuth * pi / 180) / Math.sin(a));
double Bj = Aj + C * 180 / pi;
System.out.println("Bw:" + Bw);
System.out.println("Bj:" + Bj);
}