2坐标格式转换 ∈ C# 编程笔记

这篇博客记录了XYZ、BLH、NEU坐标之间的互转以及高斯投影正反算的C#代码实现。提供了源码链接和使用示例文件,适合开发者参考学习。
摘要由CSDN通过智能技术生成

【日志】
2020/6/25 开了这篇博客,功能还算满意

一、原理 - 并不在这里

原理部分请看博客1:

https://blog.csdn.net/Gou_Hailong/article/details/106938497

二、源码

源码结构:
在这里插入图片描述

	class zbgsTransfor
    {
   
        /*辅助函数 - 用于求d的n次方,因为用Math.Pow()太累赘
         */ 
        public static double P(double d, double n)
        {
   
            return Math.Pow(d, n);
        }
        /*辅助函数 - 用于计算椭球参数
         * 输入:a 长轴, b 短轴,
         * 输出:tq 椭球参数数组
         *        0 a, 1 b, 2 c, 3 e
         *        4 e1, 5 alpha
         */
        static double[] Get_TQ(double a, double b)
        {
   
            double[] tq = new double[6];
            double c = a * a / b,
                e = Math.Sqrt(a * a - b * b) / a,
                e1 = Math.Sqrt(a * a - b * b) / b,
                alpha = (a - b) / a;
            tq[0] = a; tq[1] = b; tq[2] = c;
            tq[3] = e; tq[4] = e1; tq[5] = alpha;
            return tq;
        }
        /*此函数用来将xyz 转换成blh
         * 输入:pt 待转换的点数组, mod 选择哪个椭球 1 75 2 克
         * 输出:转换成功的点数组
         * 注:默认WGS84椭球参数,可改
         */
        public static Point[] Xyz2Blh(Point[] pt, int mod=1)
        {
   
            int n = pt.Length;
            Point[] Pt = new Point[n];
            double a = 0, b = 0, e2, e1;
            if (mod == 1)
            {
   //1975年椭球
                a = 6378140;
                b = 6356755.2881575287;
            }
            else if (mod == 2)
            {
   //克拉索夫斯基椭球
                a = 6378245.0;
                b = 6356863.0187730473;
            }
            double[] TQ = Get_TQ(a, b);
            e1 = TQ[3];
            e2 = TQ[4];
            for(int i=0;i<n;i++)
            {
   
                Point p=pt[i];            
                double B, B0 = 0, L, H, N;
                L = Math.Atan(p.y / p.x);
                B = Math.Atan(p.z / Math.Sqrt(P(p.x, 2) + P(p.y, 2)));
                while (Math.Abs(B0 - B) > 1e-9)
                {
   
                    B0 = B;
                    N = a / Math.Sqrt(1 - P(e1 * Math.Sin(B), 2));
                    B = Math.Atan((p.z + N * P(e1, 2) * Math.Sin(B)) / Math.Sqrt(P(p.x, 2) + P(p.y, 2)));
                }
                N = a / Math.Sqrt(1 - P(e1 * Math.Sin(B), 2));
                H = Math.Sqrt(P(p.x, 2) + P(p.y, 2)) / Math.Cos(B) - N;
                Pt[i] = new Point(B, L, H, p.name);
            }
            return Pt;
        }
        /*此函数用来将blh 转换成xyz
         * bl都是弧度!!
         * 输入:待转换的点数组
         * 输出:转换成功的点数组
         * 注:默认WGS84椭球参数,可改
         */
        public static Point[] Blh2Xyz(Point[] pt, int mod = 1)
        {
   
            int n = pt.Length;
            Point[] Pt = new Point[n];
            double a = 0, b = 0, e2, e1;
            if (mod == 1)
            {
   //1975年椭球
                a = 6378140;
                b = 6356755.2881575287;
            }
            else if (mod == 2)
            {
   //克拉索夫斯基椭球
                a = 6378245.0;
                b = 6356863.0187730473;
            }
            double[] TQ = Get_TQ(a, b);
            e1 = TQ[3];
            e2 = TQ[4];
            for(int i=0;i<n;i++)
            {
   
                Point p=pt[i];           
                double N = a / Math.Sqrt(1 - Math.Pow(e1 * Math.Sin(p.x), 2));
                double x, y, z;
                x = (N + p.z) * Math.Cos(p.x) * Math.Cos(p.y);
                y = (N + p.z) * Math.Cos(p.x) * Math.Sin(p.y)
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值