/// <summary> /// 空间直角坐标系到,站心坐标系的转换。默认B L 单位 度,可以为球坐标和大地坐标 /// 地心空间直角坐标系(XYZ)转换为地方左手笛卡尔直角坐标系(NEU,XYZ) /// </summary> /// <param name="vector1">测站到卫星的向径</param> /// <param name="lat">站点所在纬度</param> /// <param name="lon">站点所在经度</param> /// <param name="angleUnit">站点所在经度的单位</param> /// <returns></returns> public static NEU XyzToNeu(XYZ vector1, double lat, double lon, AngleUnit angleUnit = AngleUnit.Degree) { if (angleUnit != AngleUnit.Radian) //当前经度为 0 的时候,U 的转换会出现符号错误???!!!2017.10.12. { lat = AngularConvert.ToRad(lat, angleUnit); lon = AngularConvert.ToRad(lon, angleUnit); } XYZ v = vector1; double n = -v.X * Sin(lat) * Cos(lon) - v.Y * Sin(lat) * Sin(lon) + v.Z * Cos(lat); double e = -v.X * Sin(lon) + v.Y * Cos(lon); double u = v.X * Cos(lat) * Cos(lon) + v.Y * Cos(lat) * Sin(lon) + v.Z * Sin(lat); return(new NEU(n, e, u));// { N = n, E = e, U = u }; }
/// <summary> /// 椭球坐标转为空间直角坐标。默认单位为度。 /// </summary> /// <param name="lon">经度(度)</param> /// <param name="lat">纬度(度)</param> /// <param name="height">大地高</param> /// <param name="a">椭球半径</param> /// <param name="flatOrInverse">扁率或其倒数</param> /// <param name="unit">单位</param> /// <returns></returns> public static XYZ GeoCoordToXyz(double lon, double lat, double height, double a, double flatOrInverse, AngleUnit unit = AngleUnit.Degree) { lon = AngularConvert.ToRad(lon, unit); lat = AngularConvert.ToRad(lat, unit); //扁率判断 double e = flatOrInverse; if (flatOrInverse > 1) { e = 1.0 / e; } double n = a / Math.Sqrt(1 - Math.Pow(e * Sin(lat), 2)); double x = (n + height) * Cos(lat) * Cos(lon); double y = (n + height) * Cos(lat) * Sin(lon); double z = (n * (1 - e * e) + height) * Sin(lat); return(new XYZ(x, y, z)); }