NEMA格式 GPS数据提取解析 坐标转换等 源码.docx
- 文档编号:10654813
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:24
- 大小:20.02KB
NEMA格式 GPS数据提取解析 坐标转换等 源码.docx
《NEMA格式 GPS数据提取解析 坐标转换等 源码.docx》由会员分享,可在线阅读,更多相关《NEMA格式 GPS数据提取解析 坐标转换等 源码.docx(24页珍藏版)》请在冰豆网上搜索。
NEMA格式GPS数据提取解析坐标转换等源码
GPS数据提取解析源码GPSsourcedataextractionanalysis,wecanrefertolearnfrom
GPS数据解析
数据拆分\坐标转换\显示线路图\源代码
逐条读取gps数据然后进行拆分解析,坐标转换,绘制线路。
。
。
很好的示例多多交流学习。
。
本程序是基于VC++建立的单文档工程。
废话少说,直接上代码
//获取子字符串个数
intGetSubStrCount(CStringstr,charcFlag)
{
cFlag=',';
inti=0;
BOOLisHas=FALSE;
for(intiStart=-1;-1!
=(iStart=str.Find(cFlag,iStart+1));i++)
{
isHas=TRUE;
}
if(!
isHas)
{
return0;
}
else
{
returni+1;
}
}
//获取子字符串
//i序号0
CStringGetSubStr(CStringstr,inti,charcFlag)
{
cFlag=',';
intiStart=-1;
intiEnd=0;
intj=0;
intiStrCount;
iStrCount=GetSubStrCount(str,cFlag);
if(i>iStrCount-1||i<0)
{
str="";
returnstr;
}
else
{
//donothing
}
if(i==iStrCount-1)
{
i=iStrCount;
for(;j { iStart=str.Find(cFlag,iStart+1); } returnstr.Mid(iStart+1,str.GetLength()-iStart-1); } else { //donothing } for(;j { iStart=str.Find(cFlag,iStart+1); } iEnd=str.Find(cFlag,iStart+1); returnstr.Mid(iStart+1,iEnd-iStart-1); } //数据解析 CStringCGpsDataView: : Analyzing(CStringstr) { CStringsubStr[20]; charcFlag=','; intj=GetSubStrCount(str,cFlag);//得到该行的子字符串个数 CStdioFilewFile; wFile.Open("save.txt",CFile: : modeCreate|CFile: : modeWrite|CFile: : typeText);//将数据写入文件 for(inti=0;i { subStr[i]=GetSubStr(str,i,cFlag); } //GPGGA数据 if(subStr[0]=="$GPGGA") { CoordCovert(subStr[2],subStr[4]); //提取时间 subStr[1].Insert(2,': '); subStr[1].Insert(5,': '); subStr[1].Insert(0,"UTC时间: "); //提取纬度 if(subStr[3]=='N') { subStr[2].Insert(11,"分"); subStr[2].Insert(2,"度"); subStr[2].Insert(0,"北纬"); } elseif(subStr[3]=='S') { subStr[2].Insert(11,"分"); subStr[2].Insert(2,"度"); subStr[2].Insert(0,"南纬"); } //提取经度 if(subStr[5]=='E') { subStr[4].Insert(12,"分"); subStr[4].Insert(3,"度"); subStr[4].Insert(0,"东经"); } elseif(subStr[5]=='W') { subStr[4].Insert(12,"分"); subStr[4].Insert(3,"度"); subStr[4].Insert(0,"西经"); } //判断GPS状态 CStringGpsState; if(subStr[6]=='0') { GpsState="GPS状态: 无定位."; } elseif(subStr[6]=='1') { GpsState="GPS状态: 无差分校正定位."; } elseif(subStr[6]=='2') { GpsState="GPS状态: 差分校正定位."; } elseif(subStr[6]=='9') { GpsState="GPS状态: 用星历计算定位."; } //提取卫星数 subStr[7].Insert(0,"卫星数: "); //提取平面位置精度因子 subStr[8].Insert(0,"平面位置精度因子: "); //天线海拔高度 subStr[9].Insert(strlen(subStr[9]),subStr[10]); subStr[9].Insert(0,"天线海拔高度: "); //海平面分离度 subStr[11].Insert(strlen(subStr[11]),subStr[12]); subStr[11].Insert(0,"海平面分离度: "); subStr[0]+=subStr[1]; subStr[0]+=subStr[2]; subStr[0]+=subStr[4]; subStr[0]+=GpsState; subStr[0]+=subStr[7]; subStr[0]+=subStr[8]; subStr[0]+=subStr[9]; subStr[0]+=subStr[11]; //////////////////////////////////////MessageBox(subStr[0]); wFile.WriteString(subStr[0]);//将数据写入文件 } //GPZDA数据 elseif(subStr[0]=="$GPZDA") { //提取时间 subStr[1].Insert(2,': '); subStr[1].Insert(5,': '); subStr[1].Insert(0,"UTC时间: "); //提取日期 subStr[2].Insert(strlen(subStr[2]),"日"); subStr[2].Insert(0,"月"); subStr[2].Insert(0,subStr[3]); subStr[2].Insert(0,"年"); subStr[2].Insert(0,subStr[4]); subStr[2].Insert(0,''); //当地时域描述 subStr[5].Insert(strlen(subStr[5]),"小时"); if(strlen(subStr[6])>3) { subStr[6]=subStr[6].Left (2); } else { subStr[6]='0'; } subStr[6]+="分"; subStr[6].Insert(0,subStr[5]); subStr[6].Insert(0,"当地时域: "); subStr[0]+=subStr[1]; subStr[0]+=subStr[2]; subStr[0]+=subStr[6]; //////////////////////////////MessageBox(subStr[0]); wFile.WriteString(subStr[0]);//将数据写入文件 } //GPGSA数据 elseif(subStr[0]=="$GPGSA") { //卫星捕获模式,以及定位模式 CStringCatchLocation; if(subStr[1]=='M') { if(subStr[2]=='1') { CatchLocation="手动捕获卫星,未定位! "; } elseif(subStr[2]=='2') { CatchLocation="手动捕获卫星,2D定位! "; } elseif(subStr[2]=='3') { CatchLocation="手动捕获卫星,3D定位! "; } } elseif(subStr[1]=='A') { if(subStr[2]=='1') { CatchLocation="自动捕获卫星,未定位! "; } elseif(subStr[2]=='2') { CatchLocation="自动捕获卫星,2D定位! "; } elseif(subStr[2]=='3') { CatchLocation="自动捕获卫星,3D定位! "; } } //各卫星定位结果 subStr[3].Insert(0,"各卫星定位结果: "); subStr[3]+=''; subStr[4].Insert(0,subStr[3]); subStr[4]+=''; subStr[5].Insert(0,subStr[4]); subStr[5]+=''; subStr[6].Insert(0,subStr[5]); subStr[6]+=''; subStr[7].Insert(0,subStr[6]); subStr[7]+=''; subStr[8].Insert(0,subStr[7]); subStr[8]+=''; subStr[9].Insert(0,subStr[8]); subStr[9]+=''; subStr[10].Insert(0,subStr[9]); subStr[10]+=''; subStr[11].Insert(0,subStr[10]); subStr[11]+=''; subStr[12].Insert(0,subStr[11]); subStr[12]+=''; subStr[13].Insert(0,subStr[12]); subStr[13]+=''; subStr[14].Insert(0,subStr[13]); subStr[14]+=''; //空间(三维)位置精度因子 subStr[15].Insert(0,"空间(三维)位置精度因子: "); //平面位置精度因子 subStr[16].Insert(0,"平面位置精度因子: "); //高度位置精度因子 subStr[17]=subStr[17].Left(3); subStr[17].Insert(0,"高度位置精度因子: "); subStr[0]+=CatchLocation; subStr[0]+=subStr[14]; subStr[0]+=subStr[15]; subStr[0]+=subStr[16]; subStr[0]+=subStr[17]; /////////////////////////////MessageBox(subStr[0]); wFile.WriteString(subStr[0]);//将数据写入文件 } //GPGSV数据 elseif(subStr[0]=="$GPGSV") { ///////////////////////////MessageBox(subStr[0]); //卫星编号、卫星仰角(0~90度)、卫星方位角(0~359度)、信噪比 subStr[4].Insert(0,"卫星编号: "); subStr[5].Insert(0,"仰角: "); subStr[6].Insert(0,"方位角: "); subStr[7].Insert(0,"信噪比: "); subStr[4]+=subStr[5]; subStr[4]+=subStr[6]; subStr[4]+=subStr[7]; ///////////////////MessageBox(subStr[4]); subStr[8].Insert(0,"卫星编号: "); subStr[9].Insert(0,"仰角: "); subStr[10].Insert(0,"方位角: "); subStr[11].Insert(0,"信噪比: "); subStr[8]+=subStr[9]; subStr[8]+=subStr[10]; subStr[8]+=subStr[11]; ////////////////////////MessageBox(subStr[8]); subStr[12].Insert(0,"卫星编号: "); subStr[13].Insert(0,"仰角: "); subStr[14].Insert(0,"方位角: "); subStr[15].Insert(0,"信噪比: "); subStr[12]+=subStr[13]; subStr[12]+=subStr[14]; subStr[12]+=subStr[15]; /////////////////////MessageBox(subStr[12]); subStr[16].Insert(0,"卫星编号: "); subStr[17].Insert(0,"仰角: "); subStr[18].Insert(0,"方位角: "); if(strlen(subStr[19])>3) { subStr[19]=subStr[19].Left (2); } else { subStr[19]='0'; } subStr[19].Insert(0,"信噪比: "); subStr[16]+=subStr[17]; subStr[16]+=subStr[18]; subStr[16]+=subStr[19]; /////////////////////////////////MessageBox(subStr[16]); wFile.WriteString(subStr[16]);//将数据写入文件 } returnstr; } //读取文件数据并解析 voidCGpsDataView: : OnFileRead() { //TODO: 在此添加命令处理程序代码 CStdioFilemyFile; CStringoneLine; charcFlag=','; CStringsubStr[20]; //读取GPS数据文件 if(! myFile.Open(("gps.txt"),CFile: : modeRead|CFile: : typeText)) { AfxMessageBox(_T("打开文件错误! ")); return; } else { /*donothing*/ } while(myFile.ReadString(oneLine))//读一行 { //////////MessageBox(oneLine); intj=GetSubStrCount(oneLine,cFlag);//得到该行的子字符串个数 //校验 if(CheckNum(oneLine)) { ////////////MessageBox(_T("数据校验...接收正确! ...")); for(inti=0;i { subStr[i]=GetSubStr(oneLine,i,cFlag); //MessageBox(subStr[i]); } Analyzing(oneLine);//解析 } else { AfxMessageBox(_T("数据校验..接收错误! ...")); } } myFile.Close(); } //*********************************************************************************************** //坐标转换 //度分秒--弧度 doubleDms2Rad(doubleDms) { doubleDegree,Miniute; doubleSecond; intSign; doubleRad; if(Dms>=0) { Sign=1; } else { Sign=-1; } Dms=fabs(Dms);//绝对值 Degree=floor(Dms);//取度floor(2.800)=2.0000 Miniute=floor(fmod(Dms*100.0,100.0));//fmod计算余数 Second=fmod(Dms*10000.0,100.0); Rad=Sign*(Degree+Miniute/60.0+Second/3600.0)*PI/180.0; returnRad; } doubleRad2Dms(doubleRad) { doubleDegree,Miniute; doubleSecond; intSign; doubleDms; if(Rad>=0) { Sign=1; } else { Sign=-1; } Rad=fabs(Rad*180.0/PI); Degree=floor(Rad); Miniute=floor(fmod(Rad*60.0,60.0)); Second=fmod(Rad*3600.0,60.0); Dms=Sign*(Degree+Miniute/100.0+Second/10000.0); returnDms; } //正算公式 boolGpsPoint: : BL2xy() { //大地测量学基础(吕志平乔书波北京: 测绘出版社2010.03) doubleX;//由赤道至纬度为B的子午线弧长(P1065-41) doubleN;//椭球的卯酉圈曲率半径 doublet; doublet2; doublem; doublem2; doubleng2; doublecosB; doublesinB; X=A1*B*180.0/PI+A2*sin(2*B) +A3*sin(4*B)+A4*sin(6*B); sinB=sin(B); cosB=cos(B); t=tan(B); t2=t*t; N=a/sqrt(1-e2*sinB*sinB); m=cosB*(L-L0); m2=m*m; ng2=cosB*cosB*e2/(1-e2); //P156(6-63公式) x=X+N*t*((0.5+((5-t2+9*ng2+4*ng2*ng2) /24.0+(61-58*t2+t2*t2)*m2/720.0)*m2)*m2); y=N*m*(1+m2*((1-t2+ng2)/6.0+m2*(5-18*t2+t2*t2 +14*ng2-58*ng2*t2)/120.0)); //y+=500000; returntrue; } //反算公式 boolGpsPoint: : xy2BL() { doublesinB; doublecosB; doublet; doublet2; doubleN;//椭球的卯酉圈曲率半径 doubleng2; doubleV; doubleyN; doublepreB0; doubleB0; doubleeta; //y-=500000; B0=x/A1; do { preB0=B0; B0=B0*PI/180.0; B0=(x-(A2*sin(2*B0)+A3*si
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NEMA格式 GPS数据提取解析 坐标转换等 源码 NEMA 格式 GPS 数据 提取 解析 坐标 转换
![提示](https://static.bdocx.com/images/bang_tan.gif)