landmark.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "landmark.h"
  2. #include <cfloat>
  3. #include "db_api/CDBConnPool.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()
  38. {
  39. const char * sql = "select landmark_id, name, map_id, area_id, x, y, z from dat_landmark;";
  40. std::string Error;
  41. YADB::CDBResultSet DBRes;
  42. sDBConnPool.Query(sql,DBRes,Error);
  43. int nCount = DBRes.GetRecordCount( Error );
  44. if (nCount > 0)
  45. {
  46. log_info( "init_landmark_info. The record count=%d\n", nCount );
  47. while ( DBRes.GetNextRecod(Error) )
  48. {
  49. int landmark_id = 0;
  50. DBRes.GetField( "landmark_id",landmark_id, Error );
  51. std::string name;
  52. DBRes.GetField( "name",name, Error );
  53. int map_id = 0;
  54. DBRes.GetField( "map_id",map_id, Error );
  55. int area_id = 0;
  56. DBRes.GetField( "area_id",area_id, Error );
  57. double x = 0;
  58. DBRes.GetField( "x",x, Error );
  59. double y = 0;
  60. DBRes.GetField( "y",y, Error );
  61. double z = 0;
  62. DBRes.GetField( "z",z, Error );
  63. point p(x,y,z);
  64. std::shared_ptr<LandmarkInfo> landmark = std::make_shared<LandmarkInfo>(p,landmark_id,name,map_id,area_id);
  65. m_v.push_back(landmark);
  66. 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);
  67. }
  68. }
  69. }
  70. std::tuple<int,int,double> Landmark_list::get(int mapid ,int areaid,const point &pt)
  71. {
  72. int32_t id = -1;
  73. double dis = DBL_MAX;
  74. point p;
  75. for(const auto &lm : m_v)
  76. {
  77. if(lm->area_id == areaid)
  78. {
  79. double tmp = pt.dist(*lm);
  80. if(tmp < dis)
  81. {
  82. id = lm->landmark_id;
  83. dis=tmp;
  84. p=*lm;
  85. }
  86. }
  87. }
  88. if(id==-1)
  89. return std::make_tuple(0,0,0);
  90. int dir = GetDirectionType(pt,p,mapid);
  91. return std::make_tuple(id,dir,dis);
  92. }
  93. DIRECTION_TYPE Landmark_list::GetDirectionType(point card_point, point landmark_point, int map_id)
  94. {
  95. DIRECTION_TYPE direction = NODIRECTORY;
  96. int x_offset = 0;
  97. int y_offset = 0;
  98. int angle = 0;
  99. x_offset = card_point.x - landmark_point.x;
  100. y_offset = card_point.y - landmark_point.y;
  101. if(abs(x_offset) < 1)
  102. x_offset = 0;
  103. if(abs(y_offset) < 1)
  104. y_offset = 0;
  105. std::shared_ptr<map_direction> pMapDirectoryInfo = nullptr;
  106. auto it = m_map.find(map_id);
  107. if(it == m_map.end())
  108. {
  109. return NODIRECTORY;
  110. }
  111. else
  112. {
  113. pMapDirectoryInfo = it->second;
  114. }
  115. if(0 == y_offset)
  116. {
  117. if(x_offset > 0)
  118. angle = pMapDirectoryInfo->north_angle + 0;
  119. if(x_offset < 0)
  120. angle = pMapDirectoryInfo->north_angle - 180;
  121. }
  122. else if(0 == x_offset)
  123. {
  124. if(y_offset < 0)
  125. angle = pMapDirectoryInfo->north_angle - 90;
  126. if(y_offset > 0)
  127. angle = pMapDirectoryInfo->north_angle + 90;
  128. }
  129. else if(abs(x_offset) >= abs(y_offset))
  130. {
  131. if(x_offset > 0)
  132. angle = pMapDirectoryInfo->north_angle + 0;
  133. if(x_offset < 0)
  134. angle = pMapDirectoryInfo->north_angle - 180;
  135. }
  136. else
  137. {
  138. if(y_offset < 0)
  139. angle = pMapDirectoryInfo->north_angle - 90;
  140. if(y_offset > 0)
  141. angle = pMapDirectoryInfo->north_angle + 90;
  142. }
  143. direction = (DIRECTION_TYPE)((angle % 360) / 90);
  144. if(angle % 360 == 0)
  145. direction = NORTH;
  146. if((0 == y_offset) && (0 == x_offset))
  147. direction = NODIRECTORY;
  148. return direction;
  149. }