GPS-GPZDA数据解析C语言
- 格式:pdf
- 大小:2.90 MB
- 文档页数:19
view plaincopy to clipboardprint?1. GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn from2.3.4. GPS数据解析5.6. 数据拆分 \坐标转换 \显示线路图\源代码7.8. 逐条读取gps数据然后进行拆分解析,坐标转换,绘制线路。
很好的示例多多交流学习。
9.10.11.12. 本程序是基于VC++ 建立的单文档工程。
13.14.15.16. 废话少说,直接上代码17.18.19.20. //获取子字符串个数21.22. i nt 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. else53.54. {55.56. return i+1;57.58. }59.60. }61.62.63.64. //获取子字符串65.66. // i 序号 067.68. C String 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. else99.100. {101.102. //do nothing104. }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. else131.132. {133.134. //do nothing135.136. }137.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 | CFil e::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]);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. else401.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.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. {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]);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.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]);//将数据写入文件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,"卫星编号:");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. else673.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. else735.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. else781.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.819.820. if(Dms >= 0)821.822. {823.824. Sign = 1;825.826. }827.828. else829.830. {831.832. Sign = -1;833.834. }835.836.837.838. Dms = fabs(Dms); //绝对值839.840. Degree = floor(Dms); // 取度 floor(2.800) = 2.0000841.842. Miniute = floor(fmod(Dms * 100.0, 100.0)); //fmod 计算余数843.844. Second = fmod(Dms * 10000.0, 100.0);845.846. Rad = Sign * (Degree + Miniute / 60.0 + Second / 3600.0) * PI / 180.0;847.848. return Rad;849.850. }851.852.853.854. double Rad2Dms(double Rad)855.856. {857.858. double Degree, Miniute;859.860. double Second;861.862. int Sign;863.864. double Dms;865.867.868. if(Rad >= 0)869.870. {871.872. Sign = 1;873.874. }875.876. else877.878. {879.880. Sign = -1;881.882. }883.884.885.886. Rad = fabs(Rad * 180.0 / PI);887.888. Degree = floor(Rad);889.890. Miniute = floor(fmod(Rad * 60.0, 60.0));891.892. Second = fmod(Rad * 3600.0, 60.0);893.894. Dms = Sign * (Degree + Miniute / 100.0 + Second / 10000.0); 895.896. return Dms;897.898. }899.900.902. //正算公式903.904. bool GpsPoint::BL2xy()905.906. {907.908. //大地测量学基础(吕志平乔书波北京:测绘出版社 2010.03)909.910.911.912. double X; //由赤道至纬度为B的子午线弧长(P106 5-41)913.914. double N; //椭球的卯酉圈曲率半径915.916. double t;917.918. double t2;919.920. double m;921.922. double m2;923.924. double ng2;925.926. double cosB;927.928. double sinB;929.930.931.932. X = A1 * B * 180.0 / PI + A2 * sin(2 * B)933.934. + A3 * sin(4 * B) + A4 * sin(6 * B);935.937.938. sinB = sin(B);939.940. cosB = cos(B);941.942. t = tan(B);943.944. t2 = t * t;945.946.947.948. N = a /sqrt(1 - e2 * sinB * sinB);949.950. m = cosB * (L - L0);951.952. m2 = m * m;953.954. ng2 = cosB * cosB * e2 / (1 - e2);955.956.957.958. //P156 (6-63公式)959.960. x = X + N * t *(( 0.5 + ( (5 - t2 + 9 * ng2 + 4 * ng2 * ng2) 961.962. / 24.0 + (61 - 58 * t2 + t2 * t2) * m2 / 720.0) * m2)* m2); 963.964.965.966. y = N * m * ( 1 + m2 * ( (1 - t2 + ng2) / 6.0 + m2 * ( 5 - 18 * t2 + t2 * t2967.968. + 14 * ng2 - 58 * ng2 * t2 ) / 120.0));969.971.972. //y += 500000;973.974.975.976. return true;977.978. }979.980.981.982. //反算公式983.984. bool GpsPoint::xy2BL()985.986. {987.988. double sinB;989.990. double cosB;991.992. double t;993.994. double t2;995.996. double N; //椭球的卯酉圈曲率半径997.998. double ng2;999.1000. double V;1001.1002. double yN;1003.1004. double preB0;1006. double B0;1007.1008. double eta;1009.1010. //y -= 500000;1011.1012. B0 = x / A1;1013.1014.1015.1016. do1017.1018. {1019.1020. preB0 = B0;1021.1022. B0 = B0 * PI / 180.0;1023.1024. B0 = (x - (A2 * sin(2 * B0) + A3 * sin(4 * B0) + A4 * sin(6 * B0 ))) / A1;1025.1026. eta = fabs(B0 - preB0);1027.1028. }while(eta > 0.000000001);1029.1030.1031.1032. B0 = B0 * PI / 180.0;1033.1034. B = Rad2Dms(B0);1035.1036. sinB = sin(B0);1037.1038. cosB = cos(B0);1040. t = tan(B0);1041.1042. t2 = t * t;1043.1044. N = a / sqrt(1 - e2 * sinB * sinB);1045.1046. ng2 = cosB * cosB * e2 / (1 - e2);1047.1048. V = sqrt(1 + ng2);1049.1050. yN = y / N;1051.1052.1053.1054. B = B0 - (yN * yN - (5 + 3 * t2 + ng2 - 9 * ng2 * t2) * yN * yN * yN * yN1055.1056. / 12.0 + (61 + 90 * t2 + 45 * t2 * t2) * yN * yN * yN * yN * y N * yN / 360.0)1057.1058. * V * V * t / 2;1059.1060.1061.1062. L = L0 + (yN - (1 + 2 * t2 + ng2) * yN * yN * yN / 6.0 + (5 + 28 * t2 + 241063.1064. * t2 * t2 + 6 * ng2 + 8 * ng2 * t2) * yN * yN * yN * yN * yN / 120.0) / cosB;1065.1066. return true;1067.1068. }1069.1071.1072. //设置中央子午线1073.1074. bool GpsPoint::SetL0(double dL0)1075.1076. {1077.1078. L0 = Dms2Rad(dL0);1079.1080. return true;1081.1082. }1083.1084.1085.1086. //将度分秒经纬度转换为弧度后再转换为平面坐标1087.1088. bool GpsPoint::SetBL(double dB, double dL) 1089.1090. {1091.1092. B = Dms2Rad(dB);1093.1094. L = Dms2Rad(dL);1095.1096. BL2xy();1097.1098. return true;1099.1100. }1101.1102.1103.1104. bool GpsPoint::GetBL(double *dB, double *dL)1106. {1107.1108. *dB = Rad2Dms(B);1109.1110. *dL = Rad2Dms(L);1111.1112. return true;1113.1114. }1115.1116.1117.1118. //将平面坐标转换为(弧度)经纬度1119.1120. bool GpsPoint::Setxy(double dx, double dy) 1121.1122. {1123.1124. x = dx;1125.1126. y = dy;1127.1128. xy2BL();1129.1130. return true;1131.1132. }1133.1134.1135.1136. bool GpsPoint::Getxy(double *dx, double *dy) 1137.1138. {1139.1140. *dx = x;1141.1142. *dy = y;1143.1144. return true;1145.1146. }1147.1148.1149.1150. GpsPoint_Krasovsky::GpsPoint_Krasovsky()1151.1152. {1153.1154. a = 6378245; //长半径1155.1156. f = 298.3; //扁率的倒数(扁率:(a-b)/a)1157.1158. e2 = 1 - ((f - 1) / f) * ((f - 1) / f); //第一偏心率的平方1159.1160. e12 = (f / (f - 1)) * (f / (f - 1)) - 1; //第二偏心率的平方1161.1162.1163.1164. // 克拉索夫斯基椭球1165.1166. A1 = 111134.8611;1167.1168. A2 = -16036.4803;1169.1170. A3 = 16.8281;1171.1172. A4 = -0.0220;1173.1174. }1175.1176.1177.1178. //*************坐标转换1179.1180. bool CGpsDataView::CoordCovert(CString latitude, CString longitude)1181.1182. {1183.1184. double bbb = atof(latitude);1185.1186. double lll = atof(longitude);1187.1188.1189.1190. //度分格式转换为度分秒格式1191.1192. bbb = Dm2Dms(bbb);1193.1194. lll = Dm2Dms(lll);1195.1196.1197.1198. double MyL0 ; //中央子午线1199.1200. double MyB = bbb ; //33 d 44 m 55.6666 s1201.1202. double MyL = lll ; //3度带,109 d 22 m 33.4444 s1203.1204.1205.1206. //计算当地中央子午线 ,3度带1207.1208. MyL0 = fabs(MyL);1209.1210. MyL0 = floor(MyL);1211.1212. MyL0 = 3 * floor(MyL0 / 3 );1213.1214.1215.1216. GpsPoint_Krasovsky MyPrj;1217.1218. MyPrj.SetL0(MyL0);1219.1220. MyPrj.SetBL(MyB, MyL);1221.1222. double OutMyX;1223.1224. double OutMyY;1225.1226. OutMyX = MyPrj.x; //正算结果:坐标x 1227.1228. OutMyY = MyPrj.y; //结果:坐标y 1229.1230.1231.1232. CString strTemp1;1233.1234. CString strTemp2;1235.1236. CString strTemp3;1237.1238. CString strTemp4;1239.1240.1241.1242. strTemp1.Format("%f",OutMyX);1244. strTemp2.Format("%f",OutMyY); 1245.1246. strTemp1.Insert(0,"x = "); 1247.1248. strTemp2.Insert(0," , y = "); 1249.1250. strTemp2.Insert(0,strTemp1); 1251.1252. strTemp2.Insert(0," 坐标转换: "); 1253.1254.1255.1256. strTemp3.Format("%f12",MyB); 1257.1258. strTemp4.Format("%f12",MyL); 1259.1260. strTemp3.Insert(0,"B = "); 1261.1262. strTemp4.Insert(0," L = "); 1263.1264. strTemp4.Insert(0,strTemp3); 1265.1266. strTemp2.Insert(0,strTemp4); 1267.1268. //MessageBox(strTemp2); 1269.1270.1271.1272. DrawPoint(MyPrj.x,MyPrj.y); 1273.1274.1275.1276. return true;1277.1279.1280.1281.1282. //================================== 1283.1284. //度分格式转换为度分秒格式1285.1286. double CGpsDataView::Dm2Dms(double Dm) 1287.1288. {1289.1290. double Dms;1291.1292. double temp;1293.1294. temp = Dm - floor(Dm);1295.1296. temp = (temp * 60) / 100;1297.1298. Dm = floor(Dm);1299.1300. Dm += temp;1301.1302. Dm = Dm /100;1303.1304. Dms = Dm;1305.1306. return Dms;1307.1308. }1309.1310.1311.1312.1314.1315.1316.1317.1318. //*************绘制线路显示出路线1319.1320. int count1=0;1321.1322. bool bFirst = true;1323.1324. double xTemp;1325.1326. double yTemp;1327.1328. void CGpsDataView::DrawPoint(double X, double Y) 1329.1330. {1331.1332. Sleep(100);1333.1334.1335.1336. //X = (X - floor(X))*100;1337.1338. //Y = (Y - floor(Y))*100;1339.1340.1341.1342. if (bFirst)1343.1344. {1345.1346. xTemp=X;1347.1348. yTemp=Y;1349.1350. bFirst=false;1351.1352. }1353.1354.1355.1356. CDC *pDC=GetDC();1357.1358. CPen pen(PS_SOLID,3,RGB(255,20,20));1359.1360. CPen *pOldPen;1361.1362. CBrush *pOldBrush;1363.1364. CBrush *pBrush=CBrush::FromHandle( (HBRUSH)GetStockObjec t(NULL_BRUSH) );1365.1366.1367.1368. pOldPen=pDC->SelectObject(&pen);1369.1370. pOldBrush=pDC->SelectObject(pBrush);1371.1372.1373.1374. int a=(int)(100.0-(X-xTemp)*800.0);1375.1376. int b=(int)(100.0+(Y-yTemp)*800.0);1377.1378.1379.1380. //绘制点显示路径1381.1382. pDC->Ellipse(a,b,a+5,b+5);1383.1384.1385.1386. //计数1387.1388. count1=count1+1;1389.1390. pDC->SelectObject( pOldBrush );1391.1392. pDC->SelectObject( pOldPen );1393.1394.1395.1396. CString str;1397.1398. str.Format("%.1f,%.1f,%d,%d,%d",X-xTemp,Y-yTemp,a,b,count1);1399.1400. pDC->TextOut(10,10,str);1401.1402. }。
NMEA协议是为了在不同的GPS(全球定位系统)导航设备中建立统一的BTCM(海事无线电技术委员会)标准,由美国国家海洋电子协会(NMEA-The National Marine Electronics Associa-tion)制定的一套通讯协议。
GPS接收机根据NMEA-0183协议的标准规范,将位置、速度等信息通过串口传送到PC机、PDA 等设备。
NMEA-0183协议是GPS接收机应当遵守的标准协议,也是目前GPS接收机上使用最广泛的协议,大多数常见的GPS接收机、GPS数据处理软件、导航软件都遵守或者至少兼容这个协议。
不过,也有少数厂商的设备使用自行约定的协议比如GARMIN的GPS设备(部分GARMIN设备也可以输出兼容NMEA-0183协议的数据)。
软件方面,我们熟知的Google Earth目前也不支持NMEA-0183协议,但Google Earth已经声明会尽快实现对NMEA-0183协议的兼容。
呵呵,除非你确实强壮到可以和工业标准分庭抗礼,否则你就得服从工业标准。
NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等。
下面给出这些常用NMEA-0183语句的字段定义解释。
$GPGGA例:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1 F字段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:校验值1、GPS DOP and Active Satellites(GSA)当前卫星信息$GPGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>, <6>*hh<CR><LF><1> 模式,M=手动,A=自动<2> 定位类型,1=没有定位,2=2D定位,3=3D定位<3> PRN码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
using System;using System.Runtime.InteropServices;using System.Text;namespace BaseStationPDA{class GPS{public string PortNum;public int BaudRate;public byte ByteSize;public byte Parity; // 0-4=no,odd,even,mark,spacepublic byte StopBits; // 0,1,2 = 1, 1.5, 2public int ReadTimeout;//comm port win32 file handleprivate int hComm = -1;public bool Opened = false;//win32 api constantsprivate const uint GENERIC_READ = 0x80000000;private const uint GENERIC_WRITE = 0x40000000;private const int OPEN_EXISTING = 3;private const int INVALID_HANDLE_VALUE = -1;[StructLayout(LayoutKind.Sequential)]public struct DCB{//taken from c struct in platform sdkpublic int DCBlength; // sizeof(DCB)public int BaudRate; // 指定当前波特率 current baud rate // these are the c struct bit fields, bit twiddle flag to setpublic int fBinary; // 指定是否允许二进制模式,在windowsArray5中必须主TRUE binary mode, no EOF checkpublic int fParity; // 指定是否允许奇偶校验 enable parity checkingpublic int fOutxCtsFlow; // 指定CTS是否用于检测发送控制,当为TRUE是CTS为OFF,发送将被挂起。
c语言 gps课程设计一、教学目标本课程的目标是让学生掌握C语言在GPS领域的应用。
通过本课程的学习,学生将能够:1.理解GPS系统的基本原理和工作流程。
2.掌握C语言的基本语法和编程技巧。
3.能够使用C语言进行GPS数据的采集、解析和处理。
4.能够利用C语言实现简单的GPS导航功能。
二、教学内容本课程的教学内容主要包括以下几个部分:1.GPS系统的基本原理和工作流程。
2.C语言的基本语法和编程技巧。
3.GPS数据的采集、解析和处理。
4.GPS导航功能的实现。
三、教学方法为了达到本课程的教学目标,我们将采用多种教学方法,包括:1.讲授法:用于讲解GPS系统的基本原理和工作流程,以及C语言的基本语法和编程技巧。
2.案例分析法:通过分析具体的GPS应用案例,让学生了解GPS技术的实际应用。
3.实验法:通过实验让学生亲手操作,掌握GPS数据的采集、解析和处理方法,以及实现简单的导航功能。
四、教学资源为了支持本课程的教学内容和教学方法的实施,我们将准备以下教学资源:1.教材:选用合适的C语言和GPS相关教材,为学生提供理论学习的参考。
2.参考书:提供相关的参考书籍,拓展学生的知识面。
3.多媒体资料:制作课件和视频资料,直观地展示GPS系统和C语言的相关内容。
4.实验设备:准备GPS接收器、计算机等实验设备,让学生进行实际操作。
五、教学评估为了全面、客观地评估学生在C语言GPS课程中的学习成果,我们将采取以下评估方式:1.平时表现:通过学生在课堂上的参与度、提问回答、小组讨论等表现来评估其学习态度和理解程度。
2.作业:布置与课程内容相关的编程作业,评估学生对C语言编程和GPS应用的掌握情况。
3.考试:定期进行理论知识考试和编程实践考试,全面评估学生的知识掌握和实际应用能力。
4.项目报告:要求学生完成一个GPS相关的编程项目,通过项目报告评估学生的综合应用能力。
六、教学安排本课程的教学安排如下:1.教学进度:按照教材和大纲进行,确保覆盖所有重要知识点。
gps数据格式单片机技术2008-03-18 11:58 阅读584 评论0 字号:大大中中小小a.GPS 固定数据输出语句($GPGGA)这是一帧GPS定位的主要数据,也是使用最广的数据。
$GPGGA语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,水平精确度,海拔高度,高度单位,大地水准面高度,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符<CR>和换行符<LF>),分别用14个逗号进行分隔。
该数据帧的结构及各字段释义如下:$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx<CR><LF> $GPGGA:起始引导符及语句格式说明(本句为GPS定位数据);<1> UTC时间,格式为hhmmss.sss;<2> 纬度,格式为ddmm.mmmm(第一位是零也将传送);<3> 纬度半球,N或S(北纬或南纬)<4> 经度,格式为dddmm.mmmm(第一位零也将传送);<5> 经度半球,E或W(东经或西经)<6> 定位质量指示,0=定位无效,1=定位有效;<7> 使用卫星数量,从00到12(第一个零也将传送)<8> 水平精确度,0.5到99.9<9> 天线离海平面的高度,-9999.9到9999.9米M 指单位米<10> 大地水准面高度,-9999.9到9999.9米M 指单位米<11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量<12> 差分参考基站标号,从0000到1023(首位0也将传送)。
利⽤strstr和sscanf解析GPS信息考察C程序员是否合格的⼀个重要标准就是看他操作字符串的能⼒,⼀个合格的C程序员应该可以熟练的对字符串进⾏拆分、组合、格式转换以及搜索定位,从⼀堆数据中提取出有效信息。
⽐如说我们要做⼀个GPS导航的项⽬,需要读取GPS模块以ASCII码的形式发送过来的数据,然后对这些数据进⾏处理,提取我们需要的信息。
这就涉及到很多操作字符串的问题。
下⾯就以此为例,利⽤strstr函数和sscanf函数解析GPS数据。
GPS输出的数据格式如下:$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54$GPVTG,359.95,T,,M,15.15,N,28.0,K,A*04$GPGGA,121253.000,3937.3090,N,11611.6057,E,1,06,1.2,44.6,M,-5.7,M,,0000*72$GPGSA,A,3,14,15,05,22,18,26,,,,,,,2.1,1.2,1.7*3D$GPGSV,3,1,10,18,84,067,23,09,67,067,27,22,49,312,28,15,47,231,30*70$GPGSV,3,2,10,21,32,199,23,14,25,272,24,05,21,140,32,26,14,070,20*7E$GPGSV,3,3,10,29,07,074,,30,07,163,28*7D可以看到,GPS模块发送过来的原始数据有很多,但是通常我们只需要其中的⼀部分信息就够⽤了,⽐如对于导航的功能,我们只需要以$GPRMC开头,以换⾏符结束的⼀⾏信息就够了。
即:$GPRMC,121252.000,A,3958.3032,N,11629.6046,E,15.15,359.95,070306,,,A*54因此我们需要做的就是从读取的数据中截取以$GPRMC开头的⼀⾏信息,然后从中解析出经纬度、⽇期时间等有效信息即可。
GPS编码格式及C语⾔解码有关磁偏⾓和地图定位的问题:地图的⽅向:上北、下南、左西、右东是⼤多数地图的⽅向,但这可不是通⽤原则,如果地图上有⽅向标,可以通过⽅向标了解到这些。
地磁极是接近南极和北极的,但并不和南极、北极重合,⼀个约在北纬72°、 西经96°处;⼀个约在南纬70°、东经150°处。
磁北极距地理北极⼤约相差1500km。
现在磁北极的位置在加拿⼤北⽅,在⼀天中磁北极的位置也是不停的变动,它的轨迹⼤致为⼀椭圆形,磁北极平均每天向北以40m。
⽬前磁北极正在逐渐离开加拿⼤,⼤约于2005年进⼊俄罗斯境内。
东经25度地区,磁偏⾓在1-2度之间;北纬25度以上地区,磁偏⾓⼤于2度;若在西经低纬度地区,磁偏⾓是5-20度;西经45度以上,磁偏⾓为25-50度。
在我国,正常情况下,磁偏⾓最⼤可达6度,⼀般情况为2-3度。
在我国除部分磁⼒异常的地⽅外,⼀般磁偏⾓都是西偏。
磁偏⾓还是不断有规律变化的,地图上的磁偏⾓只是测图时的磁偏⾓(磁北⽐真北偏左,加上磁偏⾓;磁北⽐真北偏右,减去磁偏⾓;在我国⼀般是加上)。
使⽤地图本⾝所注的磁偏⾓要注意出版年限,地图太⽼误差较⼤。
GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG解释$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:校验值$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:校验值$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:校验值GPS编码格式及C语⾔解码GPS接收机只要处于⼯作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串⼝传送到计算机中。
#include <stdio.h>#include <math.h>#include <stdlib.h>#define bGM84 3.986005e14#define bOMEGAE84 7.2921151467e-5void main(){long double roota=0.515365263176E+04; //轨道长半轴的平方根(根号a)long double toe=0.720000000000E+04; //观测时刻toelong double m0=-0.290282040486E+00; //参考时刻toe的平近点角long double e=0.678421219345E-02; //轨道偏心率elong double delta_n=0.451411660250E-08;//卫星的摄动改正数△nlong double smallomega=-0.258419417299E+01;//近地点角距ωlong double cus=0.912137329578E-05;//纬度幅角正弦调和项改正的振幅(弧度)long double cuc=0.189989805222E-06;//纬度幅角余弦调和项改正的振幅(弧度)long double crs=0.406250000000E+01;//轨道半径的余弦调和项改正的振幅(m)long double crc=0.201875000000E+03;//轨道半径的正弦调和项改正的振幅(m)long double cis=0.949949026108E-07;//轨道倾角的余弦调和项改正的振幅(弧度)long double cic=0.130385160446E-07;//轨道倾角的正弦调和项改正的振幅(弧度)long double idot=-0.253939149013E-09;//轨道倾角变化率Ilong double i0=0.958512160302E+00; //轨道倾角(弧度)long double bigomega0=-0.137835982556E+01;//升交点赤经long double earthrate=bOMEGAE84; //地球自转的速率welong double bigomegadot=-0.856928551657e-08;long double t=0.720000000000E+04; //加入卫星钟差改正的归化时间long double A;long double n0=0,n,tk;long double mk,ek,tak,ik,omegak,phik,uk,rk;long double corr_u,corr_r,corr_i;long double xpk,ypk,xk,yk,zk;int i;printf("输入的数据:\n");printf("√a=%e \n",roota);printf("toe=%e \n",toe);printf("e=%e \n",e);printf("i0=%e \n",i0);printf("ω=%e \n",smallomega);printf("△n=%e \n",delta_n);printf("Ω0=%e \n",bigomega0);printf("I=%e \n",idot);printf("Cuc=%e \n",cuc);printf("Cus=%e \n",cus);printf("Crc=%e \n",crc);printf("Crs=%e \n",crs);printf("Cic=%e \n",cic);printf("Cis=%e \n",cis);printf("\n\n输出的结果为:\n",e);A=roota*roota;n0=sqrt(bGM84/(A*A*A));//平均角速度n0printf("n0=%.10lf \n",n0);tk=t-toe;//相对于参考时刻toe的归化时间tkprintf("tk=%.10lf \n",tk);n=n0+delta_n;//加摄动改正后的卫星平均角速度printf(" n=%.10lf \n",n);mk=m0+n*tk;//卫星平近点角printf("mk=%.10lf \n",mk);ek=mk;for(i=0;i<10;i++) ek=mk+e*sin(ek);//利用迭代法求偏近点角ekprintf("ek=%.10lf \n",ek);tak=atan2(sqrt(1.0-e*e)*sin(ek)/cos(ek)-e);//真近点角Vk的计算printf("Vk=%.10lf \n",tak);phik=tak+smallomega;//升交距角φk的计算printf("φk=%.10lf \n",phik);corr_u=cus*sin(2.0*phik)+cuc*cos(2.0*phik);//升交距角u的摄动改正δu printf("δu=%.10lf \n",corr_u);corr_r=crs*sin(2.0*phik)+crc*cos(2.0*phik);//卫星矢量r的摄动改正δr printf("δr=%.10lf \n",corr_r);corr_i=cis*sin(2.0*phik)+cic*cos(2.0*phik);//轨道倾角i的摄动改正δi printf("δi=%.10lf \n",corr_i);uk=phik+corr_u;//升交距角uprintf("uk=%.10lf \n",uk);rk=A*(1.0-e*cos(ek))+corr_r;//卫星矢量rprintf("rk=%.10lf \n",rk);ik=i0+idot*tk+corr_i;//轨道倾角iprintf("ik=%.10lf \n",ik);xpk=rk*cos(uk);//卫星在轨道平面坐标系的坐标ypk=rk*sin(uk);printf("xpk=%.10lf \n",xpk);printf("ypk=%.10lf \n",ypk);omegak=bigomega0+(bigomegadot-earthrate)*tk-earthrate*toe;//升交点经度Ωk的计算printf("Ωk=%.10lf \n\n",omegak);xk=xpk*cos(omegak)-ypk*sin(omegak)*cos(ik);//地心固定坐标系的直角坐标yk=xpk*sin(omegak)+ypk*cos(omegak)*cos(ik);zk=ypk*sin(ik);printf("Xk=%.4lf \n",xk);printf("Yk=%.4lf \n",yk);printf("Zk=%.4lf \n",zk);}。
GPS数据解析GPS 数据格式(NMEA-0183协议)GPS上电后,每隔一定的时间就会返回一定格式的数据,数据格式为:$信息类型,x,x,x,x,x,x,x,x,x,x,x,x,x每行开头的字符都是‘$’,接着是信息类型,后面是数据,以逗号分隔开。
一行完整的数据如下:$GPRMC,080655.00,A,4546.40891,N,12639.65641,E,1.045,328.42,170809,,,A*60信息类型为:GPGSV:可见卫星信息GPGLL:地理定位信息GPRMC:推荐最小定位信息GPVTG:地面速度信息GPGGA:GPS定位信息GPGSA:当前卫星信息1、 GPS DOP and Active Satellites(GSA)当前卫星信息$GPGSA,<1>,<2>,<3>,<3>,,,,,<3>,<3>,<3>,<4>,<5>,<6>,<7><CR><LF><1>模式:M = 手动, A = 自动。
<2>定位型式 1 = 未定位, 2 = 二维定位, 3 = 三维定位。
<3>PRN 数字:01 至 32 表天空使用中的卫星编号,最多可接收12颗卫星信息。
<4> PDOP位置精度因子(0.5~99.9)<5> HDOP水平精度因子(0.5~99.9)<6> VDOP垂直精度因子(0.5~99.9)<7> Checksum.(检查位).2、 GPS Satellites in View(GSV)可见卫星信息$GPGSV, <1>,<2>,<3>,<4>,<5>,<6>,<7>,?<4>,<5>,<6>,<7>,<8><CR><LF><1> GSV语句的总数<2> 本句GSV的编号<3> 可见卫星的总数,00 至 12。
GPS数据解析源代码/* 结构体定义-- ------------------------------------------------------------------*/struct GPS_TIME{long int year;//长整型long int month;long int day;long int hour;long int minute;long int second;};struct GPS_GPGGA//GPS定位信息{char Command[7];//¥GPGGA,GPS定位信息char UTC[7];//hhmmss.ss世界时间,北京时间=UTC+8小时char WD[10];//ddmm.mmmm纬度char WDNS[2];//N/S纬度char JD[11];//dddmm.mmmm经度char JDWE[2];//W/E经度char POS_STATUS[2];//GPS质量指示,0:未定位,1:定位,2:差分定位char WXS[3];//0-12使用到的卫星数char HDOP[4];//0.5-99.9水平精确度char WH[6];//-9999.9-9999.9天线离海平面的高度char DA1[2];//天线高度单位mchar DH[5];//地理高度char DA2[4];//地理高度单位mchar SUM[3];//校验和};struct GPS_GPRMC//推荐最小数据量的GPS具体内容传输数据{unsigned char Command[7];//¥GPRMC,GPS最小定位信息unsigned char UTC[7];//世界时间unsigned char VA[2];//定位状态,A:未定位,V:定位unsigned char WD[9];//维度unsigned char WDNS[2];//维度,N:北纬,S:南纬unsigned char JD[10];//经度unsigned char JDWE[2];//经度,E:东经,W:西经unsigned char SPEED[6];//对地速度,单位为节,1节=1852m/hunsigned char XHQD[6];//方位角unsigned char DATE[9];//日期unsigned char SUM[3];//校验和};struct GPD_INF//从各个语句中解析出来的数据装入此结构体中{unsigned char VA;//定位状态,A:未定位,V:定位unsigned char WDNS;//double WD;//unsigned char JDWE;//double JD;//unsigned char POS_STATUS;//GPS质量指示,0:未定位,1:定位,2:差分定位unsigned char WXS;//使用到的卫星数float HDOP;//水平方向的定位精度劣化程序系数float SPEED;//对地速度,单位为节,1节=1852m/hfloat XHQD;//方位角struct GPS_TIME TIME;//时间日期};/************************************************************** ****************** 函数名称 : GPS_S()* 函数功能 : 对数据帧进行子串化* 输入 : char *s* 输出 : None* 返回值 : 1* 备注 : 将数据中的“,”替换成'\0' ,将整个字符串分割为若干个字符串。
摘要GPS是利用卫星,在全球范围内实时进行定位、导航的系统,目前可以说是最热门、最受人瞩目的一项科技。
它具有在海、陆、空进行全方位实时三维导航与定位能力,并提供实时、全天候和全球性的导航服务。
所以,船舶可以根据GPS的解析信息来确保稳定而精确最佳航线。
随着科技的迅速发展,各种新型的航海仪器均已实现了数字化和计算机化,目前各种航海仪器之间的通信一班采用NMEA-0183接口。
NMEA-0183现已成为GPS导航设备统一的标准协议,主要包括GPGGA,GPRMC,GPVTG,GPGSV,GPZDA等语句格式,其中GPVTG的功能就是解析卫星信号中的对地速度信息,将其信号序列变为非专业人员可读取的文字。
本文针对当前比较普及的GPS系统,介绍了GPS通信的NMEA-0183协议、GPVTG信息解析的实现方法。
关键字:GPS NMEA-0183协议 GPVTG目录前言 (1)第1章绪论 (2)1.1 GPS定位系统原理 (2)1.2 C语言编程特点 (3)第2章NMEA-0183协议的简介 (4)2.1 NMEA-0183协议的格式定义 (4)2.2 NMEA-0183的应用领域 (5)2.3 NMEA-0183数据处理中的注意事项 (5)第3章设计方案 (6)3.1 主要方案思路及步骤 (6)3.1.1主流程图 (6)3.1.2调用函数流程图: (7)3.1.3解析程序的编写及流程图 (7)3.2程序的编写及调试结果 (8)3.2.1 最终程序及其注解 (8)3.2.2调试步骤及显示结果 (11)3.3文本输出显示结果: (13)第4章小结 (14)4.1 设计中遇到的问题及解决方案 (14)4.2心得体会 (15)[参考文献] (17)前言GPS系统是美国研制的全球性、全天候的卫星导航系统。
它主要是为陆、海、空三大领域提供实时、全天候和全球性的导航服务,并用于情报收集、核爆监测和应急通讯等一些军事目的;其基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置;主要特点有:高精度、全天候、高效率、多功能、操作简便、应用广泛等。
GPS数据提取解析源码GPS source data extraction analysis, we can refer to learn fromGPS数据解析数据拆分\坐标转换\显示线路图\源代码逐条读取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 序号0CString 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.0000Miniute = 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 sdouble 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; //正算结果:坐标xOutMyY = MyPrj.y; //结果:坐标yCString 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);}。