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

GIS编程

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "XLines.h"
  3. XLines::XLines()
  4. {
  5. }
  6. XLines::~XLines()
  7. }
  8. int XLines::Append (const XLine& obj)
  9. {
  10. //push_back(obj);
  11. (*this) [obj.name] = obj;
  12. return (int)size();
  13. }
  14. int XLines::Remove (const XLine& obj)
  15. {
  16. iterator pos;
  17. pos = find(obj.name);
  18. if (pos != end())
  19. erase (pos);
  20. return (int)size();
  21. }
  22. XLine* XLines::Find (const CString name)
  23. {
  24. iterator pos;
  25. pos = find(name);
  26. if (pos != end())
  27. return & ((*this) [name]);
  28. else
  29. return NULL;
  30. }
  31. int XLines::BuildStations(XStations& stationsMap)
  32. {
  33. for (XLines::iterator pos = begin(); pos != end(); pos ++ )
  34. {
  35. for(int i = 0; i < pos->second.GetCount(); i++)
  36. {
  37. XStation* station = stationsMap.Find(pos->second.spots[i].GetName());
  38. if (station)
  39. {
  40. station->Append(pos->second.name);
  41. }
  42. else
  43. {
  44. XStation station;
  45. station.name = pos->second.spots[i].GetName();
  46. station.position = pos->second.spots[i].GetPosition();
  47. station.Append(pos->second.name);
  48. stationsMap [pos->second.spots[i].GetName()] = station;
  49. }
  50. }
  51. }
  52. return stationsMap.GetCount ();
  53. }
  54. int XLines::GetCount ()
  55. {
  56. return (int) size();
  57. }
  58. int XLines::FromXML (CMarkup& markup)
  59. {
  60. while (markup.FindChildElem("line"))  { XLine line; line.FromXML(markup); Append(line); }
  61. markup.OutOfElem();
  62. BuildStations (allStations);
  63. return 0;
  64. }
  65. int XLines::ToXML (CMarkup& markup)
  66. {
  67. /*
  68. //保存线路信息
  69. markup.IntoElem (); 
  70. for (size_t i = 0; i < size(); i++)
  71. at(i).ToXML(markup);
  72. markup.OutOfElem();
  73. */
  74. return 0;
  75. }
  76. int XLines::Merge (const vector<CString>& lines, vector<CString>& stations)
  77. {
  78. stations.clear ();
  79. for (size_t i = 0; i < lines.size (); i ++)
  80. {
  81. //lines [i]
  82. XLine* line = Find (lines [i]);
  83. if (line)
  84. {
  85. for (size_t j = 0; j < line->spots.size (); j ++)
  86. {
  87. if (line->spots [j].GetName () != "")
  88. stations.push_back (line->spots [j].GetName ());
  89. }
  90. }
  91. }
  92. sort (stations.begin (), stations.end ());
  93. vector<CString>::iterator pos = unique (stations.begin (), stations.end ());
  94. stations.erase (pos, stations.end ());
  95. return (int) stations.size ();
  96. }
  97. vector<CString> XLines::Intersection(const CString vStation1, const CString vStation2)
  98. {
  99. XStation* pStation1 = allStations.Find (vStation1);
  100. XStation* pStation2 = allStations.Find (vStation2);
  101. vector<CString> lines (1024);
  102. if (pStation1 && pStation2)
  103. {
  104. //找直达线路
  105. vector<CString> lines1 = pStation1->lines;
  106. vector<CString> lines2 = pStation2->lines;
  107. sort (lines1.begin (), lines1.end ());
  108. sort (lines2.begin (), lines2.end ());
  109. vector<CString>::iterator pos = set_intersection (lines1.begin(), lines1.end(),
  110. lines2.begin(), lines2.end(), lines.begin());
  111. lines.erase (pos);
  112. }
  113. return lines;
  114. }
  115. vector<XPath> XLines::Find (const CString vStation1, const CString vStation2, int type)
  116. {
  117. vector<XPath> paths;
  118. XStation* pStation1 = allStations.Find (vStation1);
  119. XStation* pStation2 = allStations.Find (vStation2);
  120. if (pStation1 && pStation2)
  121. {
  122. //1, 找直达线路
  123. vector<CString> lines;
  124. lines = Intersection (vStation1, vStation2);
  125. for (size_t i = 0; i < lines.size (); i ++)
  126. {
  127. XLine* line = Find (lines [i]);
  128. if (line)
  129. {
  130. XPath path (*line, vStation1, vStation2);
  131. if (path.lines == 1) 
  132. paths.push_back(path);
  133. }
  134. }
  135. //2, 经过一个中转站
  136. for (size_t i = 0; i < pStation1->lines.size (); i ++)
  137. {
  138. for (size_t j = 0; j < pStation2->lines.size (); j ++)
  139. {
  140. XLine* line1 = Find (pStation1->lines [i]);
  141. XLine* line2 = Find (pStation2->lines [j]);
  142. if (line1 && line2)
  143. {
  144. //判断是否包含直达线路
  145. bool bNonstop = false;
  146. for (size_t k = 0; k < line1->spots.size (); k ++)
  147. {
  148. if (line1->spots [k].GetName () == vStation2)
  149. {
  150. bNonstop = true;
  151. break;
  152. }
  153. }
  154. for (size_t k = 0; k < line2->spots.size (); k ++)
  155. {
  156. if (line2->spots [k].GetName () == vStation1)
  157. {
  158. bNonstop = true;
  159. break;
  160. }
  161. }
  162. if (!bNonstop)
  163. {
  164. XPath path (*line1, *line2, vStation1, vStation2, false);
  165. if (path.lines == 2)
  166. paths.push_back(path);
  167. XPath path2 (*line1, *line2, vStation1, vStation2, true);
  168. if (path2.lines == 2)
  169. paths.push_back(path2);
  170. }
  171. }
  172. }
  173. }
  174. }
  175. sort (paths.begin (), paths.end ());
  176. return paths;
  177. }