精华内容
下载资源
问答
  • gps源代码,主要用于gps的数据的分析、gps数据解析gps数据解析
  • GPS数据解析 数据拆分 坐标转换 显示线路图 源代码 逐条读取gps数据 然后进行拆分 解析,坐标转换,绘制线路。。。很好的示例 多多交流学习。。
  • NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$...本代码提供数据解析方法,语句格式详解见 https://blog.csdn.net/u012572552/article/details/84587926
  • GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn from ...GPS数据解析 数据拆分 \坐标转换 \显示线路图\源代码 逐条读取gps数据 然后进行拆分 解析,坐标转

     

    GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn from
    
    
    GPS数据解析 
    
    数据拆分 \坐标转换 \显示线路图\源代码
    
    逐条读取gps数据 然后进行拆分 解析,坐标转换,绘制线路。。。很好的示例多多交流学习。。
    
     
    
     本程序是基于VC++ 建立的单文档工程。
    
     
    
    废话少说,直接上代码
    
     
    
    //获取子字符串个数
    
    int GetSubStrCount(CString str,char cFlag)
    
    {
    
           cFlag = ',';
    
           int i = 0;
    
           BOOL isHas = FALSE;
    
     
    
           for (int iStart = -1; -1 != (iStart = str.Find(cFlag,iStart+1)) ; i++)
    
           {
    
                  isHas = TRUE;
    
           }
    
           
    
           if (!isHas)
    
           {
    
                  return 0;
    
           }
    
           else
    
           {
    
                  return i+1;
    
           }
    
    }
    
     
    
    //获取子字符串
    
    // i 序号 0
    
    CString GetSubStr(CString str,int i,char cFlag)
    
    {
    
           cFlag = ',';
    
           int iStart = -1;
    
           int iEnd = 0;
    
           int j = 0;
    
           int iStrCount;
    
     
    
           iStrCount = GetSubStrCount(str,cFlag);
    
     
    
           if (i>iStrCount -1 || i<0)
    
           {
    
                  str = "";
    
                  return str;
    
           }
    
           else
    
           {
    
                  //do nothing
    
           }
    
     
    
           if (i == iStrCount-1)
    
           {
    
                  i = iStrCount;
    
     
    
                  for (;j<i-1;j++)
    
                  {
    
                         iStart = str.Find(cFlag , iStart+1);
    
                  }
    
     
    
                  return   str.Mid(iStart+1 , str.GetLength()-iStart-1); 
    
           }
    
           else
    
           {
    
                  //do nothing
    
           }
    
     
    
           for (; j<i; j++)
    
           {
    
                  iStart = str.Find(cFlag , iStart+1);
    
           }
    
     
    
           iEnd = str.Find(cFlag , iStart+1);  
    
           return str.Mid(iStart+1 , iEnd-iStart-1); 
    
    }
    
     
    
    //数据解析
    
    CString CGpsDataView::Analyzing(CString str)
    
    {
    
           CString subStr[20];
    
           char cFlag = ',';
    
           int j = GetSubStrCount(str,cFlag);          //得到该行的子字符串个数
    
           CStdioFile wFile;
    
           wFile.Open("save.txt",CFile::modeCreate | CFile::modeWrite | CFile::typeText);//将数据写入文件
    
     
    
           for (int i=0;i<j;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,"  北纬");
    
                  }
    
                  else if (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,"  东经");
    
                  }
    
                  else if (subStr[5] == 'W')
    
                  {
    
                         subStr[4].Insert(12,"分");
    
                         subStr[4].Insert(3,"度");
    
                         subStr[4].Insert(0,"  西经");
    
                  }
    
                  
    
                  //判断GPS状态
    
                  CString GpsState;
    
     
    
                  if (subStr[6] == '0')
    
                  {
    
                         GpsState = "  GPS状态:无定位.";
    
                  }
    
                  else if (subStr[6] == '1')
    
                  {
    
                         GpsState = "  GPS状态:无差分校正定位.";
    
                  }
    
                  else if (subStr[6] == '2')
    
                  {
    
                         GpsState = "  GPS状态:差分校正定位.";
    
                  }
    
                  else if (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数据
    
           else if (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数据
    
           else if (subStr[0] == "$GPGSA")
    
           {
    
                  //卫星捕获模式,以及定位模式
    
                  CString CatchLocation;
    
     
    
                  if (subStr[1] == 'M')
    
                  {
    
                         if (subStr[2] == '1')
    
                         {
    
                                CatchLocation = " 手动捕获卫星,未定位!";
    
                         }
    
                         else if (subStr[2] == '2')
    
                         {
    
                                CatchLocation = "  手动捕获卫星,2D定位!";
    
                         }
    
                         else if (subStr[2] == '3')
    
                         {
    
                                CatchLocation = "  手动捕获卫星,3D定位!";
    
                         }
    
                  }
    
                  else if (subStr[1] == 'A')
    
                  {
    
                         if (subStr[2] == '1')
    
                         {
    
                                CatchLocation ="  自动捕获卫星,未定位!";
    
                         }
    
                         else if (subStr[2] == '2')
    
                         {
    
                                CatchLocation ="  自动捕获卫星,2D定位!";
    
                         }
    
                         else if (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数据
    
           else if (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]);//将数据写入文件
    
           }
    
           return str;
    
    }
    
     
    
     
    
    //读取文件数据并解析
    
    void CGpsDataView::OnFileRead()
    
    {
    
           // TODO: 在此添加命令处理程序代码 
    
           CStdioFile myFile;
    
           CString oneLine;     
    
           char cFlag = ',';
    
           CString subStr[20];
    
           
    
           //读取GPS数据文件
    
           if(!myFile.Open(("gps.txt"),CFile::modeRead | CFile::typeText))
    
           {
    
                  AfxMessageBox(_T("打开文件错误!"));
    
                  return;
    
           }
    
           else
    
           {
    
                  /*do nothing*/
    
           }
    
     
    
           while (myFile.ReadString(oneLine))//读一行
    
           {             
    
                  //MessageBox(oneLine);
    
                  int j = GetSubStrCount(oneLine,cFlag);         //得到该行的子字符串个数
    
                  
    
                  //校验
    
                  if(CheckNum(oneLine))
    
                  {
    
                         MessageBox(_T("数据校验...接收正确!..."));
    
     
    
                         for (int i=0;i<j;i++)
    
                         {
    
                                subStr[i] = GetSubStr(oneLine,i,cFlag);
    
                                //MessageBox(subStr[i]);                           
    
                         }
    
     
    
                         Analyzing(oneLine);        //解析
    
                  }
    
                  else
    
                  {
    
                         AfxMessageBox(_T("数据校验..接收错误!..."));
    
                  }
    
           }
    
     
    
           myFile.Close();
    
    }
    
     
    
    //***********************************************************************************************
    
    //坐标转换
    
     
    
    //度分秒--弧度
    
    double Dms2Rad(double Dms) 
    
    { 
    
           double Degree, Miniute; 
    
           double Second; 
    
           int   Sign; 
    
           double Rad; 
    
     
    
           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; 
    
           return Rad; 
    
    }
    
     
    
    double Rad2Dms(double Rad)
    
    {
    
           double Degree, Miniute; 
    
           double Second; 
    
           int   Sign; 
    
           double Dms;
    
     
    
           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); 
    
           return  Dms; 
    
    }
    
     
    
    //正算公式
    
    bool   GpsPoint::BL2xy() 
    
    { 
    
           //大地测量学基础 (吕志平 乔书波 北京:测绘出版社 2010.03)
    
     
    
           double X; //由赤道至纬度为B的子午线弧长   (P106   5-41)
    
           double N; //椭球的卯酉圈曲率半径
    
           double t;
    
           double t2;
    
           double m;
    
           double m2;
    
           double ng2;
    
           double cosB;
    
           double sinB;   
    
           
    
           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; 
    
     
    
           return   true; 
    
    } 
    
     
    
    //反算公式
    
    bool   GpsPoint::xy2BL() 
    
    { 
    
           double sinB; 
    
           double cosB;
    
           double t;
    
           double t2;
    
           double N; //椭球的卯酉圈曲率半径
    
           double ng2;
    
           double V;
    
           double yN;
    
           double preB0;
    
           double B0;
    
           double eta;            
    
           //y   -=  500000; 
    
           B0   = x / A1; 
    
     
    
           do 
    
           { 
    
                  preB0 =  B0; 
    
                  B0   = B0 * PI / 180.0; 
    
                  B0   = (x - (A2 * sin(2 * B0) + A3 * sin(4 * B0) + A4 * sin(6 * B0))) / A1;
    
                  eta   = fabs(B0 - preB0); 
    
           }while(eta > 0.000000001); 
    
     
    
           B0  = B0 * PI / 180.0; 
    
           B   = Rad2Dms(B0); 
    
           sinB = sin(B0); 
    
           cosB = cos(B0); 
    
           t   =  tan(B0); 
    
           t2   = t * t; 
    
           N   = a / sqrt(1 - e2 * sinB * sinB); 
    
           ng2   = cosB * cosB * e2 / (1 - e2); 
    
           V   =   sqrt(1 + ng2); 
    
           yN   = y / N; 
    
     
    
           B   = B0 - (yN * yN - (5 + 3 * t2 + ng2 - 9 * ng2 * t2) * yN * yN * yN * yN
    
                         / 12.0 + (61 + 90 * t2 + 45 * t2 * t2) * yN * yN * yN * yN * yN * yN / 360.0)
    
                         * V * V * t / 2; 
    
     
    
           L   = L0 + (yN - (1 + 2 * t2 + ng2) * yN * yN * yN / 6.0 + (5 + 28 * t2 + 24
    
                         * t2 * t2 + 6 * ng2 + 8 * ng2 * t2) * yN * yN * yN * yN * yN / 120.0) / cosB;
    
           return   true; 
    
    } 
    
     
    
    //设置中央子午线
    
    bool   GpsPoint::SetL0(double dL0) 
    
    { 
    
           L0   =   Dms2Rad(dL0); 
    
           return   true; 
    
    } 
    
     
    
    //将度分秒经纬度转换为弧度后再转换为平面坐标
    
    bool   GpsPoint::SetBL(double dB, double dL) 
    
    { 
    
           B   =   Dms2Rad(dB); 
    
           L   =   Dms2Rad(dL);  
    
           BL2xy(); 
    
           return   true; 
    
    } 
    
     
    
    bool   GpsPoint::GetBL(double *dB, double *dL) 
    
    { 
    
           *dB   =   Rad2Dms(B); 
    
           *dL   =   Rad2Dms(L); 
    
           return   true; 
    
    } 
    
     
    
    //将平面坐标转换为(弧度)经纬度
    
    bool   GpsPoint::Setxy(double dx, double dy) 
    
    { 
    
           x   =   dx; 
    
           y   =   dy; 
    
           xy2BL(); 
    
           return   true; 
    
    } 
    
     
    
    bool   GpsPoint::Getxy(double *dx, double *dy) 
    
    { 
    
           *dx   =   x; 
    
           *dy   =   y; 
    
           return   true; 
    
    } 
    
     
    
    GpsPoint_Krasovsky::GpsPoint_Krasovsky() 
    
    { 
    
           a   =   6378245;                                                   //长半径
    
           f   =   298.3;                                                               //扁率的倒数 (扁率:(a-b)/a)    
    
           e2   =   1 - ((f - 1) / f) * ((f - 1) / f);        //第一偏心率的平方
    
           e12   =   (f / (f - 1)) * (f / (f - 1)) - 1;       //第二偏心率的平方
    
           
    
           // 克拉索夫斯基椭球
    
           A1   =   111134.8611;                                           
    
           A2   =   -16036.4803; 
    
           A3   =   16.8281; 
    
           A4   =   -0.0220; 
    
    }
    
     
    
    //*************坐标转换
    
    bool CGpsDataView::CoordCovert(CString latitude, CString longitude)
    
    {
    
           double bbb = atof(latitude);
    
           double lll = atof(longitude);
    
     
    
           //度分格式转换为度分秒格式
    
           bbb = Dm2Dms(bbb);
    
           lll = Dm2Dms(lll);
    
     
    
           double   MyL0 ;   //中央子午线 
    
           double   MyB   =   bbb ;    //33 d 44 m 55.6666 s 
    
           double   MyL   =   lll ;  //3度带,109 d 22 m 33.4444 s 
    
     
    
           //计算当地中央子午线 ,3度带
    
           MyL0 = fabs(MyL);
    
           MyL0 = floor(MyL);
    
           MyL0 = 3 * floor(MyL0 / 3 );
    
     
    
           GpsPoint_Krasovsky  MyPrj; 
    
           MyPrj.SetL0(MyL0); 
    
           MyPrj.SetBL(MyB,   MyL);                
    
           double   OutMyX;                
    
           double   OutMyY; 
    
           OutMyX   =   MyPrj.x;           //正算结果:坐标x 
    
           OutMyY   =   MyPrj.y;           //结果:坐标y 
    
     
    
           CString strTemp1;
    
           CString strTemp2;
    
           CString strTemp3;
    
           CString strTemp4;
    
     
    
           strTemp1.Format("%f",OutMyX);    
    
           strTemp2.Format("%f",OutMyY);
    
           strTemp1.Insert(0,"x = ");
    
           strTemp2.Insert(0," , y = ");
    
           strTemp2.Insert(0,strTemp1);
    
           strTemp2.Insert(0," 坐标转换: ");
    
     
    
           strTemp3.Format("%f12",MyB);
    
           strTemp4.Format("%f12",MyL);
    
           strTemp3.Insert(0,"B = ");
    
           strTemp4.Insert(0,"  L = ");
    
           strTemp4.Insert(0,strTemp3);
    
           strTemp2.Insert(0,strTemp4);
    
           //MessageBox(strTemp2);
    
     
    
           DrawPoint(MyPrj.x,MyPrj.y);
    
     
    
           return true;
    
    }
    
     
    
    //==================================
    
    //度分格式转换为度分秒格式
    
    double CGpsDataView::Dm2Dms(double Dm)
    
    {
    
           double Dms;
    
           double temp;  
    
           temp = Dm - floor(Dm); 
    
           temp = (temp * 60) / 100;    
    
           Dm   =  floor(Dm);
    
           Dm   += temp;     
    
           Dm   =  Dm /100;       
    
           Dms  = Dm;
    
           return Dms;
    
    }
    
     
    
     
    
     
    
     
    
    //*************绘制线路  显示出路线
    
    int count1=0;
    
    bool bFirst = true;
    
    double xTemp;
    
    double yTemp;
    
    void CGpsDataView::DrawPoint(double X, double Y)
    
    {      
    
           Sleep(100);
    
     
    
           //X = (X - floor(X))*100;
    
           //Y = (Y - floor(Y))*100;
    
     
    
           if (bFirst) 
    
           {
    
                  xTemp=X;
    
                  yTemp=Y;
    
                  bFirst=false;
    
           }
    
     
    
           CDC *pDC=GetDC();
    
           CPen pen(PS_SOLID,3,RGB(255,20,20));
    
           CPen *pOldPen;
    
           CBrush *pOldBrush;
    
           CBrush *pBrush=CBrush::FromHandle( (HBRUSH)GetStockObject(NULL_BRUSH) );
    
     
    
           pOldPen=pDC->SelectObject(&pen);
    
           pOldBrush=pDC->SelectObject(pBrush);
    
     
    
           int a=(int)(100.0-(X-xTemp)*800.0);
    
           int b=(int)(100.0+(Y-yTemp)*800.0);
    
     
    
           //绘制点显示路径
    
           pDC->Ellipse(a,b,a+5,b+5);
    
     
    
           //计数
    
           count1=count1+1;
    
           pDC->SelectObject( pOldBrush );
    
           pDC->SelectObject( pOldPen );
    
     
    
           CString str;
    
           str.Format("%.1f,%.1f,%d,%d,%d",X-xTemp,Y-yTemp,a,b,count1);
    
           pDC->TextOut(10,10,str);
    
    }
    

    展开全文
  • GPS数据格式解析代码举例

    千次阅读 2018-03-10 12:27:10
    本文转自:http://norke.blog.163.com/blog/static/2765720820116185028104/GPS数据格式解析代码举例 随着内置GPS的手机越来越多,GPS相关的应用也越来越广泛,GPS已经不仅仅只是得到一个经纬度的信息,可以通过...

    本文转自:http://norke.blog.163.com/blog/static/2765720820116185028104/


    GPS数据格式解析源代码举例

     

    随着内置GPS的手机越来越多,GPS相关的应用也越来越广泛,GPS已经不仅仅只是得到一个经纬度的信息,可以通过GPS开发出更多的应用,比如位置图片,比如好友位置显示,比如跟踪等等,TimeSyncPPC就是可以使用GPS的时钟来进行时间同步的。
        
        所有这些功能都需要知道GPS的数据格式并能够解析出自己需要的数据出来。下面就以TimeSyncPPC中如何得到GPS的日期和时间为例来说明如何解析GPS数据。
        
        TimeSyncPPC是用于Pocket PC上的时间同步工具,因此得到GPS的时间和日期,使用的GPS的指令是$GPRMC,其指令格式如下:
        
        $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11> 

          1) 标准定位时间(UTC time)格式:时时分分秒秒.秒秒秒(hhmmss.sss)。 
          2) 定位状态,A = 数据可用,V = 数据不可用。 
          3) 纬度,格式:度度分分.分分分分(ddmm.mmmm)。 
          4) 纬度区分,北半球(N)或南半球(S)。 
          5) 经度,格式:度度分分.分分分分。
          6) 经度区分,东(E)半球或西(W)半球。 
          7) 相对位移速度, 0.0 至 1851.8 knots 
          8) 相对位移方向,000.0 至 359.9度。实际值。 
          9) 日期,格式:日日月月年年(ddmmyy)。 
          10) 磁极变量,000.0 至180.0。 
          11) 度数。 
          12) Checksum.(检查位) 

        从数据格式中可以看出,我们需要得到1和9两个字段的数据即可。
        
        当然,使用GPS首先要打开GPS的串口,代码如下:  
    HANDLE OpenCom(CString strCom, DWORD BaudRate, BYTE ByteSize, BYTE StopBits, BYTE Parity, int FlowControl)
    {
        HANDLE  hCommPort;

        CString strTemp;

        if((hCommPort = CreateFile(strCom, GENERIC_READ | GENERIC_WRITE, 0,
                            NULL, OPEN_EXISTING, 0, 0)) == INVALID_HANDLE_VALUE)
        {
            return NULL;
        }
        
        DCB          commDCB;
        CString      strWinText;

        GetCommState(hCommPort, &commDCB);

        commDCB.BaudRate    = BaudRate;
        commDCB.ByteSize    = ByteSize;
        commDCB.StopBits    = StopBits;
        commDCB.fParity        = (NOPARITY == Parity) ? FALSE : TRUE;
        commDCB.Parity        = Parity;

        commDCB.fDsrSensitivity = FALSE;
        commDCB.fDtrControl     = DTR_CONTROL_ENABLE;

        if(FlowControl == 1)    // Hardware
        {
            // Enable RTS/CTS Flow Control
            commDCB.fRtsControl = RTS_CONTROL_HANDSHAKE;
            commDCB.fOutxCtsFlow = 1;
            commDCB.fOutX = 0;
            commDCB.fInX = 0;
        }
        else if(FlowControl == 0)    // Software
        {
            // Enable XON/XOFF Flow Control
            commDCB.fRtsControl = RTS_CONTROL_ENABLE;
            commDCB.fOutxCtsFlow = 0;
            commDCB.fOutX = 1;
            commDCB.fInX  = 1;  
        }
        else
        {
            commDCB.fRtsControl = RTS_CONTROL_ENABLE;
            commDCB.fOutxCtsFlow = 0;
            commDCB.fOutX = 0;
            commDCB.fInX  = 0;
        }

        SetCommState(hCommPort, &commDCB);

        return hCommPort;
    }    

        串口打开后需要得到一行GPS数据,GPS数据是以结束,代码如下:
    // 返回值为-1:超时,其他值为数据长度
    int GetGPSLineData(HANDLE hCommPort, char *ReadBuf, int Length)
    {
        // 读一行GPS数据
        DWORD nBytes;
        int i = 0;
        DWORD TimeOut = 0;
        while(i < Length)
        {
            if(g_isQuit)
                return i;

            TimeOut ++;
            if(TimeOut >= 100)
                return -1;

            ReadFile(hCommPort, (LPVOID)&ReadBuf[i], 1, &nBytes, NULL);
            if(nBytes == 0)
            {
                Sleep(1);
                continue;
            }

            TimeOut = 0;

            if(ReadBuf[i] == 0x0d)
            {
                ReadBuf[i] = 0;
                break;
            }
            if(ReadBuf[i] == 0x0a)
            {
                continue;
            }

            i ++;
        }

        return i;
    }    

        下面是解析一行GPS数据,将数据结果存储在一个数组中,代码如下:
    // 解析一行GPS数据
    int AnalyzeGPSData(char *GPSData, int Length, char Command[][100])
    {
        int i = 0;
        int j = 0, k = 0;
        while(i < Length)
        {
            if(GPSData[i] == ',')
            {
                Command[j][k] = 0;
                j ++;
                k = 0;
                i ++;
                continue;
            }
            Command[j][k] = GPSData[i];
            k ++;
            i ++;
        }

        return j;
    }
    解析之后的GPS数据包含命令和参数,下面就是判断是否是我们需要的命令,如果是得到第一个和第九个参数即可。不过要注意,GPS时间是世界标准时间,因此要转换成本地时间,代码如下:
    DWORD WINAPI GetGPSTime(LPVOID lpParameter)
    {
        char ReadBuf[1000];
        DWORD TimeOut = 0;
        
        char Command[40][100];

        HANDLE hCommPort = OpenCom(g_strComPort, g_BaudRate);
        if(hCommPort == NULL)
        {
            MessageBox(NULL, _T("Can not open COM port!"), NULL, MB_OK | MB_TOPMOST);
            goto GPSExit;
        }

        while(1)
        {    
            if(g_isQuit)
                break;

            // 读一行GPS数据
            int Length = GetGPSLineData(hCommPort, ReadBuf, 999);
            if(Length == -1)
            {
                TimeOut ++;
                if(TimeOut < 100)
                    continue;
            }

            if(TimeOut >= 100)
            {
                MessageBox(NULL, _T("Read GPS data timeout!"), NULL, MB_OK | MB_TOPMOST);
                goto GPSExit;
            }
            TimeOut = 0;

            AnalyzeGPSData(ReadBuf, Length, Command);
            
            if(strcmp(Command[0], "$GPRMC") == 0)
            {
                SYSTEMTIME st, LocalSt;

                st.wHour = (Command[1][0] - '0') * 10 + (Command[1][1] - '0');
                st.wMinute = (Command[1][2] - '0') * 10 + (Command[1][3] - '0');
                st.wSecond = (Command[1][4] - '0') * 10 + (Command[1][5] - '0');
                st.wMilliseconds = (Command[1][7] - '0') * 100 + (Command[1][8] - '0') * 10 +  (Command[1][9] - '0');

                st.wDay = (Command[9][0] - '0') * 10 + (Command[9][1] - '0');
                st.wMonth = (Command[9][2] - '0') * 10 + (Command[9][3] - '0');
                st.wYear = (Command[9][4] - '0') * 10 + (Command[9][5] - '0') + 2000;

                FILETIME FileTime, LocalFileTime;
                SystemTimeToFileTime(&st, &FileTime);
                FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
                FileTimeToSystemTime(&LocalFileTime, &LocalSt);

                g_GPSDateCtrl->SetTime(LocalSt);
                g_GPSTimeCtrl->SetTime(LocalSt);
                if(strcmp(Command[2], "A") == 0)
                {

                    BOOL ret = SetSystemTime(&st);
                    MessageBox(NULL, _T("SyncTime Success!"), _T(""), MB_OK | MB_TOPMOST);

                    strGPSButton = _T("Get GPS Time");
                    g_ThisDlg->SetDlgItemText(IDC_GETGPSTIME, strGPSButton);
                    g_ThisDlg->GetDlgItem(IDC_SETGPSTIME)->EnableWindow(0);

                    break;
                }
                else
                {
                    TimeOut ++;
                }
            }
            
        }

    GPSExit:

        if(hCommPort != NULL)
            CloseHandle(hCommPort);

        g_GetGPSTimeThread = NULL;

        strGPSButton = _T("Get GPS Time");
        g_ThisDlg->SetDlgItemText(IDC_GETGPSTIME, strGPSButton);
        g_ThisDlg->GetDlgItem(IDC_SETGPSTIME)->EnableWindow(0);
        
        return TRUE;
    }    

        如果需要解析其他指令,可以参考函数DWORD WINAPI GetGPSTime(LPVOID lpParameter)的实现方法,其实还是比较简单的。
        
        这些代码已经在TimeSyncPPC中测试过,可以直接使用,开发环境为VS2005,Windows Mobile 6.1 for PPC。如有疑问请在下方留言

    展开全文
  • 代码是处理从GPS模块接受的数据,有完整的分析处理GPS原始数据的测试代码
  • 基于ROS完成GPS数据解析,GPRMC格式,包括经纬度、航向角,同时可参考该代码解析其他格式的GPS串口数据
  • 基于嵌入式MINIGUI的GPS数据解析的程序,有界面,内部有小错误,自己调试,代码有很详细的注解
  • GPS数据协议NMEA-0183附解析代码

    千次阅读 2018-11-28 17:29:50
    NMEA 0183是美国国家海洋电子协会(National Marine Electronics  Association )为海用电子设备制定的标准格式。 注:发送次序$PZDA、$...解析代码下载:https://download.csdn.net/download/u012572552...

             NMEA 0183是美国国家海洋电子协会(National Marine Electronics 
    Association )为海用电子设备制定的标准格式。

    注:发送次序$PZDA、$GPGGA、$GPGLL、$GPVTG、$GPGSA、$GPGSV*3、$GPRMC

    解析代码下载:https://download.csdn.net/download/u012572552/10813883

    $GPGGA

    例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F

    字段0:$GPGGA,语句ID,表明该语句为Global Positioning System Fix Data(GGA)GPS定位信息

    字段1:UTC 时间,hhmmss.sss,时分秒格式

    字段2:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

    字段3:纬度N(北纬)或S(南纬)

    字段4:经度dddmm.mmmm,度分格式(前导位数不足则补0)

    字段5:经度E(东经)或W(西经)

    字段6:GPS状态,0=未定位,1=非差分定位,2=差分定位,3=无效PPS,6=正在估算

    字段7:正在使用的卫星数量(00 - 12)(前导位数不足则补0)

    字段8:HDOP水平精度因子(0.5 - 99.9)

    字段9:海拔高度(-9999.9 - 99999.9)

    字段10:地球椭球面相对大地水准面的高度

    字段11:差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)

    字段12:差分站ID号0000 - 1023(前导位数不足则补0,如果不是差分定位将为空)

    字段13:校验值

    $GPGSA

    例:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A

    字段0:$GPGSA,语句ID,表明该语句为GPS DOP and Active Satellites(GSA)当前卫星信息

    字段1:定位模式,A=自动手动2D/3D,M=手动2D/3D

    字段2:定位类型,1=未定位,2=2D定位,3=3D定位

    字段3:PRN码(伪随机噪声码),第1信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段4:PRN码(伪随机噪声码),第2信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段5:PRN码(伪随机噪声码),第3信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段6:PRN码(伪随机噪声码),第4信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段7:PRN码(伪随机噪声码),第5信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段8:PRN码(伪随机噪声码),第6信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段9:PRN码(伪随机噪声码),第7信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段10:PRN码(伪随机噪声码),第8信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段11:PRN码(伪随机噪声码),第9信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段12:PRN码(伪随机噪声码),第10信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段13:PRN码(伪随机噪声码),第11信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段14:PRN码(伪随机噪声码),第12信道正在使用的卫星PRN码编号(00)(前导位数不足则补0)

    字段15:PDOP综合位置精度因子(0.5 - 99.9)

    字段16:HDOP水平精度因子(0.5 - 99.9)

    字段17:VDOP垂直精度因子(0.5 - 99.9)

    字段18:校验值

    $GPGSV

    例:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70

    字段0:$GPGSV,语句ID,表明该语句为GPS Satellites in View(GSV)可见卫星信息

    字段1:本次GSV语句的总数目(1 - 3)

    字段2:本条GSV语句是本次GSV语句的第几条(1 - 3)

    字段3:当前可见卫星总数(00 - 12)(前导位数不足则补0)

    字段4:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

    字段5:卫星仰角(00 - 90)度(前导位数不足则补0)

    字段6:卫星方位角(00 - 359)度(前导位数不足则补0)

    字段7:信噪比(00-99)dbHz

    字段8:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

    字段9:卫星仰角(00 - 90)度(前导位数不足则补0)

    字段10:卫星方位角(00 - 359)度(前导位数不足则补0)

    字段11:信噪比(00-99)dbHz

    字段12:PRN 码(伪随机噪声码)(01 - 32)(前导位数不足则补0)

    字段13:卫星仰角(00 - 90)度(前导位数不足则补0)

    字段14:卫星方位角(00 - 359)度(前导位数不足则补0)

    字段15:信噪比(00-99)dbHz

    字段16:校验值

    $GPRMC

    例:$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

    字段0:$GPRMC,语句ID,表明该语句为Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐最小定位信息

    字段1:UTC时间,hhmmss.sss格式

    字段2:状态,A=定位,V=未定位

    字段3:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

    字段4:纬度N(北纬)或S(南纬)

    字段5:经度dddmm.mmmm,度分格式(前导位数不足则补0)

    字段6:经度E(东经)或W(西经)

    字段7:速度,节,Knots

    字段8:方位角,度

    字段9:UTC日期,DDMMYY格式

    字段10:磁偏角,(000 - 180)度(前导位数不足则补0)

    字段11:磁偏角方向,E=东W=西

    字段16:校验值

    $GPVTG

    例:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F

    字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地面速度信息

    字段1:运动角度,000 - 359,(前导位数不足则补0)

    字段2:T=真北参照系

    字段3:运动角度,000 - 359,(前导位数不足则补0)

    字段4:M=磁北参照系

    字段5:水平运动速度(0.00)(前导位数不足则补0)

    字段6:N=节,Knots

    字段7:水平运动速度(0.00)(前导位数不足则补0)

    字段8:K=公里/时,km/h

    字段9:校验值

    $GPGLL

    例:$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D

    字段0:$GPGLL,语句ID,表明该语句为Geographic Position(GLL)地理定位信息

    字段1:纬度ddmm.mmmm,度分格式(前导位数不足则补0)

    字段2:纬度N(北纬)或S(南纬)

    字段3:经度dddmm.mmmm,度分格式(前导位数不足则补0)

    字段4:经度E(东经)或W(西经)

    字段5:UTC时间,hhmmss.sss格式

    字段6:状态,A=定位,V=未定位

    字段7:校验值

    展开全文
  • 用51单片机解析GPS数据并在12864液晶显示经纬度、时钟以及高度的源代码程序(仅供参考_不提供程序问题解答)
  • 自己写的C代码GPS数据解析程序/正在进行的是基于MINIGUI的GPS导航项目。。。完成后将续传。。。eeweifeng111@q63.com
  • GPS数据解析C程序

    热门讨论 2010-05-19 15:30:57
    代码为郭天祥GPS产品的源代码,12864显示经纬度,程序经本人确定,很好用
  • 这里是记录了个人使用arduino调用gps并解析gps数据时一些奇奇怪怪的问题。 ——————————————分割线—————————————————— 1、如何读取保存数据 所用的gps是通过串口读取的,为了保持与...

    这里是记录了个人使用arduino调用gps并解析gps数据时一些奇奇怪怪的问题。
    ——————————————分割线——————————————————

    1、如何读取保存数据

    所用的gps是通过串口读取的,为了保持与电脑的串口通讯,需要设置软串口供gps回传数据。以下是设定软串口的代码

    #include<SoftwareSerial.h>
    SoftwareSerial gps(4, 3); //4--RX,3--TX
    

    2、回传数据处理

    首先检验正常数据回传是否有问题
    回传数据
    从图中的程序及回传数据可以看到,存储数据在data数组中且能正常数据。
    那么把数据输出调至if外部,单独输出data数组看是否有问题。
    在这里插入图片描述
    然后就出现了这个杂乱无章的输出,仔细看下输出的内容近似正确,偶见乱码。所以up在这很疑惑为什么…请教某大佬后,被建议删去第二个if(gps.available()>0)的判断条件,删去后结果如下:
    在这里插入图片描述
    这是手快截的屏,实际情况是每输出一段正确数据,就又输出一堆‘\n’,所以正确数据段的前后会有很多空行。想到可能是第二个if判断去掉后,由于数组data定义于函数loop,每次循环重新定义,当未写入串口数据的时候其内容是未经初始化的。
    尝试初始化后就有了以下正常程序(所以折腾3天的问题就是数组没初始化??那没初始化的数组怎么都会输出‘\n’)
    在这里插入图片描述

    ----------未完待续

    展开全文
  • C解析GPS数据

    2020-06-06 16:41:07
    最近用C撸了个解析GPS数据代码,放在GitHub上了: https://github.com/iE-zhi/NMEA_GPS_parse 一个函数就可以解析全部的GPS数据,支持标准的NMEA协议 可以设置需要解析的字段 支持多种字段ID
  • 基于Arduino的GPS数据解析程序

    千次阅读 2017-06-04 17:19:46
    这篇博客讲了我利用arduino来解析和转发原始nema 0813数据的思想和实现方法。因为arduino比较简单,无法实现串口数据接收中断,所以都写在主循环里面了。不知道代码存在何种缺陷和漏洞,欢迎大家批评指正。 GPS软件...
  • GPS-NMEA解析代码

    2016-12-29 12:57:54
    程序开放256字节的接收缓冲区,当接收到0x0D字节时开始进行NMEA语句的校验和验证与数据解析。首先查找该语句的每个参数之间的逗号分隔符,将分隔符的位置作记录下来并替换为0x00,再依据不同的语句定义将不同参数的...
  • 学习记录之基于C#的串口助手以及GPS数据解析和保存一.声明二.功能介绍三.串口助手界面四. 代码实现 一.声明 这是一篇学习记录,可能与很多大牛的代码相似,因为我的代码也是copy加各种整合,存在很多不严谨的地方,...
  • 一般情况下,GPS模块发送的数据是以\r\n结束的,但是有时候经过我们的串口助手保存,可能就会被处理成了\n结束,修改文件里的每一行需要借助notepad++等工具,比较麻烦,这里直接修改代码,适配\n结束的nmea数据包。...
  • void CGpsData::RMC(std::string... /*定义一个关联容器与他的一个关键字字符串数组来存储与处理数据*/  std::map&lt;std::string, std::string&gt;mGpsDate;  std::string szDataName[12] = { "m_s...
  • │ │ └── gps.min.js # gps数据解析 │ ├── app.json │ └── app.js 既然是轻应用,我们就可以用npm包了。这里我们用了gps,为了保持代码苗条,我们只选用了压缩过的gps.min.js这个文件就足够完成我们的...
  • % 关闭串口 % 注本程序可直接在 MATLAB 2017a 中运行 %该脚本文件用于学习 GPS数据的读取需要做其他用途请自行修改代码 % 本脚本文件的前面几行代码是要设置的一些参数 %默认使用COM3 (需视情况修改) %波特率设为...
  • GPS解析函数

    2011-09-11 10:18:14
    GPS数据解析代码,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 184
精华内容 73
关键字:

gps数据解析代码