计算任意两点间的方位角
方位角
是从某点的指北经线起,依顺时针方向到目标方向线之间的水平夹角(如图所示θ,可以将其看成是指南针所指示的角度),也即是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
}
以上计算公式适用于地球上任意两点,请注意经纬度分正负值。对于经度来说,东经为正,西经为负;对于纬度来说,北纬为为正,南纬为负。