XLine.cpp
上传用户:yokoluohf
上传日期:2013-02-25
资源大小:769k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "XLine.h"
  3. #include "XStations.h"
  4. XLine::XLine()
  5. {
  6. id = -1;
  7. name = "";
  8. isOneWay = false;
  9. }
  10. XLine::~XLine()
  11. {
  12. }
  13. XLine& XLine::operator = (const XLine& line)
  14. {
  15. if (&line == this) return *this;
  16. id = line.id;
  17. name = line.name;
  18. isOneWay = line.isOneWay;
  19. spots = line.spots;
  20. return *this;
  21. }
  22. bool XLine::operator == (const XLine& line)
  23. {
  24. return  (id  == line.id);
  25. }
  26. bool XLine::IsInRect (float left, float top, float right, float bottom)
  27. {
  28. for (size_t i = 0; i < spots.size();i++)
  29. {
  30. PointF position = spots[i].GetPosition ();
  31. if (position.X >= left && position.X <= right
  32. && position.Y >= top && position.Y <= bottom)
  33. return true;
  34. }
  35. return false;
  36. }
  37.  
  38. int XLine::Append (XSpot& vSpot)
  39. {
  40. spots.push_back(vSpot);
  41. return (int)spots.size();
  42. }
  43. int XLine::Remove (XSpot& vSpot)
  44. {
  45. vector<XSpot>::iterator pos;
  46. pos = find (spots.begin(),spots.end(),vSpot);
  47. //if (pos != spots.end())
  48. spots.erase (pos);
  49. return -1;
  50. }
  51. int XLine::ToTube (RectF rect, XTube& tube)
  52. {
  53. tube.GetSpots ().clear ();
  54. size_t start = 0, end = 0;
  55. for (start = 0; start < spots.size(); start++)
  56. {
  57. if (rect.Contains(spots[start].GetPosition ()))
  58. break;
  59. }
  60. for (end = spots.size()-1; end > start; end--)
  61. {
  62. if (rect.Contains(spots[start].GetPosition ()))
  63. break;
  64. }
  65. if (start > end) return 0;
  66. if (start > 0) start --;
  67. if (end < spots.size () -1) end ++;
  68. for (size_t i = start; i <= end; i ++)
  69. tube.Append (spots[i]);
  70. return tube.GetCount ();
  71. }
  72. int  XLine::GetCount()
  73. {   
  74. return (int) spots.size();;
  75. }
  76. int XLine::ToXML (CMarkup& markup)
  77. {
  78. /*
  79. markup.AddChildAttr ("name", name);
  80. markup.AddChildElem ("stations");
  81. markup.IntoElem (); 
  82. for (int i = 0; i < size(); i++)
  83. {
  84. markup.AddChildElem ("station");
  85. markup.AddChildAttr ("name", name);
  86. markup.AddChildAttr ("longitude", position.X);
  87. markup.AddChildAttr ("latitude", position.Y);
  88. markup.AddChildAttr ("type", type);
  89. }
  90. markup.OutOfElem();
  91. */
  92. return 0;
  93. }
  94. int XLine::FromXML (CMarkup& markup)
  95. {
  96. name = markup.GetChildAttr("name");
  97. if (markup.GetChildAttr("oneway") == "true")
  98. isOneWay = true; 
  99. else 
  100. isOneWay = false;
  101. markup.IntoElem ();
  102. if (markup.FindChildElem("stations") )
  103. {
  104. markup.IntoElem ();
  105. while(markup.FindChildElem("station"))
  106. {
  107. PointF position;
  108. SpotTypeEnum type;
  109. CString vName = markup.GetChildAttr("name");
  110. position.X = float(atof(markup.GetChildAttr("longitude"))-116.0)*10000;
  111. position.Y = float(40.0 - atof(markup.GetChildAttr("latitude")))*10000;
  112. if (vName.IsEmpty())
  113. type = STE_NULL;
  114. else
  115. type = STE_SMALL_CIRCLE;
  116. Append(XSpot (position, type, vName));
  117. }
  118. markup.OutOfElem();
  119. }
  120. markup.OutOfElem();
  121. return 0;
  122. }