睇住條 Formula,
一知半解代返啲符號入去,
終於叫做轉到,應該係有啲 Roundup 上嘅誤差,
2,3 米範圍內,不過無所謂,反正 GPS 本身都自己都誤差。
測試結果:
lat: 22.48577143777777820
lon: 114.00029998111111240
n: 838478.464
e: 818098.341- #include <math.h>
- #include <iostream>
- #include <iomanip>
- using namespace std;
- double dms_to_dd(int deg, int min, double sec)
- {
- return deg + (double)min / 60 + sec / 3600;
- }
- template <typename T>
- double deg2rad(T deg)
- {
- return (double)deg * M_PI / 180.0;
- }
- /*
- The Formula is referenced from the following PDF document:
- https://www.geodetic.gov.hk/common/data/pdf/explanatorynotes_c.pdf
- */
- const double e2 = 0.006722670022;
- const double A0 = 1 - e2 / 4 - 3 * e2 * e2 / 64;
- const double A2 = 3 * (e2 + e2 * e2 / 4) / 8;
- const double A4 = 15 * e2 * e2 / 256;
- const double a = 6378388;
- const double N0 = 819069.80;
- const double M0 = 2468395.728;
- const double Vs = 6381480.502;
- const double lon0 = deg2rad(dms_to_dd(114, 10, 42.80));
- const double E0 = 836694.05;
- const double iso_lat = 1.005792635;
- void wgs84_to_hk1980(double lat, double lon, double &x, double &y)
- {
- lat += 5.5 / 3600;
- lon -= 8.8 / 3600;
- lat = deg2rad(lat);
- lon = deg2rad(lon);
- double M = a * (A0 * lat - A2 * sin(2 * lat) + A4 * sin(4 * lat));
- double lonP = lon - lon0;
- x = N0 + M - M0 + Vs * sin(lat) * lonP * lonP / 2 * cos(lat);
- y = E0 + Vs * lonP * cos(lat) + Vs * pow(lonP, 3) / 6 * pow(cos(lat), 3) * (iso_lat - pow(tan(lat), 2));
- }
- int main()
- {
- /*
- This example is referenced from the following PDF document:
- https://www.geodetic.gov.hk/common/data/parameter/7P_ITRF96_HK80_V1(Tra_Chi).pdf
- Lat: 22d, 29m, 8.777176s
- Lon: 114d, 00m, 1.079932s
- N: 838477.970m
- E: 818097.267m
- */
- double lat = dms_to_dd(22, 29, 8.777176);
- double lon = dms_to_dd(114, 00, 1.079932);
- double x, y;
- wgs84_to_hk1980(lat, lon, x, y);
- cout << fixed << setprecision(17);
- cout << "lat: " << lat << endl;
- cout << "lon: " << lon << endl;
- cout << fixed << setprecision(3);
- cout << "n: " << x << endl;
- cout << "e: " << y << endl;
- return 0;
- }
複製代碼 |