GpsSet.cpp
上传用户:jc6688
上传日期:2013-05-06
资源大小:344k
文件大小:5k
源码类别:

GPS编程

开发平台:

Visual C++

  1. // GpsSet.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MapDemo.h"
  5. #include "GpsSet.h"
  6. #include "math.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CGpsSet
  14. #define OFFSETTEST   5
  15. IMPLEMENT_DYNCREATE(CGpsSet, CCmdTarget)
  16. CGpsSet::CGpsSet()
  17. {
  18. StartX=0.0;
  19. StartY=0.0;
  20. dSpeed=2000;
  21. dDirectory=0;
  22. m_dCX=0;
  23. m_dCY=0;
  24. strName="GPS";
  25. m_nFeaID=0;
  26. }
  27. CGpsSet::~CGpsSet()
  28. {
  29. }
  30. BEGIN_MESSAGE_MAP(CGpsSet, CCmdTarget)
  31. //{{AFX_MSG_MAP(CGpsSet)
  32. // NOTE - the ClassWizard will add and remove mapping macros here.
  33. //}}AFX_MSG_MAP
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CGpsSet message handlers
  37. void CGpsSet::Serialize(CArchive& ar) 
  38. {
  39. if (ar.IsStoring())
  40. { // storing code
  41. }
  42. else
  43. { // loading code
  44. }
  45. }
  46. void CGpsSet::SetStartXY(double X, double Y)
  47. {
  48. StartX=X;
  49. StartY=Y;
  50. }
  51. void CGpsSet::UpdateGraph(CMapXLayer &layer)
  52. {
  53. UpdateFeature(layer.GetFeatureByID(m_nFeaID));
  54. }
  55. void CGpsSet::UpdateFeature(CMapXFeature &feature)
  56. {
  57. CMapXPoint point;
  58. point.CreateDispatch(point.GetClsid()); //Creates a dispatch for the point
  59. point.Set(m_dCX,m_dCY); 
  60. feature.SetPoint(point.m_lpDispatch);
  61. feature.Update();
  62. CMapXStyle style=feature.GetStyle();
  63. if(style.GetSymbolFontRotation()!=(short)dDirectory)
  64. {
  65. style.SetSymbolFontRotation((short)dDirectory);
  66. feature.SetStyle(style.m_lpDispatch);
  67. feature.Update();
  68. }
  69. }
  70. CMapXFeature CGpsSet::FindFeature(CMapXLayer &layer)
  71. {
  72. return layer.GetFeatureByID(m_nFeaID);
  73. }
  74. void CGpsSet::AddFeature(CMapX* pMapX,CMapXLayer &layer)
  75. {
  76. CMapXPoint point;
  77. point.CreateDispatch(point.GetClsid());
  78. CMapXFeatureFactory cFactory=pMapX->GetFeatureFactory();
  79. point.Set(StartX,StartY);
  80. m_dCX=StartX;
  81. m_dCY=StartY;
  82. COleVariant vtPoint;
  83. vtPoint.vt = VT_DISPATCH;
  84. vtPoint.pdispVal = point.m_lpDispatch;
  85. vtPoint.pdispVal->AddRef();
  86. CMapXStyle style=layer.GetStyle();
  87. style.SetSymbolFontRotation((short)dDirectory);
  88.     COleVariant vtstyle;
  89. vtstyle.vt = VT_DISPATCH;
  90. vtstyle.pdispVal = style.m_lpDispatch;
  91. vtstyle.pdispVal->AddRef();
  92. CMapXFeature feature=cFactory.CreateSymbol(vtPoint,vtstyle); 
  93.     
  94. layer.AddFeature(feature);
  95. CMapXFeatures features=layer.AllFeatures();
  96. CMapXFeature fea=features.Item(features.GetCount());
  97. m_nFeaID=fea.GetFeatureID(); 
  98.     layer.SetKeyField("Name");  
  99. fea.SetKeyValue(strName);
  100. fea.Update();
  101. CString strValue;
  102.     layer.SetKeyField("StartX");  
  103. strValue.Format(_T("%10.5f"),StartX);
  104. fea.SetKeyValue(strValue);
  105.     fea.Update();
  106. layer.SetKeyField("StartY");  
  107. strValue.Format(_T("%10.5f"),StartY);
  108. fea.SetKeyValue(strValue);
  109.     fea.Update();
  110. layer.SetKeyField("方向");  
  111. strValue.Format(_T("%10.5f"),dDirectory);
  112. fea.SetKeyValue(strValue);
  113.     fea.Update();
  114. layer.SetKeyField("速度");  
  115. strValue.Format(_T("%10.5f"),dSpeed);
  116. fea.SetKeyValue(strValue);
  117. fea.Update();
  118. }
  119. void CGpsSet::Run()
  120. {
  121. double dx,dy;
  122. dx=dSpeed*sin(dDirectory*0.01745329)*3/(3600*60);
  123. dy=dSpeed*cos(dDirectory*0.01745329)*3/(3600*60);
  124. m_dCX=m_dCX+dx;
  125. m_dCY=m_dCY+dy;
  126. }
  127. BOOL CGpsSet::HitTest(double x, double y,CMapX* pMapX)
  128.  
  129. {
  130.     
  131. float sX,sY;
  132. pMapX->ConvertCoord(&sX,&sY,&m_dCX,&m_dCY,miMapToScreen);
  133. double dx=fabs((double)sX-x);
  134. double dy=fabs((double)sY-y);
  135. if(dx<OFFSETTEST&&dy<OFFSETTEST) return TRUE;
  136. else return FALSE;
  137. }
  138. /////////////////////////////////////////////////////////////////////////////
  139. // CGpsSetArray
  140. IMPLEMENT_DYNCREATE(CGpsSetArray, CCmdTarget)
  141. CGpsSetArray::CGpsSetArray()
  142. {
  143. }
  144. CGpsSetArray::~CGpsSetArray()
  145. {
  146. }
  147. BEGIN_MESSAGE_MAP(CGpsSetArray, CCmdTarget)
  148. //{{AFX_MSG_MAP(CGpsSetArray)
  149. // NOTE - the ClassWizard will add and remove mapping macros here.
  150. //}}AFX_MSG_MAP
  151. END_MESSAGE_MAP()
  152. /////////////////////////////////////////////////////////////////////////////
  153. // CGpsSetArray message handlers
  154. void CGpsSetArray::AddTarget(CGpsSet *target)
  155. {
  156. m_ObjectList.Add((CObject*)target);
  157. }
  158. CGpsSet* CGpsSetArray::GetTarget(int nIndex)
  159. {
  160.    return (CGpsSet*)m_ObjectList[nIndex];
  161. }
  162. void CGpsSetArray::DeleteAllTarget()
  163. {
  164. for(int i=0;i<m_ObjectList.GetSize();i++)
  165.  delete m_ObjectList[i];
  166. m_ObjectList.RemoveAll();
  167. }
  168. void CGpsSetArray::Run()
  169. {
  170. for(int i=0;i<m_ObjectList.GetSize();i++)
  171. {
  172. CGpsSet* pTarget=GetTarget(i);
  173. pTarget->Run();
  174. }
  175. }
  176. void CGpsSetArray::UpdateGraph(CMapXLayer &layer)
  177. {
  178. for(int i=0;i<m_ObjectList.GetSize();i++)
  179. {
  180. CGpsSet* pTarget=GetTarget(i);
  181. pTarget->UpdateGraph(layer);
  182. }
  183. }
  184. CGpsSet* CGpsSetArray::HitTest(double X, double Y,CMapX* pMapX)
  185. {
  186. for(int i=0;i<m_ObjectList.GetSize();i++)
  187. {
  188. CGpsSet* pTarget=GetTarget(i);
  189. if(pTarget->HitTest(X,Y,pMapX))
  190. return pTarget;
  191. }
  192. return NULL;
  193. }
  194. void CGpsSetArray::SetActiveTarget(CGpsSet *pTarget)
  195. {
  196. m_pActiveTarget=pTarget;
  197. }
  198. CGpsSet* CGpsSetArray::GetActiveTarget()
  199. {
  200.     return m_pActiveTarget;
  201. }