GPS数据解析 数据拆分 坐标转换 显示线路图源代码

 

view plain print ?
  1. GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn from  
  2.   
  3.   
  4. GPS数据解析   
  5.   
  6. 数据拆分 \坐标转换 \显示线路图\源代码  
  7.   
  8. 逐条读取gps数据 然后进行拆分 解析,坐标转换,绘制线路。。。很好的示例多多交流学习。。  
  9.   
  10.    
  11.   
  12.  本程序是基于VC++ 建立的单文档工程。  
  13.   
  14.    
  15.   
  16. 废话少说,直接上代码  
  17.   
  18.    
  19.   
  20. //获取子字符串个数  
  21.   
  22. int GetSubStrCount(CString str,char cFlag)  
  23.   
  24. {  
  25.   
  26.        cFlag = ',';  
  27.   
  28.        int i = 0;  
  29.   
  30.        BOOL isHas = FALSE;  
  31.   
  32.    
  33.   
  34.        for (int iStart = -1; -1 != (iStart = str.Find(cFlag,iStart+1)) ; i++)  
  35.   
  36.        {  
  37.   
  38.               isHas = TRUE;  
  39.   
  40.        }  
  41.   
  42.          
  43.   
  44.        if (!isHas)  
  45.   
  46.        {  
  47.   
  48.               return 0;  
  49.   
  50.        }  
  51.   
  52.        else  
  53.   
  54.        {  
  55.   
  56.               return i+1;  
  57.   
  58.        }  
  59.   
  60. }  
  61.   
  62.    
  63.   
  64. //获取子字符串  
  65.   
  66. // i 序号 0  
  67.   
  68. CString GetSubStr(CString str,int i,char cFlag)  
  69.   
  70. {  
  71.   
  72.        cFlag = ',';  
  73.   
  74.        int iStart = -1;  
  75.   
  76.        int iEnd = 0;  
  77.   
  78.        int j = 0;  
  79.   
  80.        int iStrCount;  
  81.   
  82.    
  83.   
  84.        iStrCount = GetSubStrCount(str,cFlag);  
  85.   
  86.    
  87.   
  88.        if (i>iStrCount -1 || i<0)  
  89.   
  90.        {  
  91.   
  92.               str = "";  
  93.   
  94.               return str;  
  95.   
  96.        }  
  97.   
  98.        else  
  99.   
  100.        {  
  101.   
  102.               //do nothing  
  103.   
  104.        }  
  105.   
  106.    
  107.   
  108.        if (i == iStrCount-1)  
  109.   
  110.        {  
  111.   
  112.               i = iStrCount;  
  113.   
  114.    
  115.   
  116.               for (;j<i-1;j++)  
  117.   
  118.               {  
  119.   
  120.                      iStart = str.Find(cFlag , iStart+1);  
  121.   
  122.               }  
  123.   
  124.    
  125.   
  126.               return   str.Mid(iStart+1 , str.GetLength()-iStart-1);   
  127.   
  128.        }  
  129.   
  130.        else  
  131.   
  132.        {  
  133.   
  134.               //do nothing  
  135.   
  136.        }  
  137.   
  138.    
  139.   
  140.        for (; j<i; j++)  
  141.   
  142.        {  
  143.   
  144.               iStart = str.Find(cFlag , iStart+1);  
  145.   
  146.        }  
  147.   
  148.    
  149.   
  150.        iEnd = str.Find(cFlag , iStart+1);    
  151.   
  152.        return str.Mid(iStart+1 , iEnd-iStart-1);   
  153.   
  154. }  
  155.   
  156.    
  157.   
  158. //数据解析  
  159.   
  160. CString CGpsDataView::Analyzing(CString str)  
  161.   
  162. {  
  163.   
  164.        CString subStr[20];  
  165.   
  166.        char cFlag = ',';  
  167.   
  168.        int j = GetSubStrCount(str,cFlag);          //得到该行的子字符串个数  
  169.   
  170.        CStdioFile wFile;  
  171.   
  172.        wFile.Open("save.txt",CFile::modeCreate | CFile::modeWrite | CFile::typeText);//将数据写入文件  
  173.   
  174.    
  175.   
  176.        for (int i=0;i<j;i++)  
  177.   
  178.        {  
  179.   
  180.               subStr[i] = GetSubStr(str,i,cFlag);                                              
  181.   
  182.        }  
  183.   
  184.    
  185.   
  186.        //GPGGA数据  
  187.   
  188.        if (subStr[0] == "$GPGGA")  
  189.   
  190.        {  
  191.   
  192.               CoordCovert(subStr[2],subStr[4]);  
  193.   
  194.               //提取时间  
  195.   
  196.               subStr[1].Insert(2,':');  
  197.   
  198.               subStr[1].Insert(5,':');  
  199.   
  200.               subStr[1].Insert(0," UTC时间:");  
  201.   
  202.    
  203.   
  204.               //提取纬度  
  205.   
  206.               if (subStr[3] == 'N')  
  207.   
  208.               {  
  209.   
  210.                      subStr[2].Insert(11,"分");  
  211.   
  212.                      subStr[2].Insert(2,"度");  
  213.   
  214.                      subStr[2].Insert(0,"  北纬");  
  215.   
  216.               }  
  217.   
  218.               else if (subStr[3] == 'S')  
  219.   
  220.               {  
  221.   
  222.                      subStr[2].Insert(11,"分");  
  223.   
  224.                      subStr[2].Insert(2,"度");  
  225.   
  226.                      subStr[2].Insert(0,"  南纬");  
  227.   
  228.               }  
  229.   
  230.    
  231.   
  232.               //提取经度  
  233.   
  234.               if (subStr[5] == 'E')  
  235.   
  236.               {  
  237.   
  238.                      subStr[4].Insert(12,"分");  
  239.   
  240.                      subStr[4].Insert(3,"度");  
  241.   
  242.                      subStr[4].Insert(0,"  东经");  
  243.   
  244.               }  
  245.   
  246.               else if (subStr[5] == 'W')  
  247.   
  248.               {  
  249.   
  250.                      subStr[4].Insert(12,"分");  
  251.   
  252.                      subStr[4].Insert(3,"度");  
  253.   
  254.                      subStr[4].Insert(0,"  西经");  
  255.   
  256.               }  
  257.   
  258.                 
  259.   
  260.               //判断GPS状态  
  261.   
  262.               CString GpsState;  
  263.   
  264.    
  265.   
  266.               if (subStr[6] == '0')  
  267.   
  268.               {  
  269.   
  270.                      GpsState = "  GPS状态:无定位.";  
  271.   
  272.               }  
  273.   
  274.               else if (subStr[6] == '1')  
  275.   
  276.               {  
  277.   
  278.                      GpsState = "  GPS状态:无差分校正定位.";  
  279.   
  280.               }  
  281.   
  282.               else if (subStr[6] == '2')  
  283.   
  284.               {  
  285.   
  286.                      GpsState = "  GPS状态:差分校正定位.";  
  287.   
  288.               }  
  289.   
  290.               else if (subStr[6] == '9')  
  291.   
  292.               {  
  293.   
  294.                      GpsState = "  GPS状态:用星历计算定位.";  
  295.   
  296.               }  
  297.   
  298.    
  299.   
  300.               //提取卫星数  
  301.   
  302.               subStr[7].Insert(0," 卫星数:");         
  303.   
  304.    
  305.   
  306.               //提取平面位置精度因子  
  307.   
  308.               subStr[8].Insert(0,"  平面位置精度因子:");             
  309.   
  310.    
  311.   
  312.               //天线海拔高度  
  313.   
  314.               subStr[9].Insert(strlen(subStr[9]),subStr[10]);  
  315.   
  316.               subStr[9].Insert(0," 天线海拔高度:");  
  317.   
  318.    
  319.   
  320.               //海平面分离度  
  321.   
  322.               subStr[11].Insert(strlen(subStr[11]),subStr[12]);  
  323.   
  324.               subStr[11].Insert(0," 海平面分离度:");  
  325.   
  326.    
  327.   
  328.               subStr[0] += subStr[1];  
  329.   
  330.               subStr[0] += subStr[2];  
  331.   
  332.               subStr[0] += subStr[4];  
  333.   
  334.               subStr[0] += GpsState;  
  335.   
  336.               subStr[0] += subStr[7];  
  337.   
  338.               subStr[0] += subStr[8];  
  339.   
  340.               subStr[0] += subStr[9];  
  341.   
  342.               subStr[0] += subStr[11];  
  343.   
  344.               //////////////////////////////////////MessageBox(subStr[0]);  
  345.   
  346.               wFile.WriteString(subStr[0]);//将数据写入文件  
  347.   
  348.    
  349.   
  350.        }  
  351.   
  352.    
  353.   
  354.        //GPZDA数据  
  355.   
  356.        else if (subStr[0] == "$GPZDA")  
  357.   
  358.        {  
  359.   
  360.               //提取时间  
  361.   
  362.               subStr[1].Insert(2,':');  
  363.   
  364.               subStr[1].Insert(5,':');  
  365.   
  366.               subStr[1].Insert(0," UTC时间:");  
  367.   
  368.    
  369.   
  370.               //提取日期  
  371.   
  372.               subStr[2].Insert(strlen(subStr[2]),"日");  
  373.   
  374.               subStr[2].Insert(0,"月");  
  375.   
  376.               subStr[2].Insert(0,subStr[3]);  
  377.   
  378.               subStr[2].Insert(0,"年");  
  379.   
  380.               subStr[2].Insert(0,subStr[4]);    
  381.   
  382.               subStr[2].Insert(0,' ');  
  383.   
  384.    
  385.   
  386.               //当地时域描述  
  387.   
  388.               subStr[5].Insert(strlen(subStr[5]),"小时");  
  389.   
  390.    
  391.   
  392.               if (strlen(subStr[6]) > 3)  
  393.   
  394.               {  
  395.   
  396.                      subStr[6] = subStr[6].Left(2);  
  397.   
  398.               }  
  399.   
  400.               else  
  401.   
  402.               {  
  403.   
  404.                      subStr[6] = '0';  
  405.   
  406.               }  
  407.   
  408.    
  409.   
  410.               subStr[6] += "分";  
  411.   
  412.               subStr[6].Insert(0,subStr[5]);  
  413.   
  414.               subStr[6].Insert(0," 当地时域:");  
  415.   
  416.    
  417.   
  418.               subStr[0] += subStr[1];  
  419.   
  420.               subStr[0] += subStr[2];  
  421.   
  422.               subStr[0] += subStr[6];  
  423.   
  424.               //////////////////////////////MessageBox(subStr[0]);  
  425.   
  426.               wFile.WriteString(subStr[0]);//将数据写入文件  
  427.   
  428.        }  
  429.   
  430.    
  431.   
  432.        //GPGSA数据  
  433.   
  434.        else if (subStr[0] == "$GPGSA")  
  435.   
  436.        {  
  437.   
  438.               //卫星捕获模式,以及定位模式  
  439.   
  440.               CString CatchLocation;  
  441.   
  442.    
  443.   
  444.               if (subStr[1] == 'M')  
  445.   
  446.               {  
  447.   
  448.                      if (subStr[2] == '1')  
  449.   
  450.                      {  
  451.   
  452.                             CatchLocation = " 手动捕获卫星,未定位!";  
  453.   
  454.                      }  
  455.   
  456.                      else if (subStr[2] == '2')  
  457.   
  458.                      {  
  459.   
  460.                             CatchLocation = "  手动捕获卫星,2D定位!";  
  461.   
  462.                      }  
  463.   
  464.                      else if (subStr[2] == '3')  
  465.   
  466.                      {  
  467.   
  468.                             CatchLocation = "  手动捕获卫星,3D定位!";  
  469.   
  470.                      }  
  471.   
  472.               }  
  473.   
  474.               else if (subStr[1] == 'A')  
  475.   
  476.               {  
  477.   
  478.                      if (subStr[2] == '1')  
  479.   
  480.                      {  
  481.   
  482.                             CatchLocation ="  自动捕获卫星,未定位!";  
  483.   
  484.                      }  
  485.   
  486.                      else if (subStr[2] == '2')  
  487.   
  488.                      {  
  489.   
  490.                             CatchLocation ="  自动捕获卫星,2D定位!";  
  491.   
  492.                      }  
  493.   
  494.                      else if (subStr[2] == '3')  
  495.   
  496.                      {  
  497.   
  498.                             CatchLocation ="  自动捕获卫星,3D定位!";  
  499.   
  500.                      }  
  501.   
  502.               }  
  503.   
  504.    
  505.   
  506.               //各卫星定位结果  
  507.   
  508.               subStr[3].Insert(0,"  各卫星定位结果:");  
  509.   
  510.               subStr[3] += ' ';  
  511.   
  512.               subStr[4].Insert(0,subStr[3]);  
  513.   
  514.               subStr[4] += ' ';  
  515.   
  516.               subStr[5].Insert(0,subStr[4]);  
  517.   
  518.               subStr[5] += ' ';  
  519.   
  520.               subStr[6].Insert(0,subStr[5]);  
  521.   
  522.               subStr[6] += ' ';  
  523.   
  524.               subStr[7].Insert(0,subStr[6]);  
  525.   
  526.               subStr[7] += ' ';  
  527.   
  528.               subStr[8].Insert(0,subStr[7]);  
  529.   
  530.               subStr[8] += ' ';  
  531.   
  532.               subStr[9].Insert(0,subStr[8]);  
  533.   
  534.               subStr[9] += ' ';  
  535.   
  536.               subStr[10].Insert(0,subStr[9]);  
  537.   
  538.               subStr[10] += ' ';  
  539.   
  540.               subStr[11].Insert(0,subStr[10]);  
  541.   
  542.               subStr[11] += ' ';  
  543.   
  544.               subStr[12].Insert(0,subStr[11]);  
  545.   
  546.               subStr[12] += ' ';  
  547.   
  548.               subStr[13].Insert(0,subStr[12]);  
  549.   
  550.               subStr[13] += ' ';  
  551.   
  552.               subStr[14].Insert(0,subStr[13]);  
  553.   
  554.               subStr[14] += ' ';  
  555.   
  556.    
  557.   
  558.               //空间(三维)位置精度因子  
  559.   
  560.               subStr[15].Insert(0,"  空间(三维)位置精度因子:");  
  561.   
  562.    
  563.   
  564.               //平面位置精度因子  
  565.   
  566.               subStr[16].Insert(0,"   平面位置精度因子:");  
  567.   
  568.    
  569.   
  570.               //高度位置精度因子  
  571.   
  572.               subStr[17] = subStr[17].Left(3);  
  573.   
  574.               subStr[17].Insert(0,"  高度位置精度因子:");  
  575.   
  576.    
  577.   
  578.               subStr[0] += CatchLocation;  
  579.   
  580.               subStr[0] += subStr[14];  
  581.   
  582.               subStr[0] += subStr[15];  
  583.   
  584.               subStr[0] += subStr[16];  
  585.   
  586.               subStr[0] += subStr[17];  
  587.   
  588.               /////////////////////////////MessageBox(subStr[0]);  
  589.   
  590.               wFile.WriteString(subStr[0]);//将数据写入文件                       
  591.   
  592.        }  
  593.   
  594.    
  595.   
  596.        //GPGSV数据  
  597.   
  598.        else if (subStr[0] == "$GPGSV")  
  599.   
  600.        {  
  601.   
  602.               ///////////////////////////MessageBox(subStr[0]);  
  603.   
  604.    
  605.   
  606.               //卫星编号、卫星仰角(0~90度)、卫星方位角(0~359度)、信噪比  
  607.   
  608.               subStr[4].Insert(0,"卫星编号:");  
  609.   
  610.               subStr[5].Insert(0," 仰角:");  
  611.   
  612.               subStr[6].Insert(0," 方位角:");  
  613.   
  614.               subStr[7].Insert(0," 信噪比:");  
  615.   
  616.               subStr[4] += subStr[5];  
  617.   
  618.               subStr[4] += subStr[6];  
  619.   
  620.               subStr[4] += subStr[7];  
  621.   
  622.               ///////////////////MessageBox(subStr[4]);  
  623.   
  624.               subStr[8].Insert(0,"卫星编号:");  
  625.   
  626.               subStr[9].Insert(0," 仰角:");  
  627.   
  628.               subStr[10].Insert(0," 方位角:");  
  629.   
  630.               subStr[11].Insert(0," 信噪比:");  
  631.   
  632.               subStr[8] += subStr[9];  
  633.   
  634.               subStr[8] += subStr[10];  
  635.   
  636.               subStr[8] += subStr[11];  
  637.   
  638.               ////////////////////////MessageBox(subStr[8]);  
  639.   
  640.               subStr[12].Insert(0,"卫星编号:");  
  641.   
  642.               subStr[13].Insert(0," 仰角:");  
  643.   
  644.               subStr[14].Insert(0," 方位角:");  
  645.   
  646.               subStr[15].Insert(0," 信噪比:");  
  647.   
  648.               subStr[12] += subStr[13];  
  649.   
  650.               subStr[12] += subStr[14];  
  651.   
  652.               subStr[12] += subStr[15];  
  653.   
  654.               /////////////////////MessageBox(subStr[12]);  
  655.   
  656.               subStr[16].Insert(0,"卫星编号:");  
  657.   
  658.               subStr[17].Insert(0," 仰角:");  
  659.   
  660.               subStr[18].Insert(0," 方位角:");  
  661.   
  662.    
  663.   
  664.               if (strlen(subStr[19]) > 3)  
  665.   
  666.               {  
  667.   
  668.                      subStr[19] = subStr[19].Left(2);  
  669.   
  670.               }  
  671.   
  672.               else  
  673.   
  674.               {  
  675.   
  676.                      subStr[19] = '0';  
  677.   
  678.               }  
  679.   
  680.    
  681.   
  682.               subStr[19].Insert(0," 信噪比:");  
  683.   
  684.               subStr[16] += subStr[17];  
  685.   
  686.               subStr[16] += subStr[18];       
  687.   
  688.               subStr[16] += subStr[19];  
  689.   
  690.               /////////////////////////////////MessageBox(subStr[16]);  
  691.   
  692.               wFile.WriteString(subStr[16]);//将数据写入文件  
  693.   
  694.        }  
  695.   
  696.        return str;  
  697.   
  698. }  
  699.   
  700.    
  701.   
  702.    
  703.   
  704. //读取文件数据并解析  
  705.   
  706. void CGpsDataView::OnFileRead()  
  707.   
  708. {  
  709.   
  710.        // TODO: 在此添加命令处理程序代码   
  711.   
  712.        CStdioFile myFile;  
  713.   
  714.        CString oneLine;       
  715.   
  716.        char cFlag = ',';  
  717.   
  718.        CString subStr[20];  
  719.   
  720.          
  721.   
  722.        //读取GPS数据文件  
  723.   
  724.        if(!myFile.Open(("gps.txt"),CFile::modeRead | CFile::typeText))  
  725.   
  726.        {  
  727.   
  728.               AfxMessageBox(_T("打开文件错误!"));  
  729.   
  730.               return;  
  731.   
  732.        }  
  733.   
  734.        else  
  735.   
  736.        {  
  737.   
  738.               /*do nothing*/  
  739.   
  740.        }  
  741.   
  742.    
  743.   
  744.        while (myFile.ReadString(oneLine))//读一行  
  745.   
  746.        {               
  747.   
  748.               //////////MessageBox(oneLine);  
  749.   
  750.               int j = GetSubStrCount(oneLine,cFlag);         //得到该行的子字符串个数  
  751.   
  752.                 
  753.   
  754.               //校验  
  755.   
  756.               if(CheckNum(oneLine))  
  757.   
  758.               {  
  759.   
  760.                      ////////////MessageBox(_T("数据校验...接收正确!..."));  
  761.   
  762.    
  763.   
  764.                      for (int i=0;i<j;i++)  
  765.   
  766.                      {  
  767.   
  768.                             subStr[i] = GetSubStr(oneLine,i,cFlag);  
  769.   
  770.                             //MessageBox(subStr[i]);                             
  771.   
  772.                      }  
  773.   
  774.    
  775.   
  776.                      Analyzing(oneLine);        //解析  
  777.   
  778.               }  
  779.   
  780.               else  
  781.   
  782.               {  
  783.   
  784.                      AfxMessageBox(_T("数据校验..接收错误!..."));  
  785.   
  786.               }  
  787.   
  788.        }  
  789.   
  790.    
  791.   
  792.        myFile.Close();  
  793.   
  794. }  
  795.   
  796.    
  797.   
  798. //***********************************************************************************************  
  799.   
  800. //坐标转换  
  801.   
  802.    
  803.   
  804. //度分秒--弧度  
  805.   
  806. double Dms2Rad(double Dms)   
  807.   
  808. {   
  809.   
  810.        double Degree, Miniute;   
  811.   
  812.        double Second;   
  813.   
  814.        int   Sign;   
  815.   
  816.        double Rad;   
  817.   
  818.    

你可能感兴趣的:(null,文档,360,出版,2010)