当前位置: 首页 > news >正文

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

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

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

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

文章目录

  • 经纬度与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’的长度:

∣ O O ′ ⃗ ∣ = r e 2 sin ⁡ φ \left | \vec {OO'} \right | = re^2\sin \varphi 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 ′ − r e 2 sin ⁡ φ z=z' - re^2\sin \varphi z=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)

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) θ=tan1(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反过来更新其他数值,进行迭代。这种迭代收敛的前提,是因为每次计算出的纬度一定小于真实的纬度,这是由三角关系决定的。

CALC迭代的效果是不断地把原点向真实的原点移动,直到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'}} φ=sin1Rz+d

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+(z+d)2 z+d

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

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坐标系&#xff0c;各种手机、地图基本用经纬度来标记位置。然而&#xff0c;经纬度对于空间的计算是很复杂的&#xff0c;需要很多三角函数操作。平面直角坐标系利用向量的运算&#xff0c;可以非常方便的…...

【UE4 RTS】08-Setting up Game Clock

前言 本篇实现的效果是在游戏运行后能够记录当前的游戏时间&#xff08;年月日时分秒&#xff09;&#xff0c;并且可以通过修改变量从而改变游戏时间进行的快慢。 效果 步骤 1. 在Blueprints文件夹中新建如下两个文件夹&#xff0c;分别命名为“GameSettings”、“Player”…...

百度chatgpt内测版

搜索AI伙伴 申请到了百度的chatgpt&#xff1a; 完整的窗口布局&#xff1a; 三个哲学问题&#xff1a; 灵感中心&#xff1a; 请做一副画&#xff0c;一个渔夫&#xff0c;冬天&#xff0c;下着大雪&#xff0c;在船上为了一家的生计在钓鱼&#xff0c;远处的山上也都是白雪&a…...

[GAN] 使用GAN网络进行图片生成的“调参人”入门指南——生成向日葵图片

[GAN] 使用GAN网络进行图片生成的“炼丹人”日志——生成向日葵图片 文章目录 [GAN] 使用GAN网络进行图片生成的“炼丹人”日志——生成向日葵图片1. 写在前面&#xff1a;1.1 应用场景&#xff1a;1.2 数据集情况&#xff1a;1.3 实验原理讲解和分析&#xff08;简化版&#x…...

(十)人工智能应用--深度学习原理与实战--模型的保存与加载使用

目的:将训练好的模型保存为文件,下次使用时直接加载即可,不必重复建模训练。 神经网络模型训练好之后,可以保存为文件以持久存储,这样下次使用时就不重新建模训练,直接加载就可以。TensorfLow提供了灵活的模型保存方案,既可以同时保存网络结构和权重(即保存全模型),也可…...

Java“牵手”1688商品详情页面数据获取方法,1688API实现批量商品数据抓取示例

背景&#xff1a;1688商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取1688商品详情数据&#xff0c;您可以通过开放平台的接口或者直接访问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做数据处理和分析过程中&#xff0c;如在开展机器学习的数据预处理、数据格式转换等等&#xff0c;不可避免的会涉及到各种矩阵变换&#xff0c;其中使用最多的就是numpy下的矩阵变换&#xff0c;以下是日常用到的一些矩阵变换总结&#xff0c;主要有矩阵中数据类型的…...

LightningChart JS 2023Crack,CPU高效实时更新

LightningChart JS 2023Crack,CPU高效实时更新 添加了新的极地热图图表类型-添加了新系列类型&#xff0c;允许您在极地坐标系中可视化热图。极地热图的一些关键特征是&#xff1a; 处理多达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应用程序 初始使用&#xff1a; 一开始我们是新账户&#xff0c;里面是没有仓库的&#xff0c;需要手动创建一个仓库。此时&#xff0c;这个仓库是创建在本地仓库里面&#xff0c;需要用到push命令&#xff08;就是那个pub…...

竞赛项目 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …...

中文版开源Llama 2同时有了语言、多模态大模型,完全可商用

可以说&#xff0c;AI 初创公司 LinkSoul.Al 的这些开源项目让海外开源大模型在国内的普及和推广速度与国际几乎保持了一致。 7 月 19 日&#xff0c;Meta 终于发布了免费可商用版本 Llama 2&#xff0c;让开源大模型领域的格局发生了巨大变化。 Llama 2 模型系列包含 70 亿、…...

JavaScript、TypeScript、ES5、ES6之间的联系和区别

ECMAScript&#xff1a; 一个由 ECMA International 进行标准化&#xff0c;TC39 委员会进行监督的语言。通常用于指代标准本身。JavaScript&#xff1a; ECMAScript 标准的各种实现的最常用称呼。这个术语并不局限于某个特定版本的 ECMAScript 规范&#xff0c;并且可能被用于…...

RCNA——单臂路由

一&#xff0c;实验背景 之前的VLAN实现的很多都是相同部门互相访问&#xff0c;不同部门无法访问。不过这次整来了一个路由器&#xff0c;领导说大部分的部门虽说有保密信息需要互相隔离&#xff0c;但是这些部门和其它部门也应该互相连通以方便工作交流。因此要配置新的环境&…...

leetcode做题笔记69

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 思路一&#xff…...

CentOS根分区扩容实战(非LVM)!

在虚拟化平台&#xff08;如KVM,ESXI&#xff09;中&#xff0c;将虚拟机的磁盘大小扩展到所需的大小。这将增加虚拟机的磁盘空间。 在虚拟机中&#xff0c;使用以下命令查看可用的磁盘和分区信息&#xff1a; sudo fdisk -l确定要扩展的根分区的设备名称&#xff08;如 /dev/…...

uniapp 微信小程序 分包

1、manifest.json内添加如图所示&#xff1a; "optimization" : {"subPackages" : true },2、在与pages同级上创建各个分包的文件夹 把需要分包的文件对应移入分包文件夹内 3、page.json内修改分包文件的路径 比如&#xff1a; {"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…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...