#include
#include
#define deg2rad 0.01745329251994433
struct Data
{
double X, Y, Z;
double B, L, H;
double a;
double b;
};
void BLH2XYZ(Data *dsrc)
{
double e = sqrt(1 - (dsrc->b / dsrc->a)*(dsrc->b / dsrc->a));
double sinB = sin(dsrc->B);
double cosB = cos(dsrc->B);
double sinL = sin(dsrc->L);
double cosL = cos(dsrc->L);
double tanB_2 = tan(dsrc->B) * tan(dsrc->B);
double f = 1 - e * e;
double fd = sqrt(1 + f * tanB_2);
dsrc->X = (dsrc->a * cosL) / fd + dsrc->H * cosB * cosL;
dsrc->Y = (dsrc->a * sinL) / fd + dsrc->H * cosB * sinL;
double fd2 = sqrt(1 - e * e * sinB * sinB);
dsrc->Z = (dsrc->a * f * sinB) / fd2 + dsrc->H * sinB;
}
int main()
{
Data dsrc;
dsrc.a = 6378137.0000; dsrc.b = 6356752.3142;
dsrc.B = 30 * deg2rad; dsrc.L = 114 * deg2rad; dsrc.H = 20;
BLH2XYZ(&dsrc);
printf("%.4lf %.4lf %.4lf\n", dsrc.B, dsrc.L, dsrc.H);
printf("%.4lf %.4lf %.4lf\n", dsrc.X, dsrc.Y, dsrc.Z);
}
结果
上面的结果是我拿别人工具源码算的 下面是程序运行结果 精度只打印了4位有效数字
当球心在z=1点时,r和上面的不一样。此时r^2=R^2+2rcos(PHI)-1r^2-2rcos(PHI)=R^2-1[r-cos(PHI)]^2=R^2-1+[cos(PHI)]^2然后开根号 得到r与R和PHI的关系式。因为r是表示球面上的点到坐标原点的距离,所以当球心改变时,距离表达式一定不一样。