诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

83 lines
2.0 KiB

  1. #include "stdafx.h"
  2. #include "BaiDuMap.h"
  3. #include <math.h>
  4. #include "stdlib.h"
  5. double BaiDuMap::DEF_PI = 3.14159265359; // PI
  6. double BaiDuMap::DEF_2PI = 6.28318530712; // 2*PI
  7. double BaiDuMap::DEF_PI180 = 0.01745329252; // PI/180.0
  8. double BaiDuMap::DEF_R = 6370693.5; // radius of earth
  9. BaiDuMap::BaiDuMap()
  10. {
  11. }
  12. BaiDuMap::~BaiDuMap()
  13. {
  14. }
  15. double BaiDuMap::GetShortDistance(double lon1, double lat1, double lon2, double lat2)
  16. {
  17. double ew1, ns1, ew2, ns2;
  18. double dx, dy, dew;
  19. double distance;
  20. // 角度转换为弧度
  21. ew1 = lon1 * DEF_PI180;
  22. ns1 = lat1 * DEF_PI180;
  23. ew2 = lon2 * DEF_PI180;
  24. ns2 = lat2 * DEF_PI180;
  25. // 经度差
  26. dew = ew1 - ew2;
  27. // 若跨东经和西经180 度,进行调整
  28. if (dew > DEF_PI)
  29. dew = DEF_2PI - dew;
  30. else if (dew < -DEF_PI)
  31. dew = DEF_2PI + dew;
  32. dx = DEF_R * cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)
  33. dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)
  34. // 勾股定理求斜边长
  35. distance = sqrt(dx * dx + dy * dy);
  36. return distance;
  37. }
  38. double BaiDuMap::GetLongDistance(double lon1, double lat1, double lon2, double lat2)
  39. {
  40. double ew1, ns1, ew2, ns2;
  41. double distance;
  42. // 角度转换为弧度
  43. ew1 = lon1 * DEF_PI180;
  44. ns1 = lat1 * DEF_PI180;
  45. ew2 = lon2 * DEF_PI180;
  46. ns2 = lat2 * DEF_PI180;
  47. // 求大圆劣弧与球心所夹的角(弧度)
  48. distance = sin(ns1) * sin(ns2) + cos(ns1) * cos(ns2) * cos(ew1 - ew2);
  49. // 调整到[-1..1]范围内,避免溢出
  50. if (distance > 1.0)
  51. distance = 1.0;
  52. else if (distance < -1.0)
  53. distance = -1.0;
  54. // 求大圆劣弧长度
  55. distance = DEF_R * acos(distance);
  56. return distance;
  57. }
  58. double BaiDuMap::test()
  59. {
  60. //double mLat1 = 22.554201; // point1纬度
  61. //double mLon1 = 113.934357; // point1经度
  62. //double mLat2 = 22.553480;// point2纬度
  63. //double mLon2 = 113.932922;// point2经度
  64. double mLat1 = 22.575468; // point1纬度
  65. double mLon1 = 113.878807; // point1经度
  66. double mLat2 = 22.553425;// point2纬度
  67. double mLon2 = 113.932861;// point2经度
  68. double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);
  69. return distance;
  70. }