gps转wgs转XY坐标系

  • GPS转WGS84
  • $GPGGA协议
  • WGS84转XY坐标
    • 将GPS数据转成Ecef坐标系(地心坐标系),原点是地心
    • GPS转到自定义坐标系
  • WGS84转UTM

GPS转WGS84

接收机输出的数据格式:ddd°mm.mmm 度 . 分 . 分 格式
比如:纬度 DDFF.FFFF
Wgs84 = DD +FFFFFF/60
经度
DDDFF.FFFF
Wgs84= DDD + FFFFFF/60

$GPGGA协议

G P G G A 语句包括 17 个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量, H D O P − 水平精度因子,椭球高,高度单位,大地水准面高度异常差值,高度单位,差分 G P S 数据期限,差分参考基站标号,校验和结束标记 ( 用回车符 < C R > 和换行符 < L F > ) ,分别用 14 个逗号进行分隔。格式示例: GPGGA 语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,HDOP-水平精度因子,椭球高,高度单位,大地水准面高度异常差值,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符<CR>和换行符<LF>),分别用14个逗号进行分隔。 格式示例: GPGGA语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,HDOP−水平精度因子,椭球高,高度单位,大地水准面高度异常差值,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符<CR>和换行符<LF>),分别用14个逗号进行分隔。格式示例:GPGGA,014434.70,3817.13334637,N,12139.72994196,E,4,07,1.5,6.571,M,8.942,M,0.7,0016*79
该数据帧的结构及各字段释义如下:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx
$GPGGA:起始引导符及语句格式说明(本句为GPS定位数据);
<1> UTC时间,格式为hhmmss.sss;
<2> 纬度,格式为ddmm.mmmm(第一位是零也将传送);
<3> 纬度半球,N或S(北纬或南纬)
<4> 经度,格式为dddmm.mmmm(第一位零也将传送);
<5> 经度半球,E或W(东经或西经)
<6> GPS状态, 0初始化, 1单点定位, 2码差分, 3无效PPS, 4固定解, 5浮点解, 6正在估算 7,人工输入固定值, 8模拟模式, 9WAAS差分
<7> 使用卫星数量,从00到12(第一个零也将传送)
<8> HDOP-水平精度因子,0.5到99.9,一般认为HDOP越小,质量越好。
<9> 海拔高度,-9999.9到9999.9米
M 指单位米
<10> 大地水准面高度异常差值,-9999.9到9999.9米
M 指单位米
<11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量,如不是差分定位则为空
<12> 差分参考基站标号,从0000到1023(首位0也将传送)。

  • 语句结束标志符
    xx 从$开始到*之间的所有ASCII码的异或校验
    回车符,结束标记
    换行符,结束标记

WGS84转XY坐标

将GPS数据转成Ecef坐标系(地心坐标系),原点是地心

Eigen::Vector3d LatLongAltToEcef(const double latitude, const double longitude,
const double altitude)
{
constexpr double a = 6378137.; // semi-major axis, equator to center.
constexpr double f = 1. / 298.257223563;
constexpr double b = a * (1. - f); // semi-minor axis, pole to center.
constexpr double a_squared = a * a;
constexpr double b_squared = b * b;
constexpr double e_squared = (a_squared - b_squared) / a_squared;
const double sin_phi = std::sin(rad(latitude));
const double cos_phi = std::cos(rad(latitude));
const double sin_lambda = std::sin(rad(longitude));
const double cos_lambda = std::cos(rad(longitude));
const double N = a / std::sqrt(1 - e_squared * sin_phi * sin_phi);
const double x = (N + altitude) * cos_phi * cos_lambda;
const double y = (N + altitude) * cos_phi * sin_lambda;
const double z = (b_squared / a_squared * N + altitude) * sin_phi;
std::cout <<“x:”<<x<<“y:”<<y<<“z:”<<z<<std::endl;
return Eigen::Vector3d(x, y, z);
}
Ecef坐标系

GPS转到自定义坐标系

第一帧gps数据为原点,建立自定义笛卡尔坐标系。
bool init_flag =true;
double origin_latitude_value;
double origin_longitude_value;
double origin_altitude_value;
double z_rotate_value;
double longitude_resolution = 1.09244689e-05;
double latitude_resolution = 9.01006167e-06;
double altitude_resolution = 1.0;
void gps_to_xyz(double latitude,double longitude,double altitude,double &x,double &y,double &z)
{
if (init_flag == true)
{
origin_latitude_value = latitude;
origin_longitude_value = longitude;
origin_altitude_value = altitude;
init_flag = false;
}else{
double gps_lat = latitude;
double gps_lon = longitude;
double gps_hei = altitude;
double gps_xx = (gps_lon - origin_longitude_value) / longitude_resolution;
double gps_yy = (gps_lat - origin_latitude_value) / latitude_resolution;
double gps_zz = (gps_hei - origin_altitude_value) / altitude_resolution;
double gps_x = cos(rad(z_rotate_value)) * gps_xx + (-sin(rad(z_rotate_value))) * gps_yy;
double gps_y = sin(rad(z_rotate_value)) * gps_xx + cos(rad(z_rotate_value)) * gps_yy;
double gps_z = gps_zz;
x = gps_x;
y = gps_y;
z = gps_z;
}
}

//R可取值 R = 6378137; // 赤道半径 6378137

WGS84转UTM

ros系统
1、准备,安装geodesy 软件包 sudo apt-get install ros-xxx-geodesy
2、CMakeLists.txt 添加 geodesy
3、代码实现

//头文件wgs2utm.h
#ifndef WGS2UTM_H
#define WGS2UTM_H#include <iostream>
#include <fstream>
#include <vector>
#include <Eigen/Geometry>
#include <geodesy/utm.h>
#include <ros/ros.h>using namespace std;class WGS2UTM
{public:/*** @brief 构造函数*/WGS2UTM();/*** @brief 获取选取原点的经纬度lla坐标* @return  所选取原点的经纬度lla坐标*/inline Eigen::Vector3d get_origin_lla() {return origin_LLA_;}/*** @brief 获取选取原点的经纬度utm坐标* @return  所选取原点的经纬度utm坐标*/inline Eigen::Vector3d get_origin_tum() {return origin_UTM_;}/***********************************************************//***********************************************************//*****利用geodesy功能包实现WGS84经纬度坐标转化成UTM坐标*****//***********************************************************//***********************************************************//*** @brief 把选取的原点的经纬度lla坐标转化为东北天utm坐标* @param origin_LLA    输入--原点经纬度lla坐标*/void set_origin_1(Eigen::Vector3d origin_LLA);/*** @brief 把经纬度lla坐标转化为东北天utm坐标* @param LLA    输入--lla坐标* @param UTM    输出--utm坐标*/void LLA2UTM_1(const Eigen::Vector3d& LLA, Eigen::Vector3d& UTM);/*** @brief 把经纬度lla坐标转化为相对于所选取原点的东北天utm坐标* @param LLA    输入--lla坐标* @param UTM    输出--utm坐标*/void LLA2UTM_origin_1(const Eigen::Vector3d& LLA, Eigen::Vector3d& UTM_origin);private:Eigen::Vector3d origin_LLA_;Eigen::Vector3d origin_UTM_;double torad = M_PI / 180;
};
#endif //WGS2UTM_H*************************************************************************************
//源文件wgs2utm.cpp
#include "wgs2utm.h"WGS2UTM::WGS2UTM() {}void WGS2UTM::set_origin_1(Eigen::Vector3d origin_LLA)
{origin_LLA_ = origin_LLA;LLA2UTM_1(origin_LLA_, origin_UTM_);
}void WGS2UTM::LLA2UTM_1(const Eigen::Vector3d& LLA, Eigen::Vector3d& UTM)
{geographic_msgs::GeoPointStampedPtr gps_msg(new geographic_msgs::GeoPointStamped());gps_msg->position.latitude  = LLA[0];gps_msg->position.longitude = LLA[1];gps_msg->position.altitude  = LLA[2];geodesy::UTMPoint utm_point;geodesy::fromMsg(gps_msg->position, utm_point);UTM[0] = utm_point.easting;UTM[1] = utm_point.northing;UTM[2] = utm_point.altitude;
}void WGS2UTM::LLA2UTM_origin_1(const Eigen::Vector3d& LLA, Eigen::Vector3d& UTM_origin)
{//经纬度转换为UTM投影Eigen::Vector3d UTM;LLA2UTM_1(LLA, UTM);//UTM2ENU, UTM投影平移至东北天坐标系, 东北天坐标系原点为第一个采样点UTM_origin = UTM - origin_UTM_;
}
***********************************************************
//应用
#include "wgs2utm.h"
using namespace std;
int main()
{WGS2UTM wgs2utm;Eigen::Vector3d origin_LLA;Eigen::Vector3d origin_UTM;origin_LLA[0] = 30.9543508;origin_LLA[1] = 121.4795984;origin_LLA[2] = 17.0970000;wgs2utm.set_origin_1(origin_LLA);origin_UTM = wgs2utm.get_origin_tum();cout << "origin_UTM: (" <<  origin_UTM[0] << ", " << origin_UTM[1] << ", " <<       origin_UTM[2] << ")" << endl;cout << "******************************" << endl;Eigen::Vector3d P_LLA;  // 任意一点的经纬度坐标Eigen::Vector3d P_UTM;  // 该点相对于所选取原点的utm坐标P_LLA[0] = 30.9543508;P_LLA[1] = 121.4755984;P_LLA[2] = 17.0970000;wgs2utm.LLA2UTM_origin_1(P_LLA, P_UTM);cout << "P_UTM: (" <<  P_UTM[0] << ", " << P_UTM[1] << ", " << P_UTM[2] << ")" << endl;cout << "******************************" << endl;
}

gps转wgs转XY坐标系相关推荐

  1. Python使用proj将GPS经纬度数据转换为utm坐标系(真实的地理位置坐标系,以米为单位),然后可以进行轨迹显示

    1. 代码如下 from pyproj import Transformer import pyproj import json from matplotlib.pyplot import *if _ ...

  2. 根据点云及其对应的四元数与GPS计算出其相对坐标系的经纬坐标(matlab)

    目录 数据提取 数据处理(matlab) 实验数据 效果 根据点云及其对应的四元数与GPS计算出其相对初始坐标系的经纬坐标,首先提取出包含标志物的单帧点云及该帧点云对应的四元数与GPS,该实验主要是从 ...

  3. 高德地图 gps坐标偏移到火星坐标系

    我国国情原因,gps采集到的坐标放在高德,谷歌等地图上,是会影响到坐标的精度的,这个时候是需要进行一些坐标偏移的操作的.本文适用于高德地图的坐标偏移. public static double pi ...

  4. GPS、谷歌、百度坐标系互相转换

    WGS-84:是国际标准,GPS坐标(Google Earth使用.或者GPS模块) GCJ-02:中国坐标偏移标准,Google Map.高德.腾讯使用 BD-09:百度坐标偏移标准,Baidu M ...

  5. 基于Python的经纬度与xy坐标系相互转换

    代码是已经运行过的,可以直接输入参数使用 注意事项: 经纬度参数不可以写颠倒,否则会由于math.log参数不能为负数和0的原因报错 由于地球半径的不确定性,所以(x,y)与(lon, lat)相互转 ...

  6. python坐标表示_python经纬度转xy坐标系

    经纬度转换成xy坐标def millerToXY (lon, lat): """ :param lon: 经度 :param lat: 维度 :return: " ...

  7. WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换案例教程(附转换工具下载)

    在做基于百度地图.高德地图等电子地图做为地图服务的二次开发时,通常需要将具有WGS84等坐标的矢量数据(如行政区划.地名.河流.道路等GIS地理空间数据)添加到地图上面,然而,在线地图大多使用的是火星 ...

  8. 我国三大常用坐标系区别(北京54、西安80和WGS-84)(转)

    [size=medium]1.北京54坐标系(BJZ54) 北京54坐标系为参心大地坐标系,大地上的一点可用经度L54.纬度M54和大地高H54定位,它是以克拉索夫斯基椭球为基础,经局部平差后产生的坐 ...

  9. GPS从入门到放弃(三) --- GPS坐标系

    GPS从入门到放弃(三) - GPS坐标系 定位就需要坐标,坐标当然是相对坐标系而言的,我们描述一个物体的位置,首先就需要建立坐标系. 按大类来分,坐标系可以分为惯性坐标系和非惯性坐标系.惯性坐标系是 ...

最新文章

  1. javascript的Math对象和全局函数
  2. 如果科学家封神,会有什么称号?
  3. K8S集群安装KubeSphere失败记录
  4. TF-IDF 提取文本关键词
  5. vim编辑器操作汇总
  6. Flink 流批一体在阿里的落地
  7. 二级c语言2013年真题,2013年3月全国计算机二级c语言真题
  8. Java 简单爬虫 代码
  9. 学习Java技术Eclipse版本的选择
  10. python对txt文件处理_python 数据处理 对txt文件进行数据处理
  11. 2013年9月中秋云南昆明、丽江、泸沽湖、香格里拉、梅里雪山、虎跳峡之旅
  12. 浅谈区块链的格局审视和被遗忘的权利
  13. 2022 年杭电多校第八场补题记录
  14. 路径规划--地图分割
  15. SpringBoot 基于配置文件给bean赋值
  16. IT行业中的互联网领域和软件领域工作方向有什么区别?
  17. 作业上传+学生互评打分系统
  18. 逆向破解之160个CrackMe —— 021
  19. 如何评价一个新技术——以 ChatGPT 为例
  20. “电信级”运行多年,亚信科技推出核心交易数据库AntDB7.0

热门文章

  1. windows电脑触摸板 双指触摸 失效
  2. (整蛊)一段好玩的java代码
  3. 国瀚实业|上班族怎么选择理财产品
  4. c++惊现烫烫烫!!!
  5. 斐波那契数列系列算法最优复杂度-------O(logN)
  6. java发布WCS服务到GeoServer服务器并解析XML生成可下载的WCS服务数据url(2022.2.14)
  7. OpenCV中的数值计算功能(一)矩阵求逆(伪逆)
  8. 2.Makefile文件中包含哪些规则?
  9. 荣耀30什么时候升级鸿蒙,荣耀30手机4.0后什么时候开始才可以升级鸿蒙?
  10. 红米android版本怎么升级失败,MIUI 8如何进行升级? MIUI 8为什么升级失败?