GPSParam.cpp
上传用户:fudaml
上传日期:2013-05-28
资源大小:211k
文件大小:6k
源码类别:

GPS编程

开发平台:

Visual C++

  1. // GPSParam.cpp: implementation of the GPSParam class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "GPSParam.h"
  6. #include "math.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. GPSParam::GPSParam(char str[],int length)
  16. {
  17. // char str[200];
  18. // memset( str,0,200 );
  19. SetParam(str,length);
  20. /*
  21. m_IsOK=false;
  22. if( length<30 ) //长度不够直接退出
  23. {
  24. m_IsOK=false;
  25. return;
  26. }
  27. int sectionID=0;
  28. for( int i=0; i<length; i++)
  29. {
  30. switch(str[i])
  31. {
  32. case '$':
  33. sectionID = 0;
  34. break;
  35. case ',':
  36. sectionID ++;
  37. break;
  38. case 10: //指令读完
  39. i=length;
  40. break;
  41. default:
  42. Data[ sectionID ] += str[i];
  43. }
  44. }
  45. */
  46. }
  47. GPSParam::~GPSParam()
  48. {
  49. }
  50. bool GPSParam::DataTransform()
  51. {
  52. m_name=Data[0];
  53. if(m_name == "GPRMC" && Data[2] == "A")
  54. {
  55. //下面提取出时间 经纬度 日期等
  56. char buff[20];
  57. CString str;
  58. //抽取时分秒
  59. if(Data[1].GetLength() !=9) //时间错误,
  60. return false;
  61. strcpy( buff,Data[1] );
  62. str.Format( "%c%c",buff[0],buff[1] ); //小时
  63. m_time.hour=atoi( str );
  64. str.Format( "%c%c",buff[2],buff[3] ); //分
  65. m_time.mimute=atoi( str );
  66. str.Format( "%c%c%c%c%c",buff[4],buff[5],buff[6],buff[7],buff[8] ); //秒
  67. m_time.second = atof( str );
  68. //抽取日期
  69. if( Data[9].GetLength() != 6) //日期错误
  70. return false;
  71. strcpy( buff,Data[9] );
  72. str.Format( "%c%c",buff[0],buff[1] );
  73. m_date.day = atoi( str );
  74. str.Format("%c%c",buff[2],buff[3] );
  75. m_date.month =  atoi( str );
  76. str.Format("%c%c",buff[4],buff[5] );
  77. m_date.year =  atoi( str );
  78. //抽取纬度
  79. if( Data[3].GetLength() != 10) //纬度错误
  80. return false;
  81. strcpy( buff,Data[3] );
  82. str.Format( "%c%c",buff[0],buff[1] );
  83. m_latitude = atoi( str );
  84. str.Format("%c%c%c%c%c%c%c%c",buff[2],buff[3],buff[4],buff[5],buff[6],buff[7],buff[8],buff[9]);
  85. m_latitude = m_latitude  +atof( str )/60.0;
  86. if( Data[4] == "S" )
  87. m_latitude *=-1;
  88. //抽取经度
  89. strcpy( buff , Data[5] );
  90. if( Data[5].GetLength() == 10 )
  91. {
  92. str.Format("%c%c",buff[0], buff[1] );
  93. m_longtitude =  atoi( str );
  94. str.Format("%c%c%c%c%c%c%c%c",buff[2],buff[3],buff[4],buff[5],buff[6],buff[7],buff[8],buff[9]);
  95. m_longtitude = m_longtitude +atof( str )/60.0;
  96. }
  97. else if( Data[5].GetLength() == 11 )
  98. {
  99. str.Format("%c%c%c",buff[0], buff[1] ,buff[2] );
  100. m_longtitude =  atoi( str );
  101. str.Format("%c%c%c%c%c%c%c%c",buff[3],buff[4],buff[5],buff[6],buff[7],buff[8],buff[9],buff[10] );
  102. m_longtitude = m_longtitude  +atof( str )/60.0;
  103. }
  104. else //经度错误
  105. return false;
  106. if( Data[6] == "W" )
  107. m_longtitude *= -1;
  108. GpsPoint p;
  109. p.SetBL(m_latitude,m_longtitude);
  110. p.BLtoXY();
  111. X=p.X;
  112. Y=p.Y;
  113. m_IsOK=true;
  114. return true;
  115. }
  116. else
  117. return false;
  118. return false;
  119. }
  120. GPSParam::GPSParam()
  121. {
  122. m_IsOK=false;
  123. }
  124. GpsPoint::GpsPoint()
  125. {
  126. L0=117+20.0/60.0;
  127. }
  128. GpsPoint::~GpsPoint()
  129. {
  130. }
  131. bool GpsPoint::SetXY(double x0, double y0)
  132. {
  133. if (true) //判断合法性
  134. {
  135. X=x0;
  136. Y=y0;
  137. return true;
  138. }
  139. }
  140. bool GpsPoint::SetBL(double b0, double l0)
  141. {
  142. if( b0>-90 && b0<90 && l0>-180 && l0<180 )  //判断经纬度的合法性
  143. {
  144. B=b0;
  145. L=l0;
  146. return true;
  147. }
  148. else
  149. return false;
  150. }
  151. bool GpsPoint::BLtoXY()
  152. {
  153. double l,t,ita2,m0,N;
  154. double Temp1,Temp2,Temp3,Temp4,Temp5,Temp6,Temp7,Temp8;
  155. double PAI=3.1415926535898;
  156. double a=6378245.0;
  157. double e2=0.00669342162297;
  158. double el2=0.00673852541468;
  159. double p2=3600.0*180.0/PAI;
  160. double P0=PAI/180.0;
  161. //54坐标系常熟
  162. double C0=6367558.49686;
  163. double C1=32005.79642;
  164. double C2=133.86115;
  165. double C3=0.7031;
  166. double temp1,temp2,temp3,temp4;//temp5;
  167. //高斯变换、
  168. l=(L-L0)*3600; //??????????
  169. t=tan(B*P0);
  170. temp1=t*t;
  171. ita2=el2*cos(B*P0)*cos(B*P0);
  172. temp2=ita2*ita2;
  173. N=a/sqrt(1-e2*sin(B*P0) *sin(B*P0));
  174. m0=l*cos(B*P0)/p2; //????????
  175. temp3=m0*m0;
  176. temp4=temp3*temp3;
  177. Temp1=N*m0;
  178. Temp2=C0*B*P0;
  179. Temp5=sin(B*P0) * sin(B*P0);
  180. Temp3=cos(B*P0)*sin(B*P0)*(C1+C2*Temp5+C3*Temp5*Temp5);
  181. Temp4=1.0/2.0*N*t*temp3;
  182. Temp5=1/24.0*(5.0-(temp1*temp1)+9*ita2+4*temp2*temp2 )*N*t*temp4;
  183. Temp6=1/720.0*(61-58*temp1+temp1*temp1)*N*t*temp3*temp4;
  184. Temp7=1/6.0*( 1-temp1+ita2 )*N*m0*temp3;
  185. Temp8=1/120.0*(5-18*temp1+temp1*temp1+14*temp2-58*ita2*temp1)*N*m0*temp4;
  186. X=Temp2+Temp3+Temp4+Temp5+Temp6;
  187. Y=500000+Temp1+Temp7+Temp8;
  188. return true;
  189. }
  190. bool GpsPoint::XYtoBL()
  191. {
  192. return true;
  193. }
  194. bool GpsPoint::BLtoXY_2()
  195. {
  196. double l,t,ita2,m0,N;
  197. double Temp1,Temp2,Temp3,Temp4,Temp5,Temp6;
  198. double PAI=3.1415926535898;
  199. double a=6378245.0;
  200. double e2=0.00669342162297;
  201. double el2=0.00673852541468;
  202. double p2=3600.0*180.0/PAI;
  203. double P0=PAI/180.0;
  204. //54坐标系常熟
  205. double C0=6367558.49686;
  206. double C1=32005.79642;
  207. double C2=133.86115;
  208. double C3=0.7031;
  209. //高斯变换、
  210. l=(L-L0); //??????????
  211. t=tan(B*P0);
  212. double t2=t*t;
  213. ita2=el2*cos(B*P0)*cos(B*P0);
  214. double ita4=ita2*ita2;
  215. N=a/sqrt(1-e2*sin(B*P0) *sin(B*P0));
  216. m0=l*cos(B*P0)/p2; //????????
  217. double m02=m0*m0;
  218. double m04=m02*m02;
  219. Temp1=sin(B*P0) * sin(B*P0);
  220. double X0
  221. =C0*B*P0+cos(B*P0)*sin(B*P0)*(C1+C2*Temp1+C3*Temp1*Temp1);
  222. Temp2=1.0/2.0*N*t*m02;
  223. Temp3=1/24.0*(5.0-(t2*t2)+9*ita2+4*ita4 )*N*t*m04;
  224. Temp4=1/720.0*(61-58*t2+t2*t2)*N*t*m02*m04;
  225. Temp5=1/6.0*( 1-t2+ita2 )*N*m0*m02;
  226. Temp6=1/120.0*(5-18*t2+t2*t2+14*ita2-58*ita2*t2)*N*m0*m04;
  227. X=X0+Temp1+Temp3+Temp4;
  228. Y=N*m0+Temp5+Temp6+500000;
  229. return true;
  230. }
  231. bool GPSParam::SetParam(char str[], int length)
  232. {
  233. m_IsOK=false;
  234. if( length<30 ) //长度不够直接退出
  235. {
  236. m_IsOK=false;
  237. return false;
  238. }
  239. int sectionID=0;
  240. for( int i=0; i<length; i++)
  241. {
  242. switch(str[i])
  243. {
  244. case '$':
  245. sectionID = 0;
  246. break;
  247. case ',':
  248. sectionID ++;
  249. break;
  250. case 10: //指令读完
  251. i=length;
  252. break;
  253. default:
  254. Data[ sectionID ] += str[i];
  255. }
  256. }
  257. return true;
  258. }
  259. bool GPSParam::IsOk()
  260. {
  261. return m_IsOK;
  262. }