landmark.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. #include "landmark.h"
  2. #include <cfloat>
  3. #include "db_api/CDBSingletonDefine.h"
  4. #include "log.h"
  5. Landmark_list * Landmark_list::instance()
  6. {
  7. static Landmark_list lm_list;
  8. return &lm_list;
  9. }
  10. void Landmark_list::init_mapDirection()
  11. {
  12. const char * sql = "select map_direction_id, map_id, north_angle from dat_map_direction;";
  13. std::string Error;
  14. YADB::CDBResultSet DBRes;
  15. sDBConnPool.Query(sql,DBRes,Error);
  16. int nCount = DBRes.GetRecordCount( Error );
  17. if (nCount > 0)
  18. {
  19. log_info( "init_map_direction. The record count=%d\n", nCount );
  20. while ( DBRes.GetNextRecod(Error) )
  21. {
  22. int map_id = 0;
  23. DBRes.GetField( "map_id",map_id, Error );
  24. int north_angle = 0;
  25. DBRes.GetField( "north_angle",north_angle, Error );
  26. std::shared_ptr<map_direction> md = std::make_shared<map_direction>(map_id,north_angle);
  27. m_map.insert({map_id,md});
  28. log_info("map_direction.....mapid:%d,north:%d",map_id,north_angle);
  29. }
  30. }
  31. }
  32. void Landmark_list::init_from_db()
  33. {
  34. init_landmarkInfo();
  35. init_mapDirection();
  36. }
  37. void Landmark_list::init_landmarkInfo(int id/*=-1*/)
  38. {
  39. std::string sql = "select landmark_id, name, map_id, area_id, x, y, z from dat_landmark";
  40. if (-1 == id)
  41. {
  42. sql += ";";
  43. }
  44. else
  45. {
  46. sql += " WHERE landmark_id=" + std::to_string(id) +";";
  47. }
  48. std::string Error;
  49. YADB::CDBResultSet DBRes;
  50. sDBConnPool.Query(sql.c_str(),DBRes,Error);
  51. int nCount = DBRes.GetRecordCount( Error );
  52. std::lock_guard<std::mutex> lock(m_mutex);
  53. if (nCount > 0)
  54. {
  55. log_info( "init_landmark_info. The record count=%d\n", nCount );
  56. while ( DBRes.GetNextRecod(Error) )
  57. {
  58. int landmark_id = 0;
  59. DBRes.GetField( "landmark_id",landmark_id, Error );
  60. std::string name;
  61. DBRes.GetField( "name",name, Error );
  62. int map_id = 0;
  63. DBRes.GetField( "map_id",map_id, Error );
  64. int area_id = 0;
  65. DBRes.GetField( "area_id",area_id, Error );
  66. double x = 0;
  67. DBRes.GetField( "x",x, Error );
  68. double y = 0;
  69. DBRes.GetField( "y",y, Error );
  70. double z = 0;
  71. DBRes.GetField( "z",z, Error );
  72. point p(x,y,z);
  73. std::shared_ptr<LandmarkInfo> landmark = std::make_shared<LandmarkInfo>(p, landmark_id, name, map_id, area_id);
  74. if (-1 == id)
  75. {
  76. m_v.push_back(landmark);
  77. log_info("landmark ......id:%d,name:%s,mapid:%d,area_id:%d,x:%.2f,y:%.2f,z:%.2f", landmark_id, name.c_str(), map_id, area_id, x, y, z);
  78. }
  79. else
  80. {
  81. bool befind = false;
  82. for (size_t i = 0; i < m_v.size(); i++)
  83. {
  84. if (m_v[i]->landmark_id==id)
  85. {
  86. m_v[i]->set(p);
  87. m_v[i]->landmark_id = landmark_id;
  88. m_v[i]->landmark_name = name;
  89. m_v[i]->map_id = map_id;
  90. m_v[i]->area_id = area_id;
  91. befind = true;
  92. log_info("update landmark ......id:%d,name:%s,mapid:%d,area_id:%d,x:%.2f,y:%.2f,z:%.2f", landmark_id, name.c_str(), map_id, area_id, x, y, z);
  93. break;
  94. }
  95. }
  96. if (!befind)
  97. {
  98. log_info("add landmark ......id:%d,name:%s,mapid:%d,area_id:%d,x:%.2f,y:%.2f,z:%.2f", landmark_id, name.c_str(), map_id, area_id, x, y, z);
  99. m_v.push_back(landmark);
  100. }
  101. break;
  102. }
  103. }
  104. }
  105. }
  106. void Landmark_list::remove_landmarkInfo(int id)
  107. {
  108. std::lock_guard<std::mutex> lock(m_mutex);
  109. std::vector<std::shared_ptr<LandmarkInfo>>::iterator it_s = m_v.begin();
  110. while (it_s!= m_v.end())
  111. {
  112. if ((*it_s)->landmark_id == id)
  113. {
  114. m_v.erase(it_s);
  115. log_info("delete landmark ......id:%d,name:%s", (*it_s)->landmark_id, (*it_s)->landmark_name);
  116. break;
  117. }
  118. it_s++;
  119. }
  120. }
  121. std::tuple<int,int,double> Landmark_list::get(int mapid ,int areaid,const point &pt)
  122. {
  123. int32_t id = -1;
  124. double dis = DBL_MAX;
  125. point p;
  126. std::lock_guard<std::mutex> lock(m_mutex);
  127. for(const auto &lm : m_v)
  128. {
  129. if(lm->area_id == areaid)
  130. {
  131. double tmp = pt.dist(*lm);
  132. if(tmp < dis)
  133. {
  134. id = lm->landmark_id;
  135. dis=tmp;
  136. p=*lm;
  137. }
  138. }
  139. }
  140. if(id==-1)
  141. return std::make_tuple(0,0,0);
  142. int dir = GetDirectionType(pt,p,mapid);
  143. return std::make_tuple(id,dir,dis);
  144. }
  145. DIRECTION_TYPE Landmark_list::GetDirectionType(point card_point, point landmark_point, int map_id)
  146. {
  147. DIRECTION_TYPE direction = NODIRECTORY;
  148. int x_offset = 0;
  149. int y_offset = 0;
  150. int angle = 0;
  151. x_offset = card_point.x - landmark_point.x;
  152. y_offset = card_point.y - landmark_point.y;
  153. if(abs(x_offset) < 1)
  154. x_offset = 0;
  155. if(abs(y_offset) < 1)
  156. y_offset = 0;
  157. std::shared_ptr<map_direction> pMapDirectoryInfo = nullptr;
  158. auto it = m_map.find(map_id);
  159. if(it == m_map.end())
  160. {
  161. return NODIRECTORY;
  162. }
  163. else
  164. {
  165. pMapDirectoryInfo = it->second;
  166. }
  167. if(0 == y_offset)
  168. {
  169. if(x_offset > 0)
  170. angle = pMapDirectoryInfo->north_angle + 0;
  171. if(x_offset < 0)
  172. angle = pMapDirectoryInfo->north_angle - 180;
  173. }
  174. else if(0 == x_offset)
  175. {
  176. if(y_offset < 0)
  177. angle = pMapDirectoryInfo->north_angle - 90;
  178. if(y_offset > 0)
  179. angle = pMapDirectoryInfo->north_angle + 90;
  180. }
  181. else if(abs(x_offset) >= abs(y_offset))
  182. {
  183. if(x_offset > 0)
  184. angle = pMapDirectoryInfo->north_angle + 0;
  185. if(x_offset < 0)
  186. angle = pMapDirectoryInfo->north_angle - 180;
  187. }
  188. else
  189. {
  190. if(y_offset < 0)
  191. angle = pMapDirectoryInfo->north_angle - 90;
  192. if(y_offset > 0)
  193. angle = pMapDirectoryInfo->north_angle + 90;
  194. }
  195. direction = (DIRECTION_TYPE)((angle % 360) / 90);
  196. if(angle % 360 == 0)
  197. direction = NORTH;
  198. if((0 == y_offset) && (0 == x_offset))
  199. direction = NODIRECTORY;
  200. return direction;
  201. }