c#大地测量学各坐标系坐标转换(窗体应用程序)

大地坐标系

空间直角坐标系

子午面直角坐标系

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace project1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            double L, B, H, X, Y, Z, x, y;
            double a = 6378137;//椭圆长半轴
            double b = 6356752.3141;//椭圆短半轴
            double e_2 = 0.00669438002290;//椭圆第一偏心率e^2
            double e_dot_2 = 0.00673949677548;//椭圆第二偏心率e'^2  
            double c = a * a / b;
            double k = 1 + e_dot_2;
            double p = Math.PI / 180;//角度值转弧度制系数
            //如果需要更严谨的代码,可以更换为三个textbox是否为空的判断,并自行添加参数错误提示的信息
            if (textBox5.Text != string.Empty&& textBox4.Text != string.Empty)//已知大地坐标系
            {
                L = Convert.ToDouble(textBox1.Text);
                B= Convert.ToDouble(textBox4.Text);
                H= Convert.ToDouble(textBox5.Text);
                double W = Math.Sqrt(1 - e_2 * Math.Sin(B*p) * Math.Sin(B * p));
                double V = Math.Sqrt(1 + e_dot_2 * Math.Cos(B * p) * Math.Cos(B * p));
                double N = a / W;
                //计算空间直角坐标系
                X = (N+H)*Math.Cos(B * p) * Math.Cos(L * p);
                Y = (N + H) * Math.Cos(B * p) * Math.Sin(L * p);
                Z = (N*(1-e_2)+H)*Math.Sin(B * p);
                textBox3.Text = Convert.ToString(X);
                textBox8.Text = Convert.ToString(Y);
                textBox9.Text = Convert.ToString(Z);
                //计算子午面直角坐标系
                x =X/Math.Cos(L*p);
                y = Z;
                textBox2.Text = Convert.ToString(L);
                textBox6.Text = Convert.ToString(x);
                textBox7.Text = Convert.ToString(y);
            }
            else if (textBox7.Text != string.Empty&& textBox6.Text != string.Empty)//已知子午面直角坐标系
            {
                L = Convert.ToDouble(textBox2.Text);  
                x= Convert.ToDouble(textBox6.Text);
                y= Convert.ToDouble(textBox7.Text);
                //计算空间直角坐标系
                X = x * Math.Cos(L * p);
                Y = x * Math.Sin(L * p);
                Z = y;
                textBox3.Text = Convert.ToString(X);
                textBox8.Text = Convert.ToString(Y);
                textBox9.Text = Convert.ToString(Z);
                //计算大地坐标系
                double tan0 = Z / Math.Sqrt(X *X + Y *Y);
                double P = c * e_2 / Math.Sqrt(X * X + Y * Y);
                double tanB=tan0,cha;//循环迭代
                do
                {
                    cha = tanB;
                    tanB = tan0 + P * cha / Math.Sqrt(k + cha * cha);
                } while (Math.Abs(cha-tanB) > Math.Pow(10, -10));
                B = Math.Atan(tanB );
                double W = Math.Sqrt(1 - e_2 * Math.Sin(B ) * Math.Sin(B ));
                double V = Math.Sqrt(1 + e_dot_2 * Math.Cos(B ) * Math.Cos(B ));
                double N = a / W;
                H = Math.Sqrt(X * X + Y * Y) / Math.Cos(B ) - N;
                textBox1.Text = Convert.ToString(L);
                textBox4.Text = Convert.ToString(B * 180 / Math.PI);
                textBox5.Text = Convert.ToString(H);
            }
            else if (textBox9.Text != string.Empty&& textBox8.Text != string.Empty)//已知空间直角坐标系
            {
                X = Convert.ToDouble(textBox3.Text);
                Y = Convert.ToDouble(textBox8.Text);
                Z = Convert.ToDouble(textBox9.Text);
                //计算大地坐标系
                L = Math.Atan(Y / X );
                double tan0 = Z / Math.Sqrt(X * X + Y * Y);
                double P = c * e_2 / Math.Sqrt(X * X + Y * Y);
                double tanB = tan0, cha;//循环迭代
                do
                {
                    cha = tanB;
                    tanB = tan0 + P * cha / Math.Sqrt(k + cha * cha);
                } while (Math.Abs(cha - tanB) > Math.Pow(10, -10));
                B = Math.Atan(tanB );
                double W = Math.Sqrt(1 - e_2 * Math.Sin(B ) * Math.Sin(B ));
                double V = Math.Sqrt(1 + e_dot_2 * Math.Cos(B ) * Math.Cos(B));
                double N = a / W;
                H = Math.Sqrt(X * X + Y * Y) /Math.Cos(B ) - N;
                textBox1.Text = Convert.ToString(L*180/Math.PI);
                textBox4.Text = Convert.ToString(B *180/ Math.PI);
                textBox5.Text = Convert.ToString(H);
                //计算子午面直角坐标系
                x = X / Math.Cos(L);
                y = Z;
                textBox2.Text = Convert.ToString(L*180/Math.PI);
                textBox6.Text = Convert.ToString(x);
                textBox7.Text = Convert.ToString(y);
            }
        }

    }
}

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于C语言的空间直角坐标大地坐标转换源程序: ```c #include <stdio.h> #include <math.h> #define pi 3.14159265358979323846 // 定义椭球体参数结构体 typedef struct { double a; // 长半轴 double b; // 短半轴 double f; // 扁率 } Ellipsoid; // 定义大地坐标结构体 typedef struct { double B; // 纬度 double L; // 经度 double H; // 高程 } GeodeticCoord; // 定义空间直角坐标结构体 typedef struct { double X; double Y; double Z; } CartesianCoord; // 计算椭球体的第一偏心率 double Eccentricity(Ellipsoid ellipsoid) { double e = sqrt(1 - pow(ellipsoid.b / ellipsoid.a, 2)); return e; } // 计算椭球体的第二偏心率 double SecondEccentricity(Ellipsoid ellipsoid) { double e = Eccentricity(ellipsoid); double ep = sqrt(pow(ellipsoid.a / ellipsoid.b, 2) - 1); return ep; } // 计算子午圈半径 double MeridianRadius(double lat, Ellipsoid ellipsoid) { double a = ellipsoid.a; double b = ellipsoid.b; double e2 = pow(Eccentricity(ellipsoid), 2); double M = a * (1 - e2); double N = a / sqrt(1 - e2 * pow(sin(lat), 2)); double Rm = M / pow(1 - e2 * pow(sin(lat), 2), 1.5); return Rm; } // 计算卯酉圈半径 double PrimeVerticalRadius(double lat, Ellipsoid ellipsoid) { double a = ellipsoid.a; double b = ellipsoid.b; double e2 = pow(Eccentricity(ellipsoid), 2); double M = a * (1 - e2); double N = a / sqrt(1 - e2 * pow(sin(lat), 2)); double Rn = N / sqrt(1 + e2 * pow(cos(lat), 2)); return Rn; } // 大地坐标转空间直角坐标 CartesianCoord GeodeticToCartesian(GeodeticCoord geodeticCoord, Ellipsoid ellipsoid) { double B = geodeticCoord.B * pi / 180; double L = geodeticCoord.L * pi / 180; double H = geodeticCoord.H; double e2 = pow(Eccentricity(ellipsoid), 2); double N = ellipsoid.a / sqrt(1 - e2 * pow(sin(B), 2)); double X = (N + H) * cos(B) * cos(L); double Y = (N + H) * cos(B) * sin(L); double Z = (N * (1 - e2) + H) * sin(B); CartesianCoord cartesianCoord = {X, Y, Z}; return cartesianCoord; } // 空间直角坐标大地坐标 GeodeticCoord CartesianToGeodetic(CartesianCoord cartesianCoord, Ellipsoid ellipsoid) { double X = cartesianCoord.X; double Y = cartesianCoord.Y; double Z = cartesianCoord.Z; double p = sqrt(pow(X, 2) + pow(Y, 2)); double theta = atan2(Z * ellipsoid.a, p * ellipsoid.b); double B = atan2(Z + pow(SecondEccentricity(ellipsoid), 2) * ellipsoid.b * pow(sin(theta), 3), p - pow(Eccentricity(ellipsoid), 2) * ellipsoid.a * pow(cos(theta), 3)); double L = atan2(Y, X); double H = p / cos(B) - ellipsoid.a / sqrt(1 - pow(Eccentricity(ellipsoid), 2) * pow(sin(B), 2)); GeodeticCoord geodeticCoord = {B * 180 / pi, L * 180 / pi, H}; return geodeticCoord; } int main() { // 定义WGS84椭球体参数 Ellipsoid ellipsoid = {6378137.0, 6356752.3142, 1.0 / 298.257223563}; // 定义大地坐标 GeodeticCoord geodeticCoord1 = {39.9075, 116.39723, 0}; printf("大地坐标: B=%.6f, L=%.6f, H=%.6f\n", geodeticCoord1.B, geodeticCoord1.L, geodeticCoord1.H); // 大地坐标转空间直角坐标 CartesianCoord cartesianCoord1 = GeodeticToCartesian(geodeticCoord1, ellipsoid); printf("空间直角坐标: X=%.6f, Y=%.6f, Z=%.6f\n", cartesianCoord1.X, cartesianCoord1.Y, cartesianCoord1.Z); // 空间直角坐标大地坐标 GeodeticCoord geodeticCoord2 = CartesianToGeodetic(cartesianCoord1, ellipsoid); printf("大地坐标: B=%.6f, L=%.6f, H=%.6f\n", geodeticCoord2.B, geodeticCoord2.L, geodeticCoord2.H); return 0; } ``` 其中,WGS84椭球体参数为: - 长半轴:6378137.0米 - 短半轴:6356752.3142米 - 扁率:1/298.257223563 你可以根据实际需要修改椭球体参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值