地理测绘基础知识(1) 坐标系经纬度与ECEF直角坐标的基本换算

本文主要是介绍地理测绘基础知识(1) 坐标系经纬度与ECEF直角坐标的基本换算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

经纬度与ECEF直角坐标的基本换算

我们目前最常用的全球坐标系是WGS-84坐标系,各种手机、地图基本用经纬度来标记位置。然而,经纬度对于空间的计算是很复杂的,需要很多三角函数操作。平面直角坐标系利用向量的运算,可以非常方便的计算角度、距离等参数,在实际应用中往往作为中间计算的工具。

目前用到的很多GIS、遥感与测绘工具里都有这种功能,比如利用 libproj、RTK等工具,直接进行转换。

本系列文章将逐步推导、创建一个完全内联的(单.h文件)的代码,实现基本的坐标系变换、测地线计算、观测关系计算等功能。今天开始系列的第一篇。第二篇在这里。

文章目录

  • 经纬度与ECEF直角坐标的基本换算
    • 1. WGS-84 坐标系
    • 2 从经纬度转换到ECEF
    • 3 从 ECEF 到经纬度
      • (1) 求取经度
      • (2) 纬度、海拔计算
    • 4 代码与工程

1. WGS-84 坐标系

WGS-84 坐标系是目前使用最为广泛的全球坐标系统。其示意图如下:

84
WGS-84坐标系里,地球等效为一个椭圆,直角坐标系原点O位于地球的中心。

  • 坐标轴 Z ⃗ = O N ⃗ \vec{Z} =\vec{ON} Z =ON 指向北极点。
  • 坐标轴 X ⃗ = O P ⃗ \vec{X} =\vec{OP} X =OP 指向格林威治0度经线与赤道面的交点P。
  • 坐标轴 Y ⃗ = X ⃗ ⊗ Z ⃗ \vec Y=\vec X\otimes \vec Z Y =X Z 呈右手螺旋关系。

当前位置 T 的经纬度定义:

从高度 H 开始定义:

  • T是一个距离参考海平面(椭球面)高度为 H ⃗ = t T ⃗ \vec{H} =\vec{tT} H =tT 的点。
  • t是点T在椭球面上的正射投影,矢量 t T ⃗ \vec{tT} tT 是椭球面上t点切面的法向量。
  • 需要注意的是,和正球面不同,法向量 t T ⃗ \vec{tT} tT 的反向延长线与Z轴的交点是 O’,和原点O并不重合。

对于经度 θ \theta θ 的定义,是这样的:

  • 0度经度大圆 N O P ⌢ \stackrel\frown{NOP} NOP是由北极点 N, 地心 O, 格林威治经线与赤道面的交点 P 组成的平面。
  • 当前经度大圆 N O ′ T ⌢ \stackrel\frown{NO'T} NOT是由北极点 N, 交点O’, 当前位置T组成的平面。
  • O、 O’ 、t、 T 都在当前经度面上,直线 O’T 与赤道面的交点为u,矢量 O u ⃗ \vec{Ou} Ou 与赤道的交点是Q。
  • O’、u、t、T四点共线。
  • 经度 θ = ∡ P O Q \theta=\measuredangle {POQ} θ=POQ

对于纬度 φ \varphi φ 的定义,是这样的:

  • 椭球的切平面的法线与Z的交点 O’ 和原点并不重合。
  • 纬度定义为法向量 u T ⃗ \vec{uT} uT 与赤道面的夹角。在北半球为正,南半球为负
  • 纬度 φ = ∡ T u Q = ∡ O u O ′ \varphi=\measuredangle {TuQ}=\measuredangle {OuO'} φ=TuQ=OuO

2 从经纬度转换到ECEF

  • ECEF 坐标系有利于利用矢量计算简化角度、距离的求取。

已知:

  • 赤道半径 a = 6378137 米,对应上图 O P ⃗ \vec{OP} OP 的长度;
  • 椭球扁率 f = ( a − b ) / a f = (a-b)/a f=(ab)/a= 1.0/298.257223563。扁率就是衡量椭球是不是很“扁”,正球的扁率为0.
  • 椭球偏心率 e = a 2 − b 2 / a e={\sqrt {a^2-b^2} }/{a} e=a2b2 /a= 0.0818191908426
  • e和f的关系为 e 2 = f ( 2 − f ) e^2=f(2-f) e2=f(2f)
  • 极地半径 b = 6356752.3142 米,对应上图 O N ⃗ \vec{ON} ON 的长度;

设:经度 θ \theta θ, 纬度 φ \varphi φ, 海拔 H,则有:

r = ∣ R ⃗ ∣ = ∣ O ′ t ⃗ ∣ = a 1 − e 2 sin ⁡ 2 φ = a 1 − f ( 2 − f ) sin ⁡ 2 φ r = \left | \vec R\right |=\left | \vec{O't} \right | = \frac{ a}{\sqrt{1-e^2 \sin^2\varphi }} =\frac{ a}{\sqrt{1-f(2-f) \sin^2\varphi }} r= R = Ot =1e2sin2φ a=1f(2f)sin2φ a

经纬度极坐标可以利用矢量 R ⃗ \vec R R 构造一个Z轴平移了的正球,进行极坐标运算。这个正球的球心是 O’。由于x,y没有平移,故而两个坐标系的x、y是重合的。Z坐标z’与z的关系是平移,平移量为OO’:

d = O O ′ = − r e 2 sin ⁡ φ d= {OO'} = -re^2\sin \varphi d=OO=re2sinφ

下图是把经度大圆 N O Q ⌢ \stackrel\frown {NOQ} NOQ切割出来,观察:

SP

在正球模型下,根据极坐标的基本定义,可以直接计算x,y:

x = ( r + H ) ⋅ cos ⁡ φ ⋅ c o s θ x=\left ( r + H \right ) \cdot \cos \varphi \cdot cos \theta x=(r+H)cosφcosθ

y = ( r + H ) ⋅ cos ⁡ φ ⋅ s i n θ y=\left ( r + H \right ) \cdot \cos \varphi \cdot sin \theta y=(r+H)cosφsinθ

Z的坐标,要先计算后,再平移即可得到:

z ′ = ( r + H ) ⋅ s i n φ z'=\left ( r + H \right ) \cdot sin \varphi z=(r+H)sinφ
z = z ′ + d = z ′ − r e 2 sin ⁡ φ z=z'+d=z' - re^2\sin \varphi z=z+d=zre2sinφ

带入后,可写成如下等效形式:

z = ( r ( 1 − e 2 ) + H ) sin ⁡ φ z=(r(1-e^2)+H) \sin \varphi z=(r(1e2)+H)sinφ
z = ( r ( 1 − f ( 2 − f ) ) + H ) sin ⁡ φ = ( r ( 1 − f ) 2 + H ) sin ⁡ φ z=(r(1-f(2-f))+H) \sin \varphi =(r(1-f)^2+H) \sin \varphi z=(r(1f(2f))+H)sinφ=(r(1f)2+H)sinφ

含有扁率的化简,是基于扁率 f = ( a − b ) / a = 1 − b / a f = (a-b)/a = 1 - b/a f=(ab)/a=1b/a 计算得到的。

通过上面的处理,极坐标的 T ( θ , φ , H ) T(\theta, \varphi,H) T(θ,φ,H) 便转换为平面直角坐标 T ( x , y , z ) T(x,y,z) T(x,y,z)

相应接口:

/*!* \brief lla2ecef 经纬度坐标到ECEF,* \param lla  纬经高(默认)/经纬高, 量纲是度(默认)/弧度、米* \param ecef xyz,量纲是米* \param pr 传出正球半径r,量纲是米* \param pd 传出正球原点偏移 OO' d 量纲是米* \param rad  角度量纲开关,false 是度,true 是弧度* \param latfirst 经纬度顺序,false 是经度\纬度\高度,true 是纬度\经度\高度
*/
inline void lla2ecef(const double lla[/*3*/],double ecef[/*3*/],double * pr = nullptr,double * pd = nullptr,const bool rad = false,const bool latfirst = true)

3 从 ECEF 到经纬度

对上述计算过程而言,逆向运算可以立刻得到经度,却不能解析得到纬度。纬度需要进行迭代, 主要原因是d的具体取值不知道导致的。

(1) 求取经度

由于

x / y = tan ⁡ θ x/y=\tan \theta x/y=tanθ

故而

θ = tan ⁡ − 1 ( x / y ) \theta=\tan^{-1} (x/y) θ=tan1(x/y)

注意处理好象限问题,即可得到经度。

(2) 纬度、海拔计算

对于纬度,则比较复杂。求解三角方程

( r + H ) sin ⁡ φ = z − d (r + H) \sin \varphi = z - d (r+H)sinφ=zd

由于 H 不知道,r 也不知道,加入第二条件(相切,H向量与r共线)后,得到的是二元四次三角方程,很难解析求取。

可以首先假设 ∣ d ∣ = ∣ O O ′ ⃗ ∣ = 0 \left |d\right |=\left | \vec {OO'} \right | =0 d= OO =0, 求取一个粗略的纬度,并得到 d,利用d反过来更新其他数值,进行迭代。这种迭代收敛的前提,是因为每次计算出的纬度一定小于真实的纬度,这是由三角关系决定的。

CALC迭代的效果是不断地把原点向真实的原点移动,直到z达到一个很小的误差。迭代方法:

设起始偏移 d = 0 d =0 d=0,迭代开始:

R ′ = r + H = x 2 + y 2 + ( z − d ) 2 R'=r+H = \sqrt{x^2+y^2+(z-d)^2} R=r+H=x2+y2+(zd)2

φ ′ = sin ⁡ − 1 z − d R ′ \varphi' = \sin^{-1} {\frac {z-d}{R'}} φ=sin1Rzd

r ′ = a 1 − e 2 sin ⁡ 2 φ ′ r' = \frac{ a}{\sqrt{1-e^2 \sin^2\varphi' }} r=1e2sin2φ a

d ′ = − r ′ e 2 sin ⁡ φ ′ d'= -r'e^2\sin \varphi' d=re2sinφ

z ′ = R ′ s i n φ ′ + d ′ z'=R'sin \varphi'+d' z=Rsinφ+d

d = d ′ d = d' d=d


e r r = ∣ z − z ′ ∣ < ε err = \left | z-z' \right | < \varepsilon err=zz<ε
时停止迭代。此时

φ = sin ⁡ − 1 z − d x 2 + y 2 + ( z − d ) 2 \varphi = \sin^{-1} {\frac {z-d}{\sqrt{x^2+y^2+(z-d)^2}}} φ=sin1x2+y2+(zd)2 zd

H = R ′ − r ′ H= R'-r' H=Rr

相应接口:

/*!* \brief ecef2lla ECEF到经纬度坐标* \param ecef xyz,量纲是米* \param lla  纬经高(默认)/经纬高, 量纲是度(默认)/弧度、米* \param pr 传出正球半径r,量纲是米* \param pd 传出正球原点偏移 OO' d 量纲是米* \param maxiter  最大迭代次数* \param piter  迭代次数输出,可以为null* \param eps  Z误差门限* \param rad  角度量纲开关,false 是度,true 是弧度* \param latfirst 经纬度顺序,false 是经度\纬度\高度,true 是纬度\经度\高度* \return 迭代收敛标志
*/
inline bool ecef2lla(const double ecef[/*3*/],double lla[/*3*/],double * pr = nullptr,double * pd = nullptr,const int maxiter = 32,int * piter = nullptr,const double eps = 1e-10,const bool rad = false,const bool latfirst = true)

4 代码与工程

代码与工程参考

https://gitcode.net/coloreaglestdio/geocalc/-/blob/master/geocalc.h

对各种边界和迭代次数进行测试, 以确定迭代的收敛性:

using namespace CES_GEOCALC;for (double lon = -180; lon <=180; lon+=60){for (double lat = -90; lat <=90; lat += 15){double LLA[] = {lat,lon,10000};double ECEF[] = {0, 0, 0};double LLA2[] = {0, 0, 0};lla2ecef(LLA, ECEF);int iter = 0;ecef2lla(ECEF,LLA2,32,&iter);printf("LAT=%12.7lf,LON=%12.7lf,dLAT=%10.7lf,dLON=%10.7lf,dALT=%5.3lf, iter = %d\n",lat,lon,LLA[0]-LLA2[0], LLA[1]-LLA2[1], LLA[2]-LLA2[2],iter);}}

输出:

LAT= -90.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -75.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -60.0000000,LON=-180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -45.0000000,LON=-180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT= -30.0000000,LON=-180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT= -15.0000000,LON=-180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=   0.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 1
LAT=  15.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  30.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  45.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT=  60.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  75.0000000,LON=-180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  90.0000000,LON=-180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -90.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 2
LAT= -75.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT= -60.0000000,LON=-120.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT= -45.0000000,LON=-120.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 7
LAT= -30.0000000,LON=-120.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT= -15.0000000,LON=-120.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT=   0.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 1
LAT=  15.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT=  30.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT=  45.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 7
LAT=  60.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT=  75.0000000,LON=-120.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT=  90.0000000,LON=-120.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 2
LAT= -90.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 2
LAT= -75.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT= -60.0000000,LON= -60.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT= -45.0000000,LON= -60.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 7
LAT= -30.0000000,LON= -60.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT= -15.0000000,LON= -60.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT=   0.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 1
LAT=  15.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT=  30.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 8
LAT=  45.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 7
LAT=  60.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT=  75.0000000,LON= -60.0000000,dLAT=-0.0000000,dLON=-0.0000000,dALT=0.000, iter = 6
LAT=  90.0000000,LON= -60.0000000,dLAT= 0.0000000,dLON=-0.0000000,dALT=0.000, iter = 2
LAT= -90.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -75.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -60.0000000,LON=   0.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -45.0000000,LON=   0.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT= -30.0000000,LON=   0.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT= -15.0000000,LON=   0.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=   0.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 1
LAT=  15.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  30.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  45.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT=  60.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  75.0000000,LON=   0.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  90.0000000,LON=   0.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -90.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -75.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -60.0000000,LON=  60.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -45.0000000,LON=  60.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT= -30.0000000,LON=  60.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT= -15.0000000,LON=  60.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=   0.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 1
LAT=  15.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  30.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  45.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT=  60.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  75.0000000,LON=  60.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  90.0000000,LON=  60.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -90.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -75.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -60.0000000,LON= 120.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -45.0000000,LON= 120.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT= -30.0000000,LON= 120.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT= -15.0000000,LON= 120.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=   0.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 1
LAT=  15.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  30.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  45.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT=  60.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  75.0000000,LON= 120.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  90.0000000,LON= 120.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -90.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2
LAT= -75.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -60.0000000,LON= 180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT= -45.0000000,LON= 180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT= -30.0000000,LON= 180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT= -15.0000000,LON= 180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=   0.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 1
LAT=  15.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  30.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 8
LAT=  45.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 7
LAT=  60.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  75.0000000,LON= 180.0000000,dLAT=-0.0000000,dLON= 0.0000000,dALT=0.000, iter = 6
LAT=  90.0000000,LON= 180.0000000,dLAT= 0.0000000,dLON= 0.0000000,dALT=0.000, iter = 2

这篇关于地理测绘基础知识(1) 坐标系经纬度与ECEF直角坐标的基本换算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411434

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):