golang计算任意两点间的方位角

计算任意两点间的方位角

方位角是从某点的指北经线起,依顺时针方向到目标方向线之间的水平夹角(如图所示θ,可以将其看成是指南针所指示的角度),也即是OPN平面与OPQ平面的所构成的二面角大小。

以北极点N为顶点,N-PQO构成了一个三面角。

二面角N-PQ-O的大小为θ,其平面角为π/2 - φ2;
二面角p-ON-Q的大小为λ2−λ1,其平面角为δ;

由三面角正弦定理可得:

在这里插入图片描述

由三面角余弦定理可得:

在这里插入图片描述

由此可得:

在这里插入图片描述

结合上述在求解两点间的距离时得到的结果:

在这里插入图片描述

可得到:

在这里插入图片描述

进而得到方位角:

在这里插入图片描述

二面角
从一条直线出发的两个半平面所组成的图形,叫做二面角。 这条直线叫做二面角的棱,每个半平面叫做二面角的面。以二面角的公共直线上任意一点为端点,在两个面内分别作垂直于公共直线的两条射线,这两条射线所成的角叫做二面角的平面角。二面角的大小, 可以用它的平面角来度量。

三面角
从一点出发并且不在同一平面内的三条射线,其中每相邻两射线可以决定一个平面,这样的三个平面所围成的立体图形叫做三面角。其中,这三条射线叫做三面角的棱,这些射线的公共端点叫做三面角的顶点,相邻两棱所夹的平面部分叫做三面角的面,在每个面内两条棱所形成的角叫做三面角的面角,过每一条棱的两个面所形成的二面角叫做三面角的二面角。一个三面角可以用它的顶点的字母来表示,例如“三面角S”;或在顶点的字母之后加一短划,并顺次写上每一条棱上的一个字母,例如“三面角S-ABC”。

工程实现

下面是计算地球上任意两点间的方位角的工程实现,使用golang语言:

func Radians(x float64) float64 {
	return x/math.Pi
}

//地球上任意两点间的方位角
func Complex(lon1,lat1,lon2,lat2 float64) float64{
	var numerator = math.Sin(Radians(lon2-lon1)) * math.Cos(Radians(lat2))
	var denominator = math.Cos(Radians(lat1)) * math.Sin(Radians(lat2))- math.Sin(Radians(lat1)) * math.Cos(Radians(lat2)) * math.Cos(Radians(lon2 - lon1))
	var x = math.Atan2(math.Abs(numerator), math.Abs(denominator))
	var result = x
	// 右象限
	if lon2 > lon1 {
		// 第一象限
		if lat2 > lat1{
			result = x
		} else if lat2 < lat1{ // 第四象限
			result = math.Pi - x
		}else{
			result = math.Pi / 2 // 在正x轴上
		}
	}else if lon2 < lon1{
		if lat2 > lat1{// 第二象限
			result = 2 * math.Pi - x
		}else if lat2 < lat1{ // 第三象限
			result = math.Pi + x
		}else{
			result = math.Pi * 3 / 2 // 在负x轴上
		}
	}else // 同一经度
	{
		if lat2 > lat1{ // 在正y轴上
			result = 0
		}else if lat2 < lat1{
			result = math.Pi // 在负y轴中
		}else{
			fmt.Println("不应该在同一个地方!")
		}
	}
	return result * 180 / math.Pi
}

以上计算公式适用于地球上任意两点,请注意经纬度分正负值。对于经度来说,东经为正,西经为负;对于纬度来说,北纬为为正,南纬为负。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值