其他
【技术】坐标转换源码分享,你能看懂吗?
大地坐标转换为直角坐标
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;
}
}
}
-----END-----
社群交流 / 原创投稿 / 商务合作
(请添加下方小助手微信)
来源:测绘程序设计 转自:GeomaticsCenter
推荐阅读
【技术】从项目合同签订到成果交付,航测各阶段详细流程你了解吗?
年会专题 | 张周平:新型基础测绘与实景三维西安建设探索与思考
推荐关注
温馨提示:近期,微信公众号信息流改版。每个用户可以设置 常读订阅号,这些订阅号将以大卡片的形式展示。因此,如果不想错过“测绘之家”的文章,你一定要进行以下操作:进入“测绘之家”公众号 → 点击右上角的 ··· 菜单 → 选择「设为星标」
↓↓↓点击下方“阅读原文”查看更多精彩内容...