地理测绘基础知识(1) 坐标系经纬度与ECEF直角坐标的基本换算
经纬度与ECEF直角坐标的基本换算
我们目前最常用的全球坐标系是WGS-84坐标系,各种手机、地图基本用经纬度来标记位置。然而,经纬度对于空间的计算是很复杂的,需要很多三角函数操作。平面直角坐标系利用向量的运算,可以非常方便的计算角度、距离等参数,在实际应用中往往作为中间计算的工具。
目前用到的很多GIS、遥感与测绘工具里都有这种功能,比如利用 libproj、RTK等工具,直接进行转换。
文章目录
- 经纬度与ECEF直角坐标的基本换算
- 1. WGS-84 坐标系
- 2 从经纬度转换到ECEF
- 3 从 ECEF 到经纬度
- (1) 求取经度
- (2) 纬度、海拔计算
- 4 代码与工程
1. WGS-84 坐标系
WGS-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} NO′T⌢是由北极点 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=(a−b)/a= 1.0/298.257223563。扁率就是衡量椭球是不是很“扁”,正球的扁率为0.
- 椭球偏心率 e = a 2 − b 2 / a e={\sqrt {a^2-b^2} }/{a} e=a2−b2/a= 0.0818191908426
- e和f的关系为 e 2 = f ( 2 − f ) e^2=f(2-f) e2=f(2−f)
- 极地半径 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 = O′t =1−e2sin2φa=1−f(2−f)sin2φa
经纬度极坐标可以利用矢量 R ⃗ \vec R R 构造一个Z轴平移了的正球,进行极坐标运算。这个正球的球心是 O’。由于x,y没有平移,故而两个坐标系的x、y是重合的。Z坐标z’与z的关系是平移,平移量为OO’的长度:
∣ O O ′ ⃗ ∣ = r e 2 sin φ \left | \vec {OO'} \right | = re^2\sin \varphi OO′ =re2sinφ
下图是把经度大圆 N O Q ⌢ \stackrel\frown {NOQ} NOQ⌢切割出来,观察:

在正球模型下,根据极坐标的基本定义,可以直接计算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 ′ − r e 2 sin φ z=z' - re^2\sin \varphi z=z′−re2sinφ
带入后,可写成如下等效形式:
z = ( r ( 1 − e 2 ) + H ) sin φ z=(r(1-e^2)+H) \sin \varphi z=(r(1−e2)+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(1−f(2−f))+H)sinφ=(r(1−f)2+H)sinφ
含有扁率的化简,是基于扁率 f = ( a − b ) / a = 1 − b / a f = (a-b)/a = 1 - b/a f=(a−b)/a=1−b/a 计算得到的。
通过上面的处理,极坐标的 T ( θ , φ , H ) T(\theta, \varphi,H) T(θ,φ,H) 便转换为平面直角坐标 T ( x , y , z ) T(x,y,z) T(x,y,z) 。
3 从 ECEF 到经纬度
对上述计算过程而言,逆向运算可以立刻得到经度,却不能解析得到纬度。纬度需要进行迭代。
主要原因是:
∣ O O ′ ⃗ ∣ = r e 2 sin φ \left | \vec {OO'} \right | = re^2\sin \varphi OO′ =re2sinφ
的具体取值不知道导致的。
(1) 求取经度
由于
x / y = tan θ x/y=\tan \theta x/y=tanθ
故而
θ = tan − 1 ( x / y ) \theta=\tan^{-1} (x/y) θ=tan−1(x/y)
注意处理好象限问题,即可得到经度。
(2) 纬度、海拔计算
对于纬度,则比较复杂。求解三角方程
( r + H ) sin φ = z + ∣ O O ′ ⃗ ∣ (r + H) \sin \varphi = z + \left | \vec {OO'} \right | (r+H)sinφ=z+ OO′
由于 H 不知道,r 也不知道,加入第二条件(相切,H向量与r共线)后,得到的是二元四次三角方程,很难解析求取。
可以首先假设 ∣ O O ′ ⃗ ∣ = 0 \left | \vec {OO'} \right | =0 OO′ =0, 求取一个粗略的纬度,并得到 d,利用d反过来更新其他数值,进行迭代。这种迭代收敛的前提,是因为每次计算出的纬度一定小于真实的纬度,这是由三角关系决定的。
迭代的效果是不断地把原点向真实的原点移动,直到z达到一个很小的误差。迭代方法:
设起始偏移 d = ∣ O O ′ ⃗ ∣ = 0 d = \left | \vec {OO'} \right | =0 d= OO′ =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+(z+d)2
φ ′ = sin − 1 z + d R ′ \varphi' = \sin^{-1} {\frac {z+d}{R'}} φ′=sin−1R′z+d
r ′ = a 1 − e 2 sin 2 φ ′ r' = \frac{ a}{\sqrt{1-e^2 \sin^2\varphi' }} r′=1−e2sin2φ′a
d ′ = r ′ e 2 sin φ ′ d'= r'e^2\sin \varphi' d′=r′e2sinφ′
z ′ = R ′ s i n φ ′ − d ′ z'=R'sin \varphi'-d' z′=R′sinφ′−d′
d = d ′ d = d' d=d′
当
e r r = ∣ z − z ′ ∣ < ε err = \left | z-z' \right | < \varepsilon err=∣z−z′∣<ε
时停止迭代。此时
φ = 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}}} φ=sin−1x2+y2+(z+d)2z+d
H = R ′ − r ′ H= R'-r' H=R′−r′
4 代码与工程
代码与工程参考
https://gitcode.net/coloreaglestdio/geocalc/-/blob/master/geocalc.h
核心转换逻辑如下:
/*!* GEOCalc 实现了基本的WGS-84坐标系的计算。* by CEStdio* 1997-2023*
*/
#include <cassert>
#include <cmath>
namespace CES_GEOCALC {inline const double a = 6378137;
inline const double pi = 3.14159265358979323846;
inline const double f = 1.0 / 298.257223563;
inline const double e = sqrt(f * (2 - f));
inline const double es = f * (2 - f);
inline const double deg2rad = pi / 180.0;
inline const double rad2deg = 180.0 / pi;/*!* \brief lla2ecef 经纬度坐标到ECEF,* \param lla 纬经高(默认)/经纬高, 量纲是度(默认)/弧度、米* \param ecef xyz,量纲是米* \param rad 角度量纲开关,false 是度,true 是弧度* \param latfirst 经纬度顺序,false 是经度\纬度\高度,true 是纬度\经度\高度
*/
inline void lla2ecef(const double lla[/*3*/],double ecef[/*3*/],const bool rad = false,const bool latfirst = true)
{const double lat = latfirst ? (rad ? (lla[0]) : (lla[0] * deg2rad)): (rad ? (lla[1]) : (lla[1] * deg2rad));const double lon = latfirst ? (rad ? (lla[1]) : (lla[1] * deg2rad)): (rad ? (lla[0]) : (lla[0] * deg2rad));const double H = lla[2];const double r = a / sqrt(1 - es * sin(lat) * sin(lat));const double d = r * es * sin(lat);ecef[0] = (r + H) * cos(lat) * cos(lon);ecef[1] = (r + H) * cos(lat) * sin(lon);ecef[2] = (r + H) * sin(lat) - d;
}/*!* \brief ecef2lla ECEF到经纬度坐标* \param ecef xyz,量纲是米* \param lla 纬经高(默认)/经纬高, 量纲是度(默认)/弧度、米* \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*/],const int maxiter = 32,int * piter = nullptr,const double eps = 1e-10,const bool rad = false,const bool latfirst = true)
{const double x = ecef[0], y = ecef[1], z = ecef[2] < 0 ? -ecef[2] : ecef[2];const int south = ecef[2] < 0 ? -1 : 1;double d = 0;double err = 0;int iter = 0;double Rp = 0, sinphi = 0, rp = 0, dp = 0, zp = 0;do {Rp = sqrt(x * x + y * y + (z + d) * (z + d));sinphi = (z + d) / Rp;rp = a / sqrt(1 - es * sinphi * sinphi);dp = rp * es * sinphi;zp = Rp * sinphi - dp;d = dp;assert(z >= zp);err = z - zp; //z always > zp++iter;} while (err > eps && iter < maxiter);const double lat = asin(sinphi) * south;const double lon = atan2(y, x);const double H = Rp - rp;lla[latfirst?0:1] = lat * (rad?1:rad2deg);lla[latfirst?1:0] = lon * (rad?1:rad2deg);lla[2] = H;if (piter)*piter = iter;return err <= eps;
}}; // namespace CES_GEOCALC
对各种边界和迭代次数进行测试, 以确定迭代的收敛性:
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直角坐标的基本换算
经纬度与ECEF直角坐标的基本换算 我们目前最常用的全球坐标系是WGS-84坐标系,各种手机、地图基本用经纬度来标记位置。然而,经纬度对于空间的计算是很复杂的,需要很多三角函数操作。平面直角坐标系利用向量的运算,可以非常方便的…...
【UE4 RTS】08-Setting up Game Clock
前言 本篇实现的效果是在游戏运行后能够记录当前的游戏时间(年月日时分秒),并且可以通过修改变量从而改变游戏时间进行的快慢。 效果 步骤 1. 在Blueprints文件夹中新建如下两个文件夹,分别命名为“GameSettings”、“Player”…...
百度chatgpt内测版
搜索AI伙伴 申请到了百度的chatgpt: 完整的窗口布局: 三个哲学问题: 灵感中心: 请做一副画,一个渔夫,冬天,下着大雪,在船上为了一家的生计在钓鱼,远处的山上也都是白雪&a…...
[GAN] 使用GAN网络进行图片生成的“调参人”入门指南——生成向日葵图片
[GAN] 使用GAN网络进行图片生成的“炼丹人”日志——生成向日葵图片 文章目录 [GAN] 使用GAN网络进行图片生成的“炼丹人”日志——生成向日葵图片1. 写在前面:1.1 应用场景:1.2 数据集情况:1.3 实验原理讲解和分析(简化版&#x…...
(十)人工智能应用--深度学习原理与实战--模型的保存与加载使用
目的:将训练好的模型保存为文件,下次使用时直接加载即可,不必重复建模训练。 神经网络模型训练好之后,可以保存为文件以持久存储,这样下次使用时就不重新建模训练,直接加载就可以。TensorfLow提供了灵活的模型保存方案,既可以同时保存网络结构和权重(即保存全模型),也可…...
Java“牵手”1688商品详情页面数据获取方法,1688API实现批量商品数据抓取示例
背景:1688商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取1688商品详情数据,您可以通过开放平台的接口或者直接访问1688商城的网页来获取商品详情信息。以下是两种常用方法的介绍&a…...
Docker_docker runContainerd
docker run-Containerd docker run -it 运行容器交互式方式启动守护进程方式启动其他命令 docker部署nginx服务k8s废弃docker原因安装和配置containerdcontainerd常用命令 docker run -it 运行容器 交互式方式启动 # 以交互式方式启动并进入容器 docker run --namehello -it …...
python中常见的矩阵变换总结
利用python做数据处理和分析过程中,如在开展机器学习的数据预处理、数据格式转换等等,不可避免的会涉及到各种矩阵变换,其中使用最多的就是numpy下的矩阵变换,以下是日常用到的一些矩阵变换总结,主要有矩阵中数据类型的…...
LightningChart JS 2023Crack,CPU高效实时更新
LightningChart JS 2023Crack,CPU高效实时更新 添加了新的极地热图图表类型-添加了新系列类型,允许您在极地坐标系中可视化热图。极地热图的一些关键特征是: 处理多达400万个数据点。 快速加载速度和CPU高效实时更新。 100ms以完全显示由所有数据填充的热…...
hutool 导出复杂表头excel
假如已这样的表头导出数据 1.把包含表头的excel添加到项目资源目录 2.编写代码读取表头所在sheet,并且加入需导出的数据 /*** 导出excel*/public static void downloadExcel(List<List<Object>> list, HttpServletResponse response) throws IOException {/*Strin…...
git和github学习
一、什么是git和github? 二、学会使用github desktop应用程序 初始使用: 一开始我们是新账户,里面是没有仓库的,需要手动创建一个仓库。此时,这个仓库是创建在本地仓库里面,需要用到push命令(就是那个pub…...
竞赛项目 车位识别车道线检测 - python opencv
0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满分5分) …...
中文版开源Llama 2同时有了语言、多模态大模型,完全可商用
可以说,AI 初创公司 LinkSoul.Al 的这些开源项目让海外开源大模型在国内的普及和推广速度与国际几乎保持了一致。 7 月 19 日,Meta 终于发布了免费可商用版本 Llama 2,让开源大模型领域的格局发生了巨大变化。 Llama 2 模型系列包含 70 亿、…...
JavaScript、TypeScript、ES5、ES6之间的联系和区别
ECMAScript: 一个由 ECMA International 进行标准化,TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript: ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范,并且可能被用于…...
RCNA——单臂路由
一,实验背景 之前的VLAN实现的很多都是相同部门互相访问,不同部门无法访问。不过这次整来了一个路由器,领导说大部分的部门虽说有保密信息需要互相隔离,但是这些部门和其它部门也应该互相连通以方便工作交流。因此要配置新的环境&…...
leetcode做题笔记69
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 思路一ÿ…...
CentOS根分区扩容实战(非LVM)!
在虚拟化平台(如KVM,ESXI)中,将虚拟机的磁盘大小扩展到所需的大小。这将增加虚拟机的磁盘空间。 在虚拟机中,使用以下命令查看可用的磁盘和分区信息: sudo fdisk -l确定要扩展的根分区的设备名称(如 /dev/…...
uniapp 微信小程序 分包
1、manifest.json内添加如图所示: "optimization" : {"subPackages" : true },2、在与pages同级上创建各个分包的文件夹 把需要分包的文件对应移入分包文件夹内 3、page.json内修改分包文件的路径 比如: {"path" : &qu…...
Redis_安装、启动以及基本命令
2.Redis安装 2.1前置处理环境 VMware安装安装centOS的linux操作系统xshellxftp 2.2 配置虚拟机网络 按ctrlaltf2 切换到命令行 cd (/)目录 修改/etc/sysconfig/network-scripts/ifcfg-ens3 vi 命令 按insert表示插入 按ctrlesc退出修改状态 :wq 写入并退出 此文件必须保持一…...
IPv4编址及子网划分
IPv4编址及子网划分 一、IPv4地址概述1.1、IPv4报文结构1.2、IPv4地址分类1.2.1、A类1.2.2、B类1.2.3、C类1.2.4、D类1.2.5、E类 1.3、私有IP地址1.4、特殊地址 二、子网划分2.1、子网掩码2.2、VLSM 可变长的子网掩码2.3、子网划分2.4、子网划分示例2.4.1、子网划分案例 —— A…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
