UTM坐标与GPS经纬度(WGS84)的相互转换

一、UTM介绍

统一横轴墨卡托投影系统(Universal Transverse Mercator,UTM)

参考:

https://www.youtube.com/watch?v=LcVlx4Gur7I

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system

GPS经纬度坐标转UTM坐标(c++)_Bobsweetie的博客-CSDN博客_c++ 经纬度转utm

UTM坐标与时区说明

二、python转换

GPS经纬度(WGS84、大地坐标和UTM坐标相互转换

#!/usr/bin/env python3
#coding=utf-8

import utm

# 经纬度转UTM
lat=37.065
lon=128.543
# from_latlon(latitude, longitude, force_zone_number=None, force_zone_letter=None)
utm_ = utm.from_latlon(lat, lon)
utm_x = utm_[0]
utm_y = utm_[1]
utm_zone = utm_[2]
utm_band = utm_[3]
print("utm_x: %s, utm_y: %s, utm_zone: %s, utm_band: %s" % (utm_x, utm_y, utm_zone, utm_band))

# UTM转经纬度
lat, lon = utm.to_latlon(utm_x, utm_y, utm_zone, utm_band)
print("lat: %s, lon: %s" % (lat, lon))

输出:

utm_x: 459372.45701569295, utm_y: 4102180.728899499, utm_zone: 52, utm_band: S
lat: 37.06499999994699, lon: 128.54299999005866 

三、C++转换

经纬度转UTM

void LonLat2UTM(double longitude, double latitude, double& UTME, double& UTMN)
{
	double lat = latitude;
	double lon = longitude;

	double kD2R = PI / 180.0;
	double ZoneNumber = floor((lon - 1.5) / 3.0) + 1;
	double L0 = ZoneNumber * 3.0;

	double a = 6378137.0;
	double F = 298.257223563;
	double f = 1 / F;
	double b = a * (1 - f);
	double ee = (a * a - b * b) / (a * a);
	double e2 = (a * a - b * b) / (b * b);
	double n = (a - b) / (a + b); 
	double n2 = (n * n); 
	double n3 = (n2 * n); 
	double n4 = (n2 * n2); 
	double n5 = (n4 * n);
	double al = (a + b) * (1 + n2 / 4 + n4 / 64) / 2.0;
	double bt = -3 * n / 2 + 9 * n3 / 16 - 3 * n5 / 32.0;
	double gm = 15 * n2 / 16 - 15 * n4 / 32;
	double dt = -35 * n3 / 48 + 105 * n5 / 256;
	double ep = 315 * n4 / 512;
	double B = lat * kD2R;
	double L = lon * kD2R;
	L0 = L0 * kD2R;
	double l = L - L0; 
	double cl = (cos(B) * l); 
	double cl2 = (cl * cl); 
	double cl3 = (cl2 * cl); 
	double cl4 = (cl2 * cl2); 
	double cl5 = (cl4 * cl); 
	double cl6 = (cl5 * cl); 
	double cl7 = (cl6 * cl); 
	double cl8 = (cl4 * cl4);
	double lB = al * (B + bt * sin(2 * B) + gm * sin(4 * B) + dt * sin(6 * B) + ep * sin(8 * B));
	double t = tan(B); 
	double t2 = (t * t); 
	double t4 = (t2 * t2); 
	double t6 = (t4 * t2);
	double Nn = a / sqrt(1 - ee * sin(B) * sin(B));
	double yt = e2 * cos(B) * cos(B);
	double N = lB;
	N = N + t * Nn * cl2 / 2;
	N = N + t * Nn * cl4 * (5 - t2 + 9 * yt + 4 * yt * yt) / 24;
	N = N + t * Nn * cl6 * (61 - 58 * t2 + t4 + 270 * yt - 330 * t2 * yt) / 720;
	N = N + t * Nn * cl8 * (1385 - 3111 * t2 + 543 * t4 - t6) / 40320;
	double E = Nn * cl;
	E = E + Nn * cl3 * (1 - t2 + yt) / 6;
	E = E + Nn * cl5 * (5 - 18 * t2 + t4 + 14 * yt - 58 * t2 * yt) / 120;
	E = E + Nn * cl7 * (61 - 479 * t2 + 179 * t4 - t6) / 5040;
	E = E + 500000;
	N = 0.9996 * N;
	E = 0.9996 * (E - 500000.0) + 500000.0;

	UTME = E;
	UTMN = N;
}

UTM转经纬度

四、验证

转换结果可以利用软件:UTM Coordinate Converter进行验证


自动驾驶地图定位中的坐标变换:

GPS/RTK获得经度lon、纬度lat、高程height、偏航角yaw、俯仰角pitch、横滚角roll,将lon,lat转化为utm坐标,(utm_x, utm_y, height)就可以作为GPS此时在世界坐标系下位置,再把yaw,pitch,roll转化为旋转矩阵,就可以得到GPS在世界坐标系下的姿态q,合起来就得到了GPS在世界坐标系下的位姿,通过标定可得到GPS到车身base_link坐标系的变换,这样就能得到当前车身base_link在世界坐标系下的位姿,再由标定可得到lidar到车身base_link坐标系的变换,这样就能把lidar坐标系下的点云变换到世界坐标系下,也就是高精地图中点云的坐标。

由于地图太大,需要对其进行方形网格分块进行存储和查询,每一块的id可通过resolution, col(utm_x/resolution), row(utm_y/resolution), utm_zone, utm_band进行编码

同时,将GPS得到的经纬度转换为火星坐标系,就通过一些地理信息可视化库在地图上可视化轨迹,如通过轨迹坐标生成kml文件,就可以在谷歌地球上显示轨迹


 高程系统

 

  • 3
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: WGS84坐标系和UTM坐标系是两种常用的地理坐标系。WGS84坐标系是一种大地坐标系,它使用地心坐标系(ECEF)表示地球表面上的点,通常使用经纬度和海报高度来描述这些点。UTM坐标系是一种地方坐标系,它使用平面直角坐标系来描述地球表面上的点,通常使用横坐标和纵坐标来描述这些点。 在C语言中,可以使用空间参考系转换库(如 PROJ.4)来实现WGS84坐标系和UTM坐标系之间的转换。 PROJ.4是一个开源库,可以用于地理信息系统(GIS)和其他应用程序中的空间参考系转换。使用 PROJ.4 库时,需要先安装 PROJ.4 库并包含 proj_api.h 头文件。 下面是使用 PROJ.4 库将WGS84坐标转换UTM坐标的示例代码: ``` #include <stdio.h> #include <proj_api.h> int main() { // 定义 WGS84 坐标系和 UTM 坐标系的投影参数 projPJ wgs84, utm; // 初始化 WGS84 坐标系的投影参数 wgs84 = pj_init_plus("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"); // 初始化 UTM 坐标系的投影参数 utm = pj_init ### 回答2: WGS84坐标UTM坐标是两种常用的地理坐标系统,用于描述地球上不同位置的点。由于其使用范围广泛,相互之间的转换在地理信息系统和空间数据处理中非常重要。下面将用C语言实现WGS84坐标UTM坐标相互转换。 首先,我们需要定义一些公式和常数来处理坐标转换。这些公式和常数可以在WGS84UTM坐标系统的文档中找到。 对于从WGS84坐标转换UTM坐标,我们可以使用以下步骤: 1. 根据经度计算所属的UTM带号,可根据给定的经度范围进行判断。 2. 根据WGS84坐标的纬度计算相应的UTM纬度带,例如北半球为奇数带号,南半球为偶数带号。 3. 计算在该UTM带下的中央经度,即该带号的中心经线。 4. 计算WGS84坐标的纬度与中央经线之间的差异,称为Δλ。 5. 使用公式计算UTM坐标的东北位移。 对于从UTM坐标转换WGS84坐标,我们可以使用以下步骤: 1. 根据UTM带号计算中央经度。 2. 根据UTM纬度带和给定的UTM带号范围,判断坐标位于北半球还是南半球。 3. 根据UTM坐标的纬度与中央经线之间的差值,得到纬度。 4. 根据公式计算经度。 以上是WGS84坐标UTM坐标相互转换的一般步骤,具体的C语言代码实现需要参考相关的数学公式和算法。可以通过搜索相关的代码库或开源项目,找到已经实现了这些功能的代码,并根据自己的需求进行调整和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值