地理测绘基础知识(6) 照射距离等值线计算

news2025/2/28 15:28:22

上一篇文章中,我们采用HPR坐标系里的向量旋转,在地表绘制了这样的螺旋线:
2
在复杂多样的现实应用需求中,还有一种更为普遍的计算需求,就是求取地表到全向光源的距离为D的所有点的集合(用多边形组成的近似椭圆区域)。

1. 问题描述

问题:已知一个点 T 位于空中,求取所有海拔为H的点M组成的集合,使得点M距离T的直线距离为D米。

如果是在一个正球中,这个问题是非常容易解决的,直接求解三角函数即可。而且,在正球下,二者的图形都是圆,且仰角与距离是等效的概念。椭球中,情况就复杂起来了,因为各个方向上的曲率是不同的,仰角也不同。相同仰角下,距离也不同。

下面为了方便,假设光源T的经度 θ \theta θ=0,纬度为 φ \varphi φ,高度为Hb。要计算的椭球的高度是Ha。光源的ECEF坐标为 T ⃗ = { A , C , E } \vec T=\{A,C,E\} T ={A,C,E},已经提前计算完毕。

Problem

2. 投射推导

由于椭球的曲率和经度无关,假设手电的经度为0. 对于全向光源,姿态为 Heading=0, Pitch=-90, Roll = 0, 也就是手电垂直指向地面。

此时,HPR坐标系的逆运算矩阵变为:
T e n u ′ = [ sin ⁡ ( h ) cos ⁡ ( p ) cos ⁡ ( h ) cos ⁡ ( p ) sin ⁡ ( p ) − sin ⁡ ( h ) sin ⁡ ( p ) cos ⁡ ( r ) + sin ⁡ ( r ) cos ⁡ ( h ) − sin ⁡ ( h ) sin ⁡ ( r ) − sin ⁡ ( p ) cos ⁡ ( h ) cos ⁡ ( r ) cos ⁡ ( p ) cos ⁡ ( r ) sin ⁡ ( h ) sin ⁡ ( p ) sin ⁡ ( r ) + cos ⁡ ( h ) cos ⁡ ( r ) − sin ⁡ ( h ) cos ⁡ ( r ) + sin ⁡ ( p ) sin ⁡ ( r ) cos ⁡ ( h ) − sin ⁡ ( r ) cos ⁡ ( p ) ] T'_{enu}=\left[\begin{matrix}\sin{\left(h \right)} \cos{\left(p \right)} & \cos{\left(h \right)} \cos{\left(p \right)} &\sin{\left(p \right)}\\- \sin{\left(h \right)} \sin{\left(p \right)} \cos{\left(r \right)} + \sin{\left(r \right)} \cos{\left(h \right)} & - \sin{\left(h \right)} \sin{\left(r \right)} - \sin{\left(p \right)} \cos{\left(h \right)} \cos{\left(r \right)} & \cos{\left(p \right)} \cos{\left(r \right)}\\\sin{\left(h \right)} \sin{\left(p \right)} \sin{\left(r \right)} + \cos{\left(h \right)} \cos{\left(r \right)} & - \sin{\left(h \right)} \cos{\left(r \right)} + \sin{\left(p \right)} \sin{\left(r \right)} \cos{\left(h \right)} & - \sin{\left(r \right)} \cos{\left(p \right)}\end{matrix}\right] Tenu= sin(h)cos(p)sin(h)sin(p)cos(r)+sin(r)cos(h)sin(h)sin(p)sin(r)+cos(h)cos(r)cos(h)cos(p)sin(h)sin(r)sin(p)cos(h)cos(r)sin(h)cos(r)+sin(p)sin(r)cos(h)sin(p)cos(p)cos(r)sin(r)cos(p)

T t = T e n u ′ T = [ 0 0 1 0 − 1 0 1 0 0 ] Tt=T'^T_{enu}=\left[\begin{matrix}0 & 0 & 1\\0 & -1 & 0\\1 & 0 & 0\end{matrix}\right] Tt=TenuT= 001010100

而 ENU的逆运算矩阵变为:

R = [ − sin ⁡ θ cos ⁡ θ 0 − sin ⁡ φ c o s θ − sin ⁡ φ sin ⁡ θ cos ⁡ φ cos ⁡ φ c o s θ cos ⁡ φ sin ⁡ θ sin ⁡ φ ] R = \begin{bmatrix} {-\sin \theta} & {\cos \theta} & 0\\ {-\sin \varphi cos\theta} & {-\sin \varphi \sin \theta} & {\cos \varphi} \\ \cos \varphi cos\theta & \cos \varphi \sin \theta & \sin \varphi \end{bmatrix} R= sinθsinφcosθcosφcosθcosθsinφsinθcosφsinθ0cosφsinφ

R T = [ 0 − sin ⁡ ( φ ) cos ⁡ ( φ ) 1 0 0 0 cos ⁡ ( φ ) sin ⁡ ( φ ) ] R^T=\left[\begin{matrix}0 & - \sin{\left( \varphi\right)} & \cos{\left( \varphi \right)}\\1 & 0 & 0\\0 & \cos{\left( \varphi \right)} & \sin{\left( \varphi \right)}\end{matrix}\right] RT= 010sin(φ)0cos(φ)cos(φ)0sin(φ)

α β \alpha \beta αβ坐标下,HPR光线的矢量为:

K h p r = [ cos ⁡ ( α ) sin ⁡ ( α ) cos ⁡ ( β ) sin ⁡ ( α ) sin ⁡ ( β ) ] T K_{hpr}=\left[\begin{matrix}\cos{\left(\alpha \right)} \\ \sin{\left(\alpha \right)} \cos{\left(\beta \right)} \\ \sin{\left(\alpha \right)} \sin{\left(\beta \right)}\end{matrix}\right]^T Khpr= cos(α)sin(α)cos(β)sin(α)sin(β) T

变换到 ECEF:

K e c e f = K h p r × T e n u ′ T × R T K_{ecef}=K_{hpr} \times T'^T_{enu} \times R^T Kecef=Khpr×TenuT×RT

化简:

K e c e f = [ − sin ⁡ ( α ) cos ⁡ ( β ) − sin ⁡ ( α ) sin ⁡ ( β ) sin ⁡ ( φ ) + cos ⁡ ( α ) cos ⁡ ( φ ) sin ⁡ ( α ) sin ⁡ ( β ) cos ⁡ ( φ ) + sin ⁡ ( φ ) cos ⁡ ( α ) ] T K_{ecef}=\left[\begin{matrix}- \sin{\left(\alpha \right)} \cos{\left(\beta \right)} \\ - \sin{\left(\alpha \right)} \sin{\left(\beta \right)} \sin{\left(\varphi \right)} + \cos{\left(\alpha \right)} \cos{\left(\varphi \right)} \\ \sin{\left(\alpha \right)} \sin{\left(\beta \right)} \cos{\left(\varphi \right)} + \sin{\left(\varphi \right)} \cos{\left(\alpha \right)}\end{matrix}\right]^T Kecef= sin(α)cos(β)sin(α)sin(β)sin(φ)+cos(α)cos(φ)sin(α)sin(β)cos(φ)+sin(φ)cos(α) T

这就是在投射角度 α β \alpha \beta αβ 在ECEF坐标下的单位方向矢量。

利用参数方程, 可以得到过 T的直线为

T M ⃗ = T ⃗ + K e c e f ⋅ t \vec {TM} = \vec T+K_{ecef} \cdot {t} TM =T +Keceft

t 是距离量,单位是米。

根据上一章的推导,我们知道 t 的根有0、1或者2个。在带入了 β \beta β α \alpha α的情况下,可以求解方程。

3 模型求解

现在,要求这个直线和椭球交汇为一点A,且交会时,距离 t = D,已知 β \beta β,求取 α \alpha α
对一个高度为H的标准椭球,其方程为:

x 2 ( a + H ) 2 + y 2 ( a + H ) 2 + z 2 ( b + H ) 2 = 1 \frac{x^2}{(a+H)^2}+\frac{y^2}{(a+H)^2}+\frac{z^2}{(b+H)^2}=1 (a+H)2x2+(a+H)2y2+(b+H)2z2=1

为了便于展开,设 G = 1 ( a + H ) 2 G=\frac{1}{(a+H)^2} G=(a+H)21 L = 1 ( b + H ) 2 L=\frac{1}{(b+H)^2} L=(b+H)21
按照上一章直线与椭球的交点结论,直接给出方程为:

t [ 1 ] = 2 ⋅ ( 4 A G sin ⁡ ( α ) cos ⁡ ( β ) + 4 C G sin ⁡ ( α ) sin ⁡ ( β ) sin ⁡ ( φ ) − 4 C G cos ⁡ ( α ) cos ⁡ ( φ ) − 4 E L sin ⁡ ( α ) sin ⁡ ( β ) cos ⁡ ( φ ) − 4 E L sin ⁡ ( φ ) cos ⁡ ( α ) + 2 ( − A 2 G − C 2 G − E 2 L + 1 ) ( − G ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 G sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) sin ⁡ 2 ( φ ) + 8 G sin ⁡ 2 ( α ) cos ⁡ 2 ( β ) + 8 G cos ⁡ 2 ( α ) cos ⁡ 2 ( φ ) + L ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 L sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) cos ⁡ 2 ( φ ) + 8 L sin ⁡ 2 ( φ ) cos ⁡ 2 ( α ) ) + 8 ( − A G sin ⁡ ( α ) cos ⁡ ( β ) − C G sin ⁡ ( α ) sin ⁡ ( β ) sin ⁡ ( φ ) + C G cos ⁡ ( α ) cos ⁡ ( φ ) + E L sin ⁡ ( α ) sin ⁡ ( β ) cos ⁡ ( φ ) + E L sin ⁡ ( φ ) cos ⁡ ( α ) ) 2 ) − G ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 G sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) sin ⁡ 2 ( φ ) + 8 G sin ⁡ 2 ( α ) cos ⁡ 2 ( β ) + 8 G cos ⁡ 2 ( α ) cos ⁡ 2 ( φ ) + L ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 L sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) cos ⁡ 2 ( φ ) + 8 L sin ⁡ 2 ( φ ) cos ⁡ 2 ( α ) t[1]=\frac{2 \cdot (4 A G \sin{(\alpha )} \cos{(\beta )} + 4 C G \sin{(\alpha )} \sin{(\beta )} \sin{(\varphi )}- 4 C G \cos{(\alpha )} \cos{(\varphi )} - 4 E L \sin{(\alpha )} \sin{(\beta )} \cos{(\varphi )} - 4 E L \sin{(\varphi )} \cos{(\alpha )} + \sqrt{2} \sqrt{(- A^{2} G - C^{2} G - E^{2} L + 1) (- G (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 G \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \sin^{2}{(\varphi )} + 8 G \sin^{2}{(\alpha )} \cos^{2}{(\beta )} + 8 G \cos^{2}{(\alpha )} \cos^{2}{(\varphi )} + L (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 L \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \cos^{2}{(\varphi )} + 8 L \sin^{2}{(\varphi )} \cos^{2}{(\alpha )}) + 8 (- A G \sin{(\alpha )} \cos{(\beta )} - C G \sin{(\alpha )} \sin{(\beta )} \sin{(\varphi )} + C G \cos{(\alpha )} \cos{(\varphi )} + E L \sin{(\alpha )} \sin{(\beta )} \cos{(\varphi )} + E L \sin{(\varphi )} \cos{(\alpha )})^{2}})}{- G (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 G \sin^{2}{(\alpha )} \sin^{2}{(\beta )}\sin^{2}{(\varphi )} + 8 G \sin^{2}{(\alpha )} \cos^{2}{(\beta )} + 8 G \cos^{2}{(\alpha )} \cos^{2}{(\varphi )} + L (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 L \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \cos^{2}{(\varphi )} + 8 L \sin^{2}{(\varphi )} \cos^{2}{(\alpha )}} t[1]=G(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Gsin2(α)sin2(β)sin2(φ)+8Gsin2(α)cos2(β)+8Gcos2(α)cos2(φ)+L(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Lsin2(α)sin2(β)cos2(φ)+8Lsin2(φ)cos2(α)2(4AGsin(α)cos(β)+4CGsin(α)sin(β)sin(φ)4CGcos(α)cos(φ)4ELsin(α)sin(β)cos(φ)4ELsin(φ)cos(α)+2 (A2GC2GE2L+1)(G(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Gsin2(α)sin2(β)sin2(φ)+8Gsin2(α)cos2(β)+8Gcos2(α)cos2(φ)+L(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Lsin2(α)sin2(β)cos2(φ)+8Lsin2(φ)cos2(α))+8(AGsin(α)cos(β)CGsin(α)sin(β)sin(φ)+CGcos(α)cos(φ)+ELsin(α)sin(β)cos(φ)+ELsin(φ)cos(α))2 )

t [ 2 ] = 2 ( 2 ( − A 2 G − C 2 G − E 2 L + 1 ) ( − G ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 G sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) sin ⁡ 2 ( φ ) + 8 G sin ⁡ 2 ( α ) cos ⁡ 2 ( β ) + 8 G cos ⁡ 2 ( α ) cos ⁡ 2 ( φ ) + L ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 L sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) cos ⁡ 2 ( φ ) + 8 L sin ⁡ 2 ( φ ) cos ⁡ 2 ( α ) ) + 8 ( − A G sin ⁡ ( α ) cos ⁡ ( β ) − C G sin ⁡ ( α ) sin ⁡ ( β ) sin ⁡ ( φ ) + C G cos ⁡ ( α ) cos ⁡ ( φ ) + E L sin ⁡ ( α ) sin ⁡ ( β ) cos ⁡ ( φ ) + E L sin ⁡ ( φ ) cos ⁡ ( α ) ) 2 ( G ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) − 8 G sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) sin ⁡ 2 ( φ ) − 8 G sin ⁡ 2 ( α ) cos ⁡ 2 ( β ) − 8 G cos ⁡ 2 ( α ) cos ⁡ 2 ( φ ) − L ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) − 8 L sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) cos ⁡ 2 ( φ ) − 8 L sin ⁡ 2 ( φ ) cos ⁡ 2 ( α ) ) − 4 ( − A G sin ⁡ ( α ) cos ⁡ ( β ) − C G sin ⁡ ( α ) sin ⁡ ( β ) sin ⁡ ( φ ) + C G cos ⁡ ( α ) cos ⁡ ( φ ) + E L sin ⁡ ( α ) sin ⁡ ( β ) cos ⁡ ( φ ) + E L sin ⁡ ( φ ) cos ⁡ ( α ) ) ( − G ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 G sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) sin ⁡ 2 ( φ ) + 8 G sin ⁡ 2 ( α ) cos ⁡ 2 ( β ) + 8 G cos ⁡ 2 ( α ) cos ⁡ 2 ( φ ) + L ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 L sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) cos ⁡ 2 ( φ ) + 8 L sin ⁡ 2 ( φ ) cos ⁡ 2 ( α ) ) ) ( − G ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 G sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) sin ⁡ 2 ( φ ) + 8 G sin ⁡ 2 ( α ) cos ⁡ 2 ( β ) + 8 G cos ⁡ 2 ( α ) cos ⁡ 2 ( φ ) + L ( sin ⁡ ( − 2 α + β + 2 φ ) + sin ⁡ ( 2 α − β + 2 φ ) + sin ⁡ ( 2 α + β − 2 φ ) − sin ⁡ ( 2 α + β + 2 φ ) ) + 8 L sin ⁡ 2 ( α ) sin ⁡ 2 ( β ) cos ⁡ 2 ( φ ) + 8 L sin ⁡ 2 ( φ ) cos ⁡ 2 ( α ) ) 2 t[2]=\frac{2 (\sqrt{2} \sqrt{(- A^{2} G - C^{2} G - E^{2} L + 1) (- G (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} -\sin{(2 \alpha + \beta + 2 \varphi )}) + 8 G \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \sin^{2}{(\varphi )} + 8 G \sin^{2}{(\alpha )} \cos^{2}{(\beta )} + 8 G \cos^{2}{(\alpha )} \cos^{2}{(\varphi )} + L (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} +\sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 L \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \cos^{2}{(\varphi )} + 8 L \sin^{2}{(\varphi )} \cos^{2}{(\alpha )}) + 8 (- A G \sin{(\alpha )} \cos{(\beta )} - C G \sin{(\alpha )} \sin{(\beta )} \sin{(\varphi )} + C G \cos{(\alpha )} \cos{(\varphi )} + E L \sin{(\alpha )} \sin{(\beta )} \cos{(\varphi )} + E L \sin{(\varphi )} \cos{(\alpha )})^{2}} (G (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) - 8 G \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \sin^{2}{(\varphi )} - 8 G \sin^{2}{(\alpha )} \cos^{2}{(\beta )} - 8 G \cos^{2}{(\alpha )} \cos^{2}{(\varphi )} - L (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) - 8 L \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \cos^{2}{(\varphi )} - 8 L \sin^{2}{(\varphi )} \cos^{2}{(\alpha )}) - 4 (- A G \sin{(\alpha )} \cos{(\beta )} - C G \sin{(\alpha )} \sin{(\beta )} \sin{(\varphi )} + C G \cos{(\alpha )} \cos{(\varphi )} + E L \sin{(\alpha )} \sin{(\beta )} \cos{(\varphi)} + E L \sin{(\varphi )} \cos{(\alpha )}) (- G (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 G \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \sin^{2}{(\varphi )} + 8 G \sin^{2}{(\alpha )} \cos^{2}{(\beta )} + 8 G \cos^{2}{(\alpha )} \cos^{2}{(\varphi )} + L (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 L \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \cos^{2}{(\varphi )} + 8 L \sin^{2}{(\varphi )} \cos^{2}{(\alpha )}))}{(- G (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 G \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \sin^{2}{(\varphi )} + 8 G \sin^{2}{(\alpha )} \cos^{2}{(\beta )} + 8 G \cos^{2}{(\alpha )} \cos^{2}{(\varphi )} + L (\sin{(- 2 \alpha + \beta + 2 \varphi )} + \sin{(2 \alpha - \beta + 2 \varphi )} + \sin{(2 \alpha + \beta - 2 \varphi )} - \sin{(2 \alpha + \beta + 2 \varphi )}) + 8 L \sin^{2}{(\alpha )} \sin^{2}{(\beta )} \cos^{2}{(\varphi )} + 8 L \sin^{2}{(\varphi )} \cos^{2}{(\alpha )})^{2}} t[2]=(G(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Gsin2(α)sin2(β)sin2(φ)+8Gsin2(α)cos2(β)+8Gcos2(α)cos2(φ)+L(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Lsin2(α)sin2(β)cos2(φ)+8Lsin2(φ)cos2(α))22(2 (A2GC2GE2L+1)(G(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Gsin2(α)sin2(β)sin2(φ)+8Gsin2(α)cos2(β)+8Gcos2(α)cos2(φ)+L(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Lsin2(α)sin2(β)cos2(φ)+8Lsin2(φ)cos2(α))+8(AGsin(α)cos(β)CGsin(α)sin(β)sin(φ)+CGcos(α)cos(φ)+ELsin(α)sin(β)cos(φ)+ELsin(φ)cos(α))2 (G(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))8Gsin2(α)sin2(β)sin2(φ)8Gsin2(α)cos2(β)8Gcos2(α)cos2(φ)L(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))8Lsin2(α)sin2(β)cos2(φ)8Lsin2(φ)cos2(α))4(AGsin(α)cos(β)CGsin(α)sin(β)sin(φ)+CGcos(α)cos(φ)+ELsin(α)sin(β)cos(φ)+ELsin(φ)cos(α))(G(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Gsin2(α)sin2(β)sin2(φ)+8Gsin2(α)cos2(β)+8Gcos2(α)cos2(φ)+L(sin(2α+β+2φ)+sin(2αβ+2φ)+sin(2α+β2φ)sin(2α+β+2φ))+8Lsin2(α)sin2(β)cos2(φ)+8Lsin2(φ)cos2(α)))

Octave 符号计算的程序:

clc
clear
pkg load symbolic

a = sym('a');
b = sym('b');

h = sym('0');
p = sym('pi/2');
r = sym('0');

TT = [
sin(h)*cos(p), -sin(h)*sin(p)*cos(r)+sin(r)*cos(h), sin(h)*sin(p)*sin(r)+cos(h)*cos(r);
cos(h)*cos(p), -sin(h)*sin(r)-sin(p)*cos(h)*cos(r),-sin(h)*cos(r)+sin(p)*sin(r)*cos(h);
sin(p), cos(p)*cos(r), -sin(r)*cos(p)
];



ts = sym('0');
tf = sym('tf');

TR = [
-sin(ts),-sin(tf)*cos(ts),cos(tf)*cos(ts);
cos(ts),-sin(tf)*sin(ts),cos(tf)*sin(ts);
0,cos(tf),sin(tf)
];

Khpr = [cos(a),sin(a)*cos(b),sin(a)*sin(b)];

Kecef = Khpr * TT * TR;

G = sym('G');
L = sym('L');
A = sym('A');
B = Kecef(1);
C = sym('C');
D = Kecef(2);
E = sym('E');
F = Kecef(3);
t = sym('t');
Tt=solve(G*(A+B*t)^2 + G*(C+D*t)^2 + K*(E+F*t)^2==1,t);
Ts=simplify(Tt);
latex(Ts)

注意,上面的方程中,是写成了 t 的形式,但未知数却是 α \alpha α,它是一个非线性的高次三角方程。

但对于定义域在[0,-90]度的角度 来说,可以研究一下它的单调性,以采用计算方法进行求解。这个关于 α \alpha α的方程,在俯视时,角度与距离的关系是非线性递增的。

角度-距离我们可以采用二分查找的方法,较为迅速的锁定角度值。

4 主要接口

下面这个函数可以按照给定的 β \beta β求取位置。距离的最小值,就是手电到椭球的最短距离(H)。距离的最大值,是各个方向上做切线,切线段的长度。满足值域范围的进行迭代计算;不满足的,返回最小或者最大值。

/*!
 * \brief contour_distance 计算到空间位置LLA坐标 T 距离为D的地面位置集合。
 * \param lla_torch		全向光源的位置
 * \param queryD		距离等值线的距离。D=0会返回最短距离, D超过最大距离,则返回最大距离。
 * \param earth_H		地表高度
 * \param vec_beta		给定的HPR beta,正北是0,顺时针递增
 * \param vec_lat		存储纬度的向量
 * \param vec_lon		存储经度的向量
 * \param vec_D			存储距离的向量
 * \param derrMeter		迭代误差,默认1mm
 * \param rad			弧度true/度 false
 * \param latfirst		纬度经度高度 true/经度 纬度 高度 false
 */
void contour_distance(const double lla_torch [3],
					  const double queryD,
					  const double earth_H,
					  const std::vector<double> vec_beta,
					  std::vector<double> * vec_lat,
					  std::vector<double> * vec_lon,
					  std::vector<double> * vec_D,
					  const double derrMeter = 1e-3,
					  const bool rad = false,
					  const bool latfirst = true)

注意,椭球上,各个 β \beta β方向上的最大距离是不同的。

5. 例子

我们求取不同距离上的围线:

void demo_contour_distance()
{
	printf ("\n\n========%s=======\n",__FUNCTION__);
	using namespace CES_GEOCALC;
	//光源的LLA
	const double lla_torch [3] = {35.273, 117.121, 10000};

	std::vector<double> betas;
	for (int i=0;i<360;i+=5)
		betas.push_back(i);

	std::vector<double> lats,lons,Ds;

	contour_distance(lla_torch,123000,100,betas,&lats,&lons,&Ds);

	const size_t res_sz = lats.size();

	for (size_t i=0;i<res_sz;++i)
	{
		printf("%.6lf,%.6lf\n",lats[i],lons[i]);
	}

}

在不同的纬度、高度下,效果如下图:

Rings在这里插入图片描述

6 代码

代码参考

https://gitcode.net/coloreaglestdio/geocalc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/996315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB简介以及安装

文章目录 1. MongoDB简介2. NoSQL简介3. MongoDB安装 1. MongoDB简介 MongoDB是一种NoSQL数据库&#xff0c;采用了文档数据库模型。它以BSON&#xff08;Binary JSON&#xff09;格式存储数据&#xff0c;支持动态模式和灵活的查询语言。MongoDB具有以下特点&#xff1a; 文…

虚拟机 + Ubuntu22.04 + ros2 (humble) colcon build turtlebot3_node失败的解决方案

一、问题描述 在虚拟机Ubuntu22.04中安装了ROS2&#xff08;humble&#xff09;,下载turtlebot3。在colcon build --symlink-install 编译的过程中turtlebot3_Fake_node一直失败&#xff0c;无法正常运行&#xff0c;影响后面的仿真测试。 二、解决方案 查阅相关资料后发现问…

JAVA 从入门到起飞 面向对象 day08 P2

老师的知识点1 在JAVA中&#xff0c;必须先设计类&#xff0c;才能获得对象。 我的理解&#xff1a; 疑问&#xff1a;为什么是这样的呢&#xff1f; 答案&#xff1a; 在 JAVA 或其他面向对象的编程语言中&#xff0c;类是对象的蓝图或模板。这意味着在你创建对象之前&am…

【已解决】在Win11上离线安装 .NET Framework 3.5的方法【含网盘离线文件】

随 Windows 11提供的是.NET Framework 4.8&#xff0c;该环境可以运行任何 .NET Framework 4.x 应用。 而.NET Framework 3.5 支持为 .NET Framework 2.0 到 3.5 生成的应用&#xff0c;需要自行安装。 当Win11的应用软件需要.net framework3.5的运行环境时&#xff0c;就会提…

领域驱动设计:微服务架构模型

文章目录 整洁架构六边形架构DDD 分层架构三种微服务架构模型的对比和分析从三种架构模型看中台和微服务设计 整洁架构 整洁架构又名“洋葱架构”。为什么叫它洋葱架构&#xff1f;整洁架构的层就像洋葱片一样&#xff0c;它体现了分层的设计思想。在整洁架构里&#xff0c;同…

跨站请求伪造

CSRF是什么&#xff1f; 跨站请求伪造(Cross Site Request Forgery&#xff0c;CSRF)是一种攻击&#xff0c;它强制浏览器客户端用户在当前对其进行身份验证后的Web 应用程序上执行非本意操作的攻击&#xff0c;攻击的重点在于更改状态的请求&#xff0c;而不是盗取数据&#x…

西部是真的地广人稀啊,常用地市东西分布差异明显

背景 最近在使用folium处理一些工作上的事情&#xff0c;这过程中发现一些GPS坐标数据的获取和置换不是太方便&#xff0c;尤其是坐标置换&#xff0c;做了一些工作进行了GPS坐标数据秘坐标置换方向的封装。 GPS坐标类封装的过程中&#xff0c;发现一些常用的GPS坐标的查取比…

安装程序报错“E: Sub-process /usr/bin/dpkg returned an error code (1)”的解决办法

今天在终端使用命令安装程序时出现了如下的报错信息。 E: Sub-process /usr/bin/dpkg returned an error code (1) 这种情况下安装什么程序最终都会报这个错&#xff0c;具体的报错截图如下图所示。 要解决这个问题&#xff0c;首先使用下面的命令进到相应的目录下。 cd /var/…

项目02—基于keepalived+mysqlrouter+gtid半同步复制的MySQL集群

文章目录 一.项目介绍1.拓扑图2.详细介绍 二.前期准备1.项目环境2.IP划分 三. 项目步骤1.ansible部署软件环境1.1 安装ansible环境1.2 建立免密通道1.3 ansible批量部署软件1.4 统一5台mysql服务器的数据 2.配置基于GTID的半同步主从复制2.1 在master上安装配置半同步的插件,再…

蓝桥杯官网练习题(玩具蛇)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一条玩具蛇&#xff0c;一共有 16 节&#xff0c;上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。 小蓝还有一个…

ROS学习笔记(五)---话题发布

1. 话题通信是什么 在ROS&#xff08;机器人操作系统&#xff09;中&#xff0c;话题通信是一种常用的通信机制&#xff0c;用于在不同的ROS节点之间传递消息。话题通信基于发布者-订阅者模式&#xff0c;其中一个节点&#xff08;发布者&#xff09;发布消息到一个特定的话题…

使用最新android sdk 将jar文件编译成dex

最近需要一些比较骚的操作&#xff0c;所以需要将gson编译成dex。 因为手上有jar包&#xff0c;所以就拿出了android sdk准备一把入魂&#xff0c;结果报错不断&#xff0c;让人无奈。只好根据报错来调整编译步骤&#xff0c;不得不为安卓环境更新Debug。 1、dx变d8 并不确定…

postgresql-通用表达式

postgresql-通用表达式 入门案例简单CTE递归 CTE案例1案例2 入门案例 -- 通用表达式 with t(n) as (select 2) select * from t;简单CTE WITH cte_name (col1, col2, ...) AS (cte_query_definition ) sql_statement;WITH 表示定义 CTE&#xff0c;因此 CTE 也称为 WITH 查询…

Pandas中at、iat函数详解

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 at 函数&#xff1a;通过行名和列名来取值&#xff08;取行名为a, 列名为A的值&#xff09; iat 函数&#xff1a;通过行号和列号来取值&#xff08;取第1行&#xff0c;第1列的值&#xff09; 本文给出at、iat常见的…

Mybatis-Plus-入门简介(2)

Mybatis-Plus-入门简介 1.简介 Mybatis-Plus官网&#xff1a;https://baomidou.com/ Mybatis-Plus仓库地址&#xff1a;https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter 仓库地址&#xff1a;仓库地址&#xff1a;https://gitee.com/long-xiaozhe…

932. 漂亮数组

932. 漂亮数组 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 932. 漂亮数组 https://leetcode.cn/problems/beautiful-array/description/ 完成情况&#xff1a; 解题思路&#xff1a; nums 是由范围 [1, n] 的…

智慧公厕破解公共厕所管理的“孤岛现象”

在现代社会中&#xff0c;公共厕所是城市管理中的一项重要任务。然而&#xff0c;经常会出现公厕管理的“孤岛现象”&#xff0c;即每个公厕都是独立运作&#xff0c;缺乏统一的管理和监控机制。针对这一问题&#xff0c;智慧公厕的出现为解决公共厕所管理难题带来了新的方案。…

无涯教程-JavaScript - COUPNUM函数

描述 COUPNUM函数返回结算日和到期日之间应付的息票数量,四舍五入到最接近的整数。 语法 COUPNUM (settlement, maturity, frequency, [basis])争论 Argument描述Required/OptionalSettlement 证券的结算日期。 证券结算日期是指在发行日期之后将证券交易给买方的日期。 Re…

Co-SLAM——论文解析

Co-SLAM: Joint Coordinate and Sparse Parametric Encodings for Neural Real-Time SLAM 神经隐式表征slam&#xff08;implict neural representaton&#xff0c;INR&#xff09;使用一个连续函数来表征图像或者三维voxel&#xff0c;并用神经网络来逼近这个函数。Co-SLAM 也…

MyBatis-Plus-扩展操作(3)

3.扩展 代码生成 逻辑删除 枚举处理器 json处理器 配置加密 分页插件 3.1 代码生成 https://blog.csdn.net/weixin_41957626/article/details/132651552 下载下面的插件 红色的是刚刚生成的。 我觉得不如官方的那个好用&#xff0c;唯一的好处就是勾选的选项能够看的懂得。…