空间直角坐标系(xyz)与大地坐标系(经纬高)的转换

//空间直角坐标系(xyz)转换大地坐标系(经纬度)
	            double a = 6378137.000;//长半轴
	            double f = 1 / 298.3;//扁率
	            double b = a - a * f;//短半轴
	            double ec = 1 - Math.pow(b, 2) / Math.pow(a, 2);//第一偏心率平方
	            double ecc= ec / (1-ec);//第二偏心率平方
		 double X =-2098813.2676;
	     double Y =4804967.1055;
	     double Z =3619537.1465;
	     double L = Math.atan(Y / X);
	     if (X < 0)
	         L += Math.PI;
	     double r = Math.sqrt(X * X + Y * Y);
	     double B1 = Math.atan(Z / r);
	     double B2;
	     while (true)
	     {
	         double W1 = Math.sqrt(1 - ec * (Math.sin(B1) * Math.sin(B1)));
	         double N1 = a / W1;
	         B2 = Math.atan((Z + N1 * ec * Math.sin(B1)) / r);
	         if (Math.abs(B2 - B1) <= 0.0000000001)
	             break;
	         B1 = B2;
	     }
	    double B = B2;
	     double W = Math.sqrt(1 - ec * (Math.sin(B2) * Math.sin(B2)));
	     double N = a / W;
	     double H = r / Math.cos(B2) - N;
	     System.out.println(L+","+B+","+H);

//大地坐标系(经纬度)转换空间直角坐标系(xyz)
		
		 double L=113.608437;
		 double B=34.802459;
		 double Height=0;
			double a = 6378137.0;              
			double e2 = 0.00669438002290;	//转换为弧度   
			 L = L * PI/180;//经度
			 B = B * PI/180;//纬度

			double fac1 = 1- e2*Math.sin(B)*Math.sin(B);
			double N = a/Math.sqrt(fac1); //卯酉圈曲率半径
			double Daita_h = 0;      //高程异常,默认为0
			double h = Daita_h + Height;
			
			double X = (N+h)*Math.cos(B)*Math.cos(L);
			double Y = (N+h)*Math.cos(B)*Math.sin(L);
			double Z = ( N*(1-e2)+ h ) * Math.sin(B);
			System.out.println(X+","+Y+","+Z);

该方法转换的经纬度有问题,因为我需要的是高度差,所以我只关心了高的标准值。

  • 4
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
大地坐标系空间直角坐标是常用的两种坐标系,它们之间的转换可以使用以下代码实现: ```python import math # 定义椭球体参数 a = 6378137.0 # 长半轴 b = 6356752.314245 # 短半轴 f = (a - b) / a # 扁率 # 定义经纬度和度 lon = 116.3975 # 经度 lat = 39.9087 # 纬度 h = 50 # 大地 # 计算相关参数 e2 = (a**2 - b**2) / a**2 # 第一偏心率的平方 sin_lat = math.sin(lat * math.pi / 180) cos_lat = math.cos(lat * math.pi / 180) N = a / math.sqrt(1 - e2 * sin_lat**2) # 计算空间直角坐标xyz值 x = (N + h) * cos_lat * math.cos(lon * math.pi / 180) y = (N + h) * cos_lat * math.sin(lon * math.pi / 180) z = (N * (1 - e2) + h) * sin_lat # 计算大地坐标系经纬度和度 p = math.sqrt(x**2 + y**2) theta = math.atan2(z * a, p * b) lon_ = math.atan2(y, x) lat_ = math.atan2(z + f**2 * b * math.sin(theta)**3, p - e2 * a * math.cos(theta)**3) N_ = a / math.sqrt(1 - e2 * math.sin(lat_)**2) h_ = p / math.cos(lat_) - N_ # 输出结果 print("空间直角坐标:x={:.2f}m,y={:.2f}m,z={:.2f}m".format(x, y, z)) print("大地坐标系:经度={:.6f}°,纬度={:.6f}°,度={:.2f}m".format(lon_ * 180 / math.pi, lat_ * 180 / math.pi, h_)) ``` 其中,`a`、`b`、`f` 分别为椭球体长半轴、短半轴和扁率,`lon`、`lat`、`h` 分别为待转换的经度、纬度和度,`x`、`y`、`z` 分别为空间直角坐标的三个坐标值,`lon_`、`lat_`、`h_` 分别为转换后的经度、纬度和度。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值