⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps_parsor.cpp

📁 一个基本的类 用于提取GPS数据中的经纬度
💻 CPP
字号:
#include "StdAfx.h"
#include "stdlib.h"
#include "string.h"
#include "GPS_Parsor.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


GPS_Parsor::GPS_Parsor()
{
	longitude_=0;
	latitude_=0;
	height_=0;
	velocity_=0;
}

GPS_Parsor::~GPS_Parsor()
{

}

int GPS_Parsor::parse(const char* dat)
{
	/*char v=new char[5];//char v[5];//临时存放速度
	char n=new char[9];//char n[9];//临时存放纬度
	char e=new char[9];//char e[9];//临时存放经度
	char m=new char[5];//char m[5];//临时存放高度*/

	//**************************************
	//方法一. 考虑太繁琐。
	//***************************************
/*	char v[5];
	char n[9];
	char e[9];
	char m[5];
	CString strline;
	//结束位如何设,又不存在文件,只是一帧数据
	if(*dat=='$')
	{
		dat++;
		if(*dat=='G')
		{
			dat++;
			if(*dat=='P')
			{
				dat++;
                if(*dat=='R')
				{
					dat++;
					if(*dat=='M')
					{
						dat++;
						if(*dat=='C')
						{
							dat++;
							if(*dat==',')
							{
								for(int i=0,p=0;i<39;i++)
								{
									dat++;
									if(*dat==',') p++;
										if(p==6)
										{
											dat++;break;
										}
								}
								//速度
								for(int ii=0;ii<5;ii++)
								{
									v[ii]=*dat;
									dat++;
									if(*dat==',') break;
								}
								//如何转化赋值,这样转是否正确。
								CString s1=v;
								velocity_=atof(s1);
							}
						}
					}
					
				}
				else if(*dat=='G')
				{
					dat++;
					if(*dat=='G')
					{
						dat++;
						if(*dat=='A')
						{
							dat++;
							if(*dat==',')
							{
								for(int i=0;i<12;i++)
								{
									dat++;
									if(*dat==',')
									{
									dat++;break;
									}
								}
								//纬度
								for(int j=0;j<9;j++)
								{
									n[j]=*dat;
									dat++;
								}
								//如何转化赋值  //数据位丢失
								CString s2=n;
							    longitude_ = atof(s2);
								

								dat+=3;
								
								//经度
								for(int l=0;l<10;l++)
								{
									e[l]=*dat;
									dat++;
								}
								//如何转换
								CString s3=e;
								 latitude_=atof(s3);
                                
								//q存放逗号个数
								for(int p=0,q=0;p<12;p++)
								{
									
									dat++;
									if(*dat==',') q++;
										if(q==5)
										{
											dat++;break;
										}

								}
								if(*dat==',')dat++;
				               
								//高度
								for(int jj=0;jj<5;jj++)
								{
									m[jj]=*dat;
									dat++;
								}
								//如何转换

								CString s4=m;
								height_=atof(s4);

							}
						}
					}
				}
			}

		}
	}
	return 0;*/
  //****************************************8
  //方法二.考虑用CString的函数
  //*****************************************
	//分别作为速度纬度经度高度的临时存放
	/*char v[5];
	char n[9];
	char e[9];
	char m[5];*/

	// 存数据,把数据给字符串
	CString str(dat);

	//调用Find()函数找到第一个逗号时的索引
	int index=str.Find(',');
	if(index!=-1)
	{
		return -1;
	}
//	if(index!=-1)
//	{	
		//数据处理标志位 ,这有$GPGGA 和$GPRMC两种情况
		CString  label=str.Left(index);
		//提取经纬度 高度信息
		if(label==_T("$GPGGA"))
		{
			//纬度标志位,第三个逗号 ,w往前处理纬度,往后处理经度
			int index3=str.Find(_T(",N,"),index);

			CString n=str.Mid(index3-9,9);
			longitude_ = atof(n);
          
			//第三个标志
			//int index3=str.Find(",N,",index2);
			CString e=str.Mid(index3+3,10);
			latitude_=atof(e);

			//第四个标志,这要考究一下,有些数据并没有五位
			int index4=str.Find(_T(",M,"),index3);
			if(str.Mid(index4-3,1)==_T(","))
			{
				CString m=str.Mid(index4-3,3);
				height_=atof(m);
			}
			else if(str.Mid(index4-4,1)==_T(","))
			{
				CString m=str.Mid(index4-4,4);
				height_=atof(m);
			}
			else if(str.Mid(index4-5,1)==_T(","))
			{
				CString m=str.Mid(index4-5,5);
				height_=atof(m);
			}

		}
		//提取速度信息
		else if(label==_T("$GPRMC"))
		{

			int index2=str.Find(_T(",E,"),index);
            //速度*.**4位
			if(str.Mid(index2+7,1)==_T(","))
			{
				CString v=str.Mid(index2+3,4);
				velocity_=atof(v);
			}
			//速度**.**5位
			else if(str.Mid(index2+8,1)==_T(","))
			{
				CString v=str.Mid(index2+3,5);
				velocity_=atof(v);
			}	
		}

//	}

	return 0;
}

double GPS_Parsor::latitude()
{
	return latitude_;
}

double GPS_Parsor::height()
{
	return height_;
}

double GPS_Parsor::velocity()
{
	return velocity_;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -