大地坐标转换为直角坐标源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 大地坐标转换为直角坐标
{
    //参心大地坐标转换为参心直角坐标(BLH-->XYZ)
    class Program
    {
        static void Main(string[] args)
{
            //初始化变量
            double B, L, H, X, Y, Z;
            B = Convert.ToDouble(Console.ReadLine());
            L = Convert.ToDouble(Console.ReadLine());
            H = Convert.ToDouble(Console.ReadLine());
            //转化
            BLH2XYZ(B, L, H, out X, out Y, out Z);
            //输出计算结果
            Console.WriteLine("X={0,12:F3},Y={1,12:F3},Z={0,12:F3}", X, Y, Z);
            Console.ReadKey();
        }
        /// <summary>
        /// 参心大地坐标转换为参心空间直角坐标系(BLH-->XYZ)
        /// </summary>
        /// <param name="B">纬度(以度为单位)</param>
        /// <param name="L">经度(以度为单位)</param>
        /// <param name="H">大地高(以米为单位)</param>
        /// <param name="X">X分量(以米为单位)</param>
        /// <param name="Y">X分量(以米为单位)</param>
        /// <param name="Z">X分量(以米为单位)</param>
        private static void BLH2XYZ(double B, double L, double H, out double X, out double Y, out double Z)
{
            //将角度转换为弧度
            double deg2rad = Math.PI / 180;
            B = B * deg2rad;
            L = L * deg2rad;
            //计算相关参数
            double e2 = GetE2();
            double N = GetN(B);
            //转化计算
            X = (N + H) * Math.Cos(B) * Math.Cos(L);
            Y = (N + H) * Math.Cos(B) * Math.Sin(L);
            Z = (N * (1 - e2) + H) * Math.Sin(B);
        }
        /// <summary>
        /// 计算第一偏心率的平方
        /// </summary>
        /// <returns>第一偏心率的平方</returns>
        private static double GetE2()
{
            double a = 6378137;
            double f = 1 / 298.257222101;
            double e2 = 2 * f - f * f;
            return e2;
        }
        /// <summary>
        /// 计算卯酉圈曲率半径
        /// </summary>
        /// <param name="B">纬度(以弧度为单位)</param>
        /// <returns>椭球面卯酉圈的曲率半径</returns>
        private static double GetN(double B)
{
            double e2 = GetE2();
            double a = 6378137;
            double sinB = Math.Sin(B);
            double N = a / Math.Sqrt(1 - e2 * sinB * sinB);
            return N;
        }
    }
}

© 版权声明
THE END
喜欢就支持一下吧
点赞6
分享
评论 抢沙发
云小编的头像-地理信息云

昵称

取消
昵称表情代码图片