两点的经纬度以及偏向角的计算

时间:2024-03-29 14:44:49

两点的经纬度以及偏向角的计算

一些参数需要知道,

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);
	}