13 Utm::Utm(
double latitude,
double longitude)
15 init(latitude, longitude);
67 constexpr
double RADIANS_PER_DEGREE = M_PI / 180.0;
70 constexpr
double WGS84_A = 6378137.0;
71 constexpr
double WGS84_E = 0.0818191908;
74 constexpr
double UTM_K0 = 0.9996;
75 constexpr
double UTM_E2 = (WGS84_E * WGS84_E);
78 double ecc_prime_squared;
82 double long_temp = (longitude + 180) -
int((longitude + 180) / 360) * 360 - 180;
84 double lat_rad = latitude * RADIANS_PER_DEGREE;
85 double long_rad = long_temp * RADIANS_PER_DEGREE;
86 double long_origin_rad;
90 long_origin_rad = long_origin * RADIANS_PER_DEGREE;
92 ecc_prime_squared = (UTM_E2)/(1 - UTM_E2);
94 n = WGS84_A/sqrt(1 - UTM_E2 * sin(lat_rad) * sin(lat_rad));
95 t = tan(lat_rad) * tan(lat_rad);
96 c = ecc_prime_squared * cos(lat_rad) * cos(lat_rad);
97 a = cos(lat_rad) * (long_rad-long_origin_rad);
99 m = WGS84_A * ((1 - UTM_E2/4 - 3*UTM_E2*UTM_E2/64 - 5*UTM_E2*UTM_E2*UTM_E2/256) * lat_rad
100 - (3 * UTM_E2/8 + 3*UTM_E2*UTM_E2/32 + 45*UTM_E2*UTM_E2*UTM_E2/1024) * sin(2*lat_rad)
101 + (15*UTM_E2*UTM_E2/256 + 45*UTM_E2*UTM_E2*UTM_E2/1024) * sin(4*lat_rad)
102 - (35*UTM_E2*UTM_E2*UTM_E2/3072) * sin(6*lat_rad));
104 double utm_easting = (double)(UTM_K0*n*(a+(1-
t+c)*a*a*a/6
105 + (5-18*
t+
t*
t+72*c-58*ecc_prime_squared)*a*a*a*a*a/120)
108 double utm_northing = (double)(UTM_K0*(m+n*tan(lat_rad)*(a*a/2+(5-
t+9*c+4*c*c)*a*a*a*a/24
109 + (61-58*
t+
t*
t+600*c-330*ecc_prime_squared)*a*a*a*a*a*a/720)));
114 utm_northing += 10000000.0;
117 std::array<double, 2> easting_northing{utm_easting, utm_northing};
118 return (easting_northing);
126 double long_temp = (longitude + 180) -
int((longitude + 180) / 360) * 360 - 180;
128 zone_number = int((long_temp + 180) / 6) + 1;
130 if ( latitude >= 56.0 && latitude < 64.0 && long_temp >= 3.0 && long_temp < 12.0 )
136 if ( latitude >= 72.0 && latitude < 84.0 )
138 if ( long_temp >= 0.0 && long_temp < 9.0 )
142 else if ( long_temp >= 9.0 && long_temp < 21.0 )
146 else if ( long_temp >= 21.0 && long_temp < 33.0 )
150 else if ( long_temp >= 33.0 && long_temp < 42.0 )
164 char letter_designator;
166 if ((84 >= latitude) && (latitude >= 72))
168 letter_designator =
'X';
170 else if ((72 > latitude) && (latitude >= 64))
172 letter_designator =
'W';
174 else if ((64 > latitude) && (latitude >= 56))
176 letter_designator =
'V';
178 else if ((56 > latitude) && (latitude >= 48))
180 letter_designator =
'U';
182 else if ((48 > latitude) && (latitude >= 40))
184 letter_designator =
'T';
186 else if ((40 > latitude) && (latitude >= 32))
188 letter_designator =
'S';
190 else if ((32 > latitude) && (latitude >= 24))
192 letter_designator =
'R';
194 else if ((24 > latitude) && (latitude >= 16))
196 letter_designator =
'Q';
198 else if ((16 > latitude) && (latitude >= 8))
200 letter_designator =
'P';
202 else if ((8 > latitude) && (latitude >= 0))
204 letter_designator =
'N';
206 else if ((0 > latitude) && (latitude >= -8))
208 letter_designator =
'M';
210 else if ((-8 > latitude) && (latitude >= -16))
212 letter_designator =
'L';
214 else if ((-16 > latitude) && (latitude >= -24))
216 letter_designator =
'K';
218 else if ((-24 > latitude) && (latitude >= -32))
220 letter_designator =
'J';
222 else if ((-32 > latitude) && (latitude >= -40))
224 letter_designator =
'H';
226 else if ((-40 > latitude) && (latitude >= -48))
228 letter_designator =
'G';
230 else if ((-48 > latitude) && (latitude >= -56))
232 letter_designator =
'F';
234 else if ((-56 > latitude) && (latitude >= -64))
236 letter_designator =
'E';
238 else if ((-64 > latitude) && (latitude >= -72))
240 letter_designator =
'D';
242 else if ((-72 > latitude) && (latitude >= -80))
244 letter_designator =
'C';
249 letter_designator =
'Z';
251 return letter_designator;