studio_proj.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /**
  2. ******************************************************************************
  3. * @file : studio_proj.h
  4. * @author : wangyingjie
  5. * @brief : 经纬度 转 高斯投影,墨卡托投影,地心地固直角坐标系 C 语言版
  6. * : 中央经线计算公式: double central = static_cast<int>(lon / 3) * 3;
  7. * @attention : None
  8. * @date : 2025/5/12
  9. ******************************************************************************
  10. */
  11. #ifndef STUDIO_PROJ_H
  12. #define STUDIO_PROJ_H
  13. #include "studio_macros.h"
  14. #include "studio_geo_const.h"
  15. #define AO_GAUSS3_NO(lon) static_cast<int>(lon / 3.0 + 1)
  16. #define AO_GAUSS6_NO(lon) static_cast<int>(lon / 6.0 + 1)
  17. #define AO_GAUSS3_L0(no) static_cast<double>(3 * no - 1.5)
  18. #define AO_GAUSS6_L0(no) static_cast<double>(6 * no - 3.0)
  19. class proj
  20. {
  21. public:
  22. struct param
  23. {
  24. // 中央经度线
  25. double central{117.0};
  26. double scale{0.9996};
  27. double easting{500000.0}; // 东偏移
  28. // 长半轴
  29. double major_axis{WGS84::A};
  30. // 扁率
  31. double flatten{WGS84::F};
  32. };
  33. public:
  34. /// <summary>
  35. /// 高斯投影反算经纬度
  36. /// </summary>
  37. /// <param name="gx"></param>
  38. /// <param name="gy"></param>
  39. /// <param name="lon"></param>
  40. /// <param name="lat"></param>
  41. /// <param name="p"></param>
  42. static void gauss_to_lonlat(const double& gx, const double& gy, double& lon, double& lat, const param& p);
  43. /// <summary>
  44. /// 高斯投影反算经纬度,使用静态值速度会更快
  45. /// </summary>
  46. /// <param name="gx"></param>
  47. /// <param name="gy"></param>
  48. /// <param name="lon"></param>
  49. /// <param name="lat"></param>
  50. static void gauss_to_lonlat(const double& central, const double& gx, const double& gy, double& lon, double& lat);
  51. /// <summary>
  52. /// 经纬度转高斯投影
  53. /// </summary>
  54. /// <param name="lon"></param>
  55. /// <param name="lat"></param>
  56. /// <param name="gx"></param>
  57. /// <param name="gy"></param>
  58. /// <param name="p"></param>
  59. static void lonlat_to_gauss(const double& lon, const double& lat, double& gx, double& gy, const param& p);
  60. /// <summary>
  61. /// 经纬度转高斯投影,使用静态值速度会更快
  62. /// </summary>
  63. /// <param name="lon"></param>
  64. /// <param name="lat"></param>
  65. /// <param name="gx"></param>
  66. /// <param name="gy"></param>
  67. static void lonlat_to_gauss(const double& central, const double& lon, const double& lat, double& gx, double& gy);
  68. /// <summary>
  69. /// 墨卡托转经纬度
  70. /// </summary>
  71. /// <param name="mctx"></param>
  72. /// <param name="mcty"></param>
  73. /// <param name="lon"></param>
  74. /// <param name="lat"></param>
  75. static void mercator_to_lonlat(const double& mctx, const double& mcty, double& lon, double& lat);
  76. /// <summary>
  77. /// 经纬度转墨卡托
  78. /// </summary>
  79. /// <param name="lon"></param>
  80. /// <param name="lat"></param>
  81. /// <param name="mctx"></param>
  82. /// <param name="mcty"></param>
  83. static void lonlat_to_mercator(const double& lon, const double& lat, double& mctx, double& mcty);
  84. /// <summary>
  85. /// 墨卡托转高斯投影
  86. /// </summary>
  87. /// <param name="mctx"></param>
  88. /// <param name="mcty"></param>
  89. /// <param name="gx"></param>
  90. /// <param name="gy"></param>
  91. /// <param name="p"></param>
  92. static void mercator_to_gauss(const double& mctx, const double& mcty, double& gx, double& gy, const param& p);
  93. /// <summary>
  94. /// 高斯投影转墨卡托
  95. /// </summary>
  96. /// <param name="gx"></param>
  97. /// <param name="gy"></param>
  98. /// <param name="mctx"></param>
  99. /// <param name="mcty"></param>
  100. /// <param name="p"></param>
  101. static void gauss_to_mercator(const double& gx, const double& gy, double& mctx, double& mcty, const param& p);
  102. /// <summary>
  103. /// 墨卡托转高斯投影,使用静态值速度会更快
  104. /// </summary>
  105. /// <param name="central"></param>
  106. /// <param name="mctx"></param>
  107. /// <param name="mcty"></param>
  108. /// <param name="gx"></param>
  109. /// <param name="gy"></param>
  110. static void mercator_to_gauss(const double& central, const double& mctx, const double& mcty, double& gx, double& gy);
  111. /// <summary>
  112. /// 高斯投影转墨卡托,使用静态值速度会更快
  113. /// </summary>
  114. /// <param name="central"></param>
  115. /// <param name="gx"></param>
  116. /// <param name="gy"></param>
  117. /// <param name="mctx"></param>
  118. /// <param name="mcty"></param>
  119. static void gauss_to_mercator(const double& central, const double& gx, const double& gy, double& mctx, double& mcty);
  120. /// <summary>
  121. /// 地心地固直角坐标系 转 经纬坐标系
  122. /// </summary>
  123. /// <param name="x"></param>
  124. /// <param name="y"></param>
  125. /// <param name="z"></param>
  126. /// <param name="lon"></param>
  127. /// <param name="lat"></param>
  128. /// <param name="height"></param>
  129. static void ecef_to_lonlat(const double& x, const double& y, const double& z, double& lon, double& lat, double& height);
  130. /// <summary>
  131. /// 经纬坐标系 转 地心地固直角坐标系
  132. /// </summary>
  133. /// <param name="lon"></param>
  134. /// <param name="lat"></param>
  135. /// <param name="height"></param>
  136. /// <param name="x"></param>
  137. /// <param name="y"></param>
  138. /// <param name="z"></param>
  139. static void lonlat_to_ecef(const double& lon, const double& lat, const double& height, double& x, double& y, double& z);
  140. private:
  141. };
  142. #endif //