ECEF和ENU和BLH坐标系的转换

包括地心地固坐标系(ECEF)和大地坐标系(BLH)和站心坐标系(ENU)的坐标转换过程和相关网址。

1.打开命令行或终端

(1) 在Windows上,你可以按 Win + R,然后输入 cmd 并按回车。

(2) 在macOS或Linux上,你可以打开终端应用程序。

2.使用pip安装pyproj

(1) 在命令行或终端中输入以下命令并按回车: 

pip install pyproj

3.运行程序: 

import pyproj

# ECEF坐标
x, y, z = 是参考点的ECEF坐标

# 定义ECEF和大地坐标系的转换器
ecef = pyproj.Proj(proj='geocent', ellps='WGS84', datum='WGS84')
lla = pyproj.Proj(proj='latlong', ellps='WGS84', datum='WGS84')

# 转换到大地坐标系
lon, lat, alt = pyproj.transform(ecef, lla, x, y, z, radians=False)
print(f"大地坐标系:经度 {lon}, 纬度 {lat}, 高程 {alt}")

# 参考点的大地坐标(假设参考点为计算得到的经纬度高程)
ref_lon, ref_lat, ref_alt = lon, lat, alt

# 转换到站心坐标系
transformer = pyproj.Transformer.from_crs(
    {"proj": 'geocent', "ellps": 'WGS84', "datum": 'WGS84'},
    {"proj": 'latlong', "ellps": 'WGS84', "datum": 'WGS84'},
    always_xy=True)

# 假设你要转换的其他ECEF坐标为 (x2, y2, z2)
x2, y2, z2 = 是目标点的ECEF坐标

# 计算站心坐标系下的坐标
enu = transformer.transform(x2 - x, y2 - y, z2 - z, radians=False)
print(f"站心坐标系:东向 {enu[0]}, 北向 {enu[1]}, 天向 {enu[2]}")

4.相关网址:在线工具大全 (lddgo.net)

BLH(B:纬度,L:经度,H:高度)坐标系转换ENU(E:东向,N:北向,U:天向)坐标系的方法如下: 1. 首先需要将BLH坐标系转换为地心直角坐标系ECEF坐标系)。 2. 然后,计算出BLH坐标系的切平面与ECEF坐标系的交点,得到参考点的坐标。 3. 将所求点的ECEF坐标系减去参考点的ECEF坐标系得到所求点相对于参考点的ECEF坐标系坐标。 4. 最后,将相对于参考点的ECEF坐标系坐标转换ENU坐标系坐标。 C++代码实现如下: ```cpp #include <cmath> // 地球半径 const double R = 6378137.0; // 弧度角度 double rad2deg(double rad) { return rad / M_PI * 180.0; } // 角度弧度 double deg2rad(double deg) { return deg / 180.0 * M_PI; } // 计算地球表面两点间的距离 double distance(double lat1, double lng1, double lat2, double lng2) { double radLat1 = deg2rad(lat1); double radLng1 = deg2rad(lng1); double radLat2 = deg2rad(lat2); double radLng2 = deg2rad(lng2); double a = sin((radLat1 - radLat2) / 2.0) * sin((radLat1 - radLat2) / 2.0) + cos(radLat1) * cos(radLat2) * sin((radLng1 - radLng2) / 2.0) * sin((radLng1 - radLng2) / 2.0); double c = 2.0 * atan2(sqrt(a), sqrt(1.0 - a)); return R * c; } // BLH坐标系ECEF坐标系 void blh2ecef(double lat, double lng, double alt, double &x, double &y, double &z) { double radLat = deg2rad(lat); double radLng = deg2rad(lng); double N = R / sqrt(1.0 - 0.00669437999014 * sin(radLat) * sin(radLat)); x = (N + alt) * cos(radLat) * cos(radLng); y = (N + alt) * cos(radLat) * sin(radLng); z = (N * (1.0 - 0.00669437999014) + alt) * sin(radLat); } // ECEF坐标系ENU坐标系 void ecef2enu(double lat, double lng, double alt, double &x, double &y, double &z, double refLat, double refLng, double refAlt) { double radRefLat = deg2rad(refLat); double radRefLng = deg2rad(refLng); double radLat = deg2rad(lat); double radLng = deg2rad(lng); double dx = (R + refAlt) * cos(radRefLat) * sin(radLng - radRefLng); double dy = (R + refAlt) * (sin(radLat) * cos(radRefLat) - cos(radLat) * sin(radRefLat) * cos(radLng - radRefLng)); double dz = (R + refAlt) * (cos(radLat) * cos(radRefLat) * cos(radLng - radRefLng) + sin(radLat) * sin(radRefLat)); double x0, y0, z0; blh2ecef(refLat, refLng, refAlt, x0, y0, z0); x = dx - (x - x0); y = dy - (y - y0); z = dz - (z - z0); } // BLH坐标系ENU坐标系 void blh2enu(double lat, double lng, double alt, double &x, double &y, double &z, double refLat, double refLng, double refAlt) { double x0, y0, z0; blh2ecef(lat, lng, alt, x, y, z); ecef2enu(lat, lng, alt, x, y, z, refLat, refLng, refAlt); } ``` 其中,`lat`、`lng`、`alt`为待转换BLH坐标系坐标,`x`、`y`、`z`为转换后的ENU坐标系坐标,`refLat`、`refLng`、`refAlt`为参考点的BLH坐标系坐标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值