29 # include <vcl_msvc_warnings.h> 33 #define degree_to_rad (vnl_math::pi_over_180) // Degree to rad conv. 34 #define dcos(x) std::cos((x)*vnl_math::pi_over_180) 35 #define dsin(x) std::sin((x)*vnl_math::pi_over_180) 36 #define EPSILON 1.0e-12 39 double ipow(
double x,
int i)
42 if (i<0) { i *= -1; x = y/x; }
43 while (i) {
if (i%2) y*=x; i/=2; x*=x; }
63 double delta_f, a, delta_a, delta_r;
76 delta_f = .3121057e-7;
83 *delta_phi = (4.5 *
dcos(phi))/(a *
dsin(1/3600.0)) +
84 (delta_f *
dsin(2.0 * phi)) / (
dsin(1/3600.0));
88 *delta_hgt = 4.5 *
dsin(phi) + a * delta_f * (
dsin(phi) *
dsin(phi))
93 *delta_lamda /= 3600.0;
109 double delta_phi, delta_lamda, delta_hgt;
113 *wgs84_phi = phi + delta_phi;
114 *wgs84_lamda = lamda + delta_lamda;
115 *wgs84_hgt = height + delta_hgt;
131 double delta_phi, delta_lamda, delta_hgt;
135 *wgs72_phi = phi - delta_phi;
136 *wgs72_lamda = lamda - delta_lamda;
137 *wgs72_hgt = height - delta_hgt;
168 V = K * (lamda -290);
170 *delta_phi = .67775 + 10.02259*U - 18.72391*V + 12.66341*
ipow(U,2) - 32.47686*
ipow(V,2) - 52.70768*
ipow(U,3) - 13.86527*U*
ipow(V,2)
171 - 16.82734*
ipow(V,3) - 59.54646*V*
ipow(U,3) + 120.64887*
ipow(U,5) + 7.23362*
ipow(U,2)*
ipow(V,3) + 95.89131*
ipow(U,5)*V -2.89651*U*
ipow(V,5)
176 *delta_lamda = -.33643 - 3.11777*V -5.16881*
ipow(U,2) - 3.17318*
ipow(V,2) - 34.59331*
ipow(U,3) + .97215*U*
ipow(V,2) - .5818*
ipow(V,3) +
177 223.78114*
ipow(U,5) + 358.07266*
ipow(U,6) + 270.68064*
ipow(U,7) - 87.99549*
ipow(U,6)*V - .09789*U*
ipow(V,6) + 636.41982*
ipow(U,7)*V -
182 *delta_hgt = -20.013 + 12.815*U - 8.084*V +74.122*
ipow(U,2)*V +39.523*
ipow(U,2)*
ipow(V,2) - 23.158*
ipow(U,4)*V + 194.444*
ipow(U,6) +
186 *delta_phi /= 3600.0;
187 *delta_lamda /= 3600.0;
203 double delta_phi, delta_lamda, delta_hgt;
206 &delta_phi, &delta_lamda, &delta_hgt);
208 *wgs84_phi = phi + delta_phi;
209 *wgs84_lamda = lamda + delta_lamda;
210 *wgs84_hgt = height + delta_hgt;
223 double *nad27m_lamda,
226 double delta_phi, delta_lamda, delta_hgt;
229 &delta_phi, &delta_lamda, &delta_hgt);
231 *nad27m_phi = phi - delta_phi;
232 *nad27m_lamda = lamda - delta_lamda;
233 *nad27m_hgt = height - delta_hgt;
260 U = K * (phi - 37.0);
261 V = K * (lamda -265.0);
265 *delta_phi = .16984 - .76173*U + .09585*V +1.09919*
ipow(U,2) - 4.57801*
ipow(U,3) - 1.13239*
ipow(U,2)*V + .49831*
ipow(V,3)
267 - .37548*
ipow(V,5) - .14197*
ipow(V,6) -59.96555*
ipow(U,7) + .07439*
ipow(V,7) -4.76082*
ipow(U,8) + .03385*
ipow(V,8) +
270 *delta_lamda = -.88437 + 2.05061*V + .26361*
ipow(U,2) - .76804*U*V + .13374*
ipow(V,2) - 1.31974*
ipow(U,3) - .52162*
ipow(U,2)*V -
275 *delta_hgt = -36.526 +3.9*U -4.723*V -21.553*
ipow(U,2) +7.294*U*V +8.886*
ipow(V,2) -8.44*
ipow(U,2)*V -2.93*U*
ipow(V,2) +
280 *delta_phi /= 3600.0;
281 *delta_lamda /= 3600.0;
297 double delta_phi, delta_lamda, delta_hgt;
300 &delta_phi, &delta_lamda, &delta_hgt);
302 *wgs84_phi = phi + delta_phi;
303 *wgs84_lamda = lamda + delta_lamda;
304 *wgs84_hgt = height + delta_hgt;
316 double *nad27n_lamda,
319 double delta_phi, delta_lamda, delta_hgt;
322 &delta_phi, &delta_lamda, &delta_hgt);
324 *nad27n_phi = phi - delta_phi;
325 *nad27n_lamda = lamda - delta_lamda;
326 *nad27n_hgt = height - delta_hgt;
347 (
double nad27_lat,
double nad27_lon,
double nad27_el,
348 double *wgs84_lat,
double *wgs84_lon,
double *wgs84_el)
352 double a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14;
353 double a15,a16,a17,a18,a19,a20,a21,a22,a23;
355 double b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14;
356 double b15,b16,b17,b18,b19,b20,b21,b22,b23;
358 double c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14;
359 double c15,c16,c17,c18,c19,c20;
395 std::cout <<
"\n NAD27 to WGS84 Conversion routine\n\n" 396 <<
" Enter latitude and longitude : ";
397 std::cin >> nad27_lat >> nad27_lon;
401 prin_lat = nad27_lat;
402 prin_lon = nad27_lon;
413 prin_lon = 360.0 + prin_lon;
417 u = k*(prin_lat - 37);
418 v = k*(prin_lon - 265);
446 delta_lat = a1 + a2*u + a3*
v + a4*u*u + a5*u*u*u + a6*u*u*
v 448 + a11*u*u*u*u*u + a12*u*u*u*u*
v + a13*u*u*
v*
v*
v 449 + a14*
v*
v*
v*
v*
v + a15*
v*
v*
v*
v*
v*
v + a16*u*u*u*u*u*u*u
450 + a17*
v*
v*
v*
v*
v*
v*
v + a18*u*u*u*u*u*u*u*u
451 + a19*
v*
v*
v*
v*
v*
v*
v*
v + a20*u*u*u*u*u*u*u*u*u
481 delta_lon = b1 + b2*
v + b3*u*u + b4*u*
v + b5*
v*
v + b6*u*u*u
482 + b7*u*u*
v + b8*u*
v*
v + b9*u*u*
v*
v + b10*u*
v*
v*
v 483 + b11*
v*
v*
v*
v + b12*u*u*u*u*
v + b13*u*
v*
v*
v*
v 486 + b18*u*u*u*u*u*u*u*u*u + b19*u*u*u*u*u*u*u*u*
v 488 + b22*u*
v*
v*
v*
v*
v*
v*
v*
v*
v + b23*u*u*u*u*u*u*u*u*u*
v*
v*
v;
512 delta_H = c1 + c2*u + c3*
v + c4*u*u + c5*u*
v + c6*
v*
v + c7*u*u*
v 513 + c8*u*
v*
v + c9*u*u*u*u + c10*u*u*u*
v + c11*
v*
v*
v*
v 514 + c12*u*u*u*u*
v + c13*u*u*
v*
v*
v + c14*u*u*u*u*u*u
515 + c15*u*u*u*u*u*
v + c16*
v*
v*
v*
v*
v*
v + c17*u*u*u*u*u*u*u*
v 516 + c18*
v*
v*
v*
v*
v*
v*
v*
v + c19*u*u*u*u*u*u*u*u*
v 530 double d10 = 132.550;
531 double d11 = -110.232;
533 double d13 = -64.953;
534 double d14 = -128.293;
537 double d17 = 104.097;
538 double d18 = -128.031;
539 double d19 = 110.694;
541 double d21 = 243.149;
542 double d22 = -15.790;
543 double d23 = -38.043;
544 double d24 = -40.277;
547 double d27 = -394.404;
548 double d28 = -927.540;
552 double d32 = -117.207;
555 N_height = d1 + d2*u + d3*
v + d4*u*u + d5*u*
v + d6*
v*
v + d7*u*u*u
556 + d8*u*
v*
v + d9*
v*
v*
v + d10*u*u*u*
v + d11*u*u*
v*
v 558 + d16*
v*
v*
v*
v*
v + d17*u*u*u*u*
v*
v + d18*u*u*u*
v*
v*
v 559 + d19*u*u*
v*
v*
v*
v + d20*
v*
v*
v*
v*
v*
v + d21*u*u*u*u*u*u*
v 562 + d27*u*u*u*u*u*u*u*u*u + d28*u*u*u*u*u*u*u*u*
v 568 delta_lat_p = delta_lat;
569 delta_lon_p = delta_lon;
572 ft_lat = 101.0 * delta_lat_p;
573 ft_lon = 101.0 * std::cos(prin_lat_rad) * delta_lon_p;
575 c_error = (double)std::sqrt(ft_lat*ft_lat + ft_lon*ft_lon);
578 *wgs84_lat = nad27_lat + (delta_lat_p/3600.0);
579 *wgs84_lon = nad27_lon + (delta_lon_p/3600.0);
580 *wgs84_el = nad27_el + delta_H;
583 new_lat = *wgs84_lat;
584 new_lon = *wgs84_lon;
585 std::cout <<
"\n d_lat = " << delta_lat
586 <<
"\n d_lon = " << delta_lon
587 <<
"\n d_H = " << delta_H
588 <<
"\n N = " << N_height
589 <<
"\n circular error = " << c_error
590 <<
"\n New Lat = " << new_lat <<
", New Lon =\n" << new_lon
603 (
double wgs84_lat,
double wgs84_lon,
double wgs84_el,
604 double *nad27n_lat,
double *nad27n_lon,
double *nad27n_el)
608 double a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14;
609 double a15,a16,a17,a18,a19,a20,a21,a22,a23;
611 double b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14;
612 double b15,b16,b17,b18,b19,b20,b21,b22,b23;
614 double c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14;
615 double c15,c16,c17,c18,c19,c20;
651 std::cout <<
"\n wgs84 to NAD27N Conversion routine\n\n";
652 " Enter latitude, longitude ";
653 std::cin >> wgs84_lat >> wgs84_lon;
657 prin_lat = wgs84_lat;
658 prin_lon = wgs84_lon;
669 prin_lon = 360.0 + prin_lon;
673 u = k*(prin_lat - 37);
674 v = k*(prin_lon - 265);
702 delta_lat = a1 + a2*u + a3*
v + a4*u*u + a5*u*u*u + a6*u*u*
v 704 + a11*u*u*u*u*u + a12*u*u*u*u*
v + a13*u*u*
v*
v*
v 705 + a14*
v*
v*
v*
v*
v + a15*
v*
v*
v*
v*
v*
v + a16*u*u*u*u*u*u*u
706 + a17*
v*
v*
v*
v*
v*
v*
v + a18*u*u*u*u*u*u*u*u
707 + a19*
v*
v*
v*
v*
v*
v*
v*
v + a20*u*u*u*u*u*u*u*u*u
737 delta_lon = b1 + b2*
v + b3*u*u + b4*u*
v + b5*
v*
v + b6*u*u*u
738 + b7*u*u*
v + b8*u*
v*
v + b9*u*u*
v*
v + b10*u*
v*
v*
v 739 + b11*
v*
v*
v*
v + b12*u*u*u*u*
v + b13*u*
v*
v*
v*
v 742 + b18*u*u*u*u*u*u*u*u*u + b19*u*u*u*u*u*u*u*u*
v 744 + b22*u*
v*
v*
v*
v*
v*
v*
v*
v*
v + b23*u*u*u*u*u*u*u*u*u*
v*
v*
v;
768 delta_H = c1 + c2*u + c3*
v + c4*u*u + c5*u*
v + c6*
v*
v + c7*u*u*
v 769 + c8*u*
v*
v + c9*u*u*u*u + c10*u*u*u*
v + c11*
v*
v*
v*
v 770 + c12*u*u*u*u*
v + c13*u*u*
v*
v*
v + c14*u*u*u*u*u*u
771 + c15*u*u*u*u*u*
v + c16*
v*
v*
v*
v*
v*
v + c17*u*u*u*u*u*u*u*
v 772 + c18*
v*
v*
v*
v*
v*
v*
v*
v + c19*u*u*u*u*u*u*u*u*
v 810 N_height = d1 + d2*u + d3*
v + d4*u*u + d5*u*
v + d6*
v*
v + d7*u*u*u
811 + d8*u*
v*
v + d9*
v*
v*
v + d10*u*u*u*
v + d11*u*u*
v*
v 813 + d16*
v*
v*
v*
v*
v + d17*u*u*u*u*
v*
v + d18*u*u*u*
v*
v*
v 814 + d19*u*u*
v*
v*
v*
v + d20*
v*
v*
v*
v*
v*
v + d21*u*u*u*u*u*u*
v 817 + d27*u*u*u*u*u*u*u*u*u + d28*u*u*u*u*u*u*u*u*
v 823 delta_lat_p = delta_lat;
824 delta_lon_p = delta_lon;
827 ft_lat = 101.0 * delta_lat_p;
828 ft_lon = 101.0 * std::cos(prin_lat_rad) * delta_lon_p;
830 c_error = (double)std::sqrt(ft_lat*ft_lat + ft_lon*ft_lon);
834 *nad27n_lat = wgs84_lat - (delta_lat_p/3600.0);
835 *nad27n_lon = wgs84_lon - (delta_lon_p/3600.0);
836 *nad27n_el = wgs84_el - delta_H;
839 new_lat = *nad27n_lat;
840 new_lon = *nad27n_lon;
841 std::cout <<
"\n d_lat = " << delta_lat
842 <<
"\n d_lon = " << delta_lon
843 <<
"\n d_H = " << delta_H
844 <<
"\n N = " << N_height
845 <<
"\n circular error = " << c_error
846 <<
"\n New Lat = " << new_lat <<
", New Lon =\n" << new_lon
856 (
double geodetic_lat,
860 return(std::atan((B/A)*(B/A) * std::tan(geodetic_lat)));
867 (
double geocentric_lat,
871 return(std::atan((A/B)*(A/B) * std::tan(geocentric_lat)));
894 (
double x,
double y,
double z,
895 double *geodetic_lat,
906 xy_dist = std::sqrt(x*x + y*y);
907 ee = 1 - (B/A)*(B/A);
913 *lon = std::acos(x/xy_dist);
918 new_lat = std::atan2(z, xy_dist);
922 *geodetic_lat = new_lat;
927 N = A / std::sqrt(1 - ee * std::sin(*geodetic_lat) * std::sin(*geodetic_lat));
930 new_lat = std::atan2( (z + N * ee * std::sin(*geodetic_lat)), xy_dist );
932 while (std::fabs(new_lat - *geodetic_lat) >
EPSILON);
934 *geodetic_lat = new_lat;
935 *el = xy_dist/std::cos(new_lat) - N;
959 (
double geodetic_lat,
968 double geocentric_lat;
975 s = std::sin(geocentric_lat);
976 c = std::cos(geocentric_lat);
980 local_radius = (A*B) / std::sqrt(B*B*c*c + A*A*s*s);
982 *x = (local_radius*c + el*std::cos(geodetic_lat))*std::cos(lon);
983 *y = (local_radius*c + el*std::cos(geodetic_lat))*std::sin(lon);
984 *z = (local_radius*s + el*std::sin(geodetic_lat));
987 double tlat, tlon, tel;
989 std::cout <<
"Error in computation: (" << (tlat-geodetic_lat) <<
", " << (tlon-lon) <<
", " << (tel-el) <<
")\n";
1003 double *wgs72_lamda,
1006 double wgs84_phi, wgs84_lamda, wgs84_hgt;
1009 &wgs84_phi, &wgs84_lamda, &wgs84_hgt);
1012 wgs72_phi, wgs72_lamda, wgs72_hgt);
1026 double *nad27n_lamda,
1029 double wgs84_phi, wgs84_lamda, wgs84_hgt;
1032 &wgs84_phi, &wgs84_lamda, &wgs84_hgt);
1035 nad27n_phi, nad27n_lamda, nad27n_hgt);
double geo_centric2detic(double geocentric_lat, double A, double B)
void wgs72_to_wgs84_deltas(double phi, double *delta_phi, double *delta_lamda, double *delta_hgt)
void GRS_to_latlong(double x, double y, double z, double *geodetic_lat, double *lon, double *el, double A, double B)
Major and minor axes of earth.
void latlong_to_GRS(double geodetic_lat, double lon, double el, double *x, double *y, double *z, double A, double B)
Major and minor axes of earth.
void nad27n_to_wgs72(double phi, double lamda, double height, double *wgs72_phi, double *wgs72_lamda, double *wgs72_hgt)
elev in wgs72 (meters)
void nad27m_to_wgs84(double phi, double lamda, double height, double *wgs84_phi, double *wgs84_lamda, double *wgs84_hgt)
elev new (meters)
void nad27m_to_wgs84_deltas(double phi, double lamda, double, double *delta_phi, double *delta_lamda, double *delta_hgt)
void wgs84_to_nad27n(double phi, double lamda, double height, double *nad27n_phi, double *nad27n_lamda, double *nad27n_hgt)
elev new (meters)
double geo_detic2centric(double geodetic_lat, double A, double B)
Major and minor axes of earth.
void nad27n_to_wgs84_alternate(double nad27_lat, double nad27_lon, double nad27_el, double *wgs84_lat, double *wgs84_lon, double *wgs84_el)
void nad27n_to_wgs84_deltas(double phi, double lamda, double, double *delta_phi, double *delta_lamda, double *delta_hgt)
void wgs72_to_wgs84(double phi, double lamda, double height, double *wgs84_phi, double *wgs84_lamda, double *wgs84_hgt)
elev new (meters)
void nad27n_to_wgs84(double phi, double lamda, double height, double *wgs84_phi, double *wgs84_lamda, double *wgs84_hgt)
elev new (meters)
void wgs84_to_nad27n_alternate(double wgs84_lat, double wgs84_lon, double wgs84_el, double *nad27n_lat, double *nad27n_lon, double *nad27n_el)
double ipow(double x, int i)
void wgs72_to_nad27n(double phi, double lamda, double height, double *nad27n_phi, double *nad27n_lamda, double *nad27n_hgt)
elev in nad27n (meters)
void wgs84_to_wgs72(double phi, double lamda, double height, double *wgs72_phi, double *wgs72_lamda, double *wgs72_hgt)
elev new (meters)
void wgs84_to_nad27m(double phi, double lamda, double height, double *nad27m_phi, double *nad27m_lamda, double *nad27m_hgt)
elev new (meters)