睇住條 Formula,
一知半解代返啲符號入去,
終於叫做轉到,應該係有啲 Roundup 上嘅誤差,
2,3 米範圍內,不過無所謂,反正 GPS 本身都自己都誤差。

測試結果:

lat: 22.48577143777777820
lon: 114.00029998111111240
n: 838478.464
e: 818098.341
  1. #include <math.h>
  2. #include <iostream>
  3. #include <iomanip>

  4. using namespace std;

  5. double dms_to_dd(int deg, int min, double sec)
  6. {
  7.     return deg + (double)min / 60 + sec / 3600;
  8. }

  9. template <typename T>
  10. double deg2rad(T deg)
  11. {
  12.     return (double)deg * M_PI / 180.0;
  13. }

  14. /*
  15. The Formula is referenced from the following PDF document:
  16. https://www.geodetic.gov.hk/common/data/pdf/explanatorynotes_c.pdf
  17. */

  18. const double e2 = 0.006722670022;
  19. const double A0 = 1 - e2 / 4 - 3 * e2 * e2 / 64;
  20. const double A2 = 3 * (e2 + e2 * e2 / 4) / 8;
  21. const double A4 = 15 * e2 * e2 / 256;
  22. const double a = 6378388;
  23. const double N0 = 819069.80;
  24. const double M0 = 2468395.728;
  25. const double Vs = 6381480.502;
  26. const double lon0 = deg2rad(dms_to_dd(114, 10, 42.80));
  27. const double E0 = 836694.05;
  28. const double iso_lat = 1.005792635;

  29. void wgs84_to_hk1980(double lat, double lon, double &x, double &y)
  30. {
  31.     lat += 5.5 / 3600;
  32.     lon -= 8.8 / 3600;

  33.     lat = deg2rad(lat);
  34.     lon = deg2rad(lon);

  35.     double M = a * (A0 * lat - A2 * sin(2 * lat) + A4 * sin(4 * lat));
  36.     double lonP = lon - lon0;

  37.     x = N0 + M - M0 + Vs * sin(lat) * lonP * lonP / 2 * cos(lat);
  38.     y = E0 + Vs * lonP * cos(lat) + Vs * pow(lonP, 3) / 6 * pow(cos(lat), 3) * (iso_lat - pow(tan(lat), 2));
  39. }

  40. int main()
  41. {

  42.     /*
  43.     This example is referenced from the following PDF document:
  44.     https://www.geodetic.gov.hk/common/data/parameter/7P_ITRF96_HK80_V1(Tra_Chi).pdf

  45.     Lat: 22d, 29m, 8.777176s
  46.     Lon: 114d, 00m, 1.079932s
  47.     N: 838477.970m
  48.     E: 818097.267m
  49.     */

  50.     double lat = dms_to_dd(22, 29, 8.777176);
  51.     double lon = dms_to_dd(114, 00, 1.079932);

  52.     double x, y;

  53.     wgs84_to_hk1980(lat, lon, x, y);

  54.     cout << fixed << setprecision(17);
  55.     cout << "lat: " << lat << endl;
  56.     cout << "lon: " << lon << endl;

  57.     cout << fixed << setprecision(3);
  58.     cout << "n: " << x << endl;
  59.     cout << "e: " << y << endl;

  60.     return 0;
  61. }
複製代碼

TOP