C++ 解析GPS数据示例

C++ 解析GPS数据示例:  
GPS数据类型示例:  
$GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,0000*5D 
$GPRMC,025620.20,A,2602.33722,N,11911.49176,E,0.100,,281211,,,D*79  
$GPGGA,025620.20,2602.33722,N,11911.49176,E,2,04,1.63,13.3,M,9.9,M,,0000*5A 
$GPRMC,025620.40,A,2602.33723,N,11911.49174,E,0.098,,281211,,,D*7C   

//示例程序  VS 测试通过  

/*  功能 C++解析GPS数据并显示  时间 2016-04-22*/  
#include<fstream> 
#include<string> 
#include<iostream> 
#include<vector> 
#include<sstream> 
using namespace std; 

//数据类型转换模板函数 
template <class Type>    
Type stringToNum(const string str)   
{        
	istringstream iss(str);       
	Type num;       
	iss >> num;       
	return num;       
}  

int main() 
{  
	ifstream is("D:/gpstest.txt");  
	string line;  
	getline(is,line);    
	//读取第一行 GGA格式  $GPGGA,025620.00,2602.33721,N,11911.49176,E,2,04,1.63,13.5,M,9.9,M,,0000*5D
	
	//GGA字段含义   语句ID,UTC时间,纬度,N/S,经度,E/W,GPS状态,卫星数量,精度因子,海拔 。。。   
	vector<string> arr1;  //定义一个字符串容器  
	int position = 0;  
	do 
	{   
		string tmp_s;    position = line.find(","); //找到逗号的位置   
		tmp_s = line.substr(0,position); //截取需要的字符串    
		line.erase(0,position+1); //将已读取的数据删去     
		arr1.push_back(tmp_s);   //将字符串压入容器中  
	}while(position != -1); 
	
	position = 0;  
	getline(is,line);   
	
	//读取第二行 RMC格式  $GPRMC,025620.20,A,2602.33722,N,11911.49176,E,0.100,,281211,,,D*79  
	//RMC字段含义  语句ID,UTC时间,GPS状态,纬度,N/S,经度,E/W,速度(节),,UTC日期,,,校验值   
	vector<string> arr2;   
	do 
	{   
		string tmp_s;    
		position = line.find(",");   
		tmp_s = line.substr(0,position);   
		line.erase(0,position+1);    
		arr2.push_back(tmp_s);   
	}while(position != -1);  
	is.close();   
	//构造日期时间字符串 YYYY-MM-DD HH:MM:SS   
	string datetime = "20"+arr2[9].substr(4,2)+"-"+arr2[9].substr(2,2)+"-"+arr2[9].substr(0,2)+" "+arr1[1].substr(0,2)+
		":"+arr1[1].substr(2,2)+":"+arr1[1].substr(4,2);   
	cout<<"UTC时间:"<<datetime<<endl;
	double d0 = stringToNum<double>(arr1[2]);  
	cout<<"经度:";  
	printf("%lf\n",d0/100);   
	//此处不能使用cout,否则输出精度将受到影响  
	double d1 = stringToNum<double>(arr1[4]);  
	cout<<"纬度:";  
	printf("%lf\n",d1/100);   
	cout<<"海拔:"<<arr1[9]<<arr1[10]<<endl;  
	return 0; 
}    

/*     运行结果      
UTC时间:2011-12-28 02:56:20     
经度:26.023372     
纬度:119.114918     
海拔:13.5M        
*/

以下是一个简单的C++程序示例,用于读取GPS模块的NMEA数据解析出位置信息: ```c++ #include <iostream> #include <string> #include <cstring> #include <sstream> #include <vector> using namespace std; // NMEA消息类型枚举 enum class NmeaMessageType { Unknown, GGA, GSA, GSV, RMC, VTG }; // NMEA消息结构体 struct NmeaMessage { NmeaMessageType type; vector<string> fields; }; // 解析NMEA消息 NmeaMessage parse_nmea_message(const string& message) { NmeaMessage nmea_message; // 判断消息类型 if (message.find("$GPGGA") == 0) { nmea_message.type = NmeaMessageType::GGA; } else if (message.find("$GPGSA") == 0) { nmea_message.type = NmeaMessageType::GSA; } else if (message.find("$GPGSV") == 0) { nmea_message.type = NmeaMessageType::GSV; } else if (message.find("$GPRMC") == 0) { nmea_message.type = NmeaMessageType::RMC; } else if (message.find("$GPVTG") == 0) { nmea_message.type = NmeaMessageType::VTG; } else { nmea_message.type = NmeaMessageType::Unknown; } // 切割消息字段 stringstream ss(message); string field; while (getline(ss, field, ',')) { nmea_message.fields.push_back(field); } return nmea_message; } // 解析GGA消息 void parse_gga_message(const NmeaMessage& message, double& latitude, double& longitude) { if (message.type != NmeaMessageType::GGA) { return; } // 解析纬度和经度 latitude = stod(message.fields[2].substr(0, 2)) + stod(message.fields[2].substr(2)) / 60.0; if (message.fields[3] == "S") { latitude = -latitude; } longitude = stod(message.fields[4].substr(0, 3)) + stod(message.fields[4].substr(3)) / 60.0; if (message.fields[5] == "W") { longitude = -longitude; } } int main() { // 假设GPS模块通过串口连接到计算机,这里使用串口通信库进行读取 // ... // 读取NMEA消息 string message = "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47"; NmeaMessage nmea_message = parse_nmea_message(message); // 解析位置信息 double latitude, longitude; parse_gga_message(nmea_message, latitude, longitude); cout << "Latitude: " << latitude << endl; cout << "Longitude: " << longitude << endl; return 0; } ``` 请注意,这只是一个简单的示例,实际应用中可能需要更复杂的解析算法和错误处理机制。同时,还需要根据实际情况调整串口通信库的使用方式。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值