78 char LetterDesignator;
80 if ((84 >= Lat) && (Lat >= 72)) LetterDesignator =
'X';
81 else if ((72 > Lat) && (Lat >= 64)) LetterDesignator =
'W';
82 else if ((64 > Lat) && (Lat >= 56)) LetterDesignator =
'V';
83 else if ((56 > Lat) && (Lat >= 48)) LetterDesignator =
'U';
84 else if ((48 > Lat) && (Lat >= 40)) LetterDesignator =
'T';
85 else if ((40 > Lat) && (Lat >= 32)) LetterDesignator =
'S';
86 else if ((32 > Lat) && (Lat >= 24)) LetterDesignator =
'R';
87 else if ((24 > Lat) && (Lat >= 16)) LetterDesignator =
'Q';
88 else if ((16 > Lat) && (Lat >= 8)) LetterDesignator =
'P';
89 else if ((8 > Lat) && (Lat >= 0)) LetterDesignator =
'N';
90 else if ((0 > Lat) && (Lat >= -8)) LetterDesignator =
'M';
91 else if ((-8 > Lat) && (Lat >= -16)) LetterDesignator =
'L';
92 else if ((-16 > Lat) && (Lat >= -24)) LetterDesignator =
'K';
93 else if ((-24 > Lat) && (Lat >= -32)) LetterDesignator =
'J';
94 else if ((-32 > Lat) && (Lat >= -40)) LetterDesignator =
'H';
95 else if ((-40 > Lat) && (Lat >= -48)) LetterDesignator =
'G';
96 else if ((-48 > Lat) && (Lat >= -56)) LetterDesignator =
'F';
97 else if ((-56 > Lat) && (Lat >= -64)) LetterDesignator =
'E';
98 else if ((-64 > Lat) && (Lat >= -72)) LetterDesignator =
'D';
99 else if ((-72 > Lat) && (Lat >= -80)) LetterDesignator =
'C';
100 else LetterDesignator =
'Z';
102 return LetterDesignator;
107void LLtoUTM(
int ReferenceEllipsoid,
const double Lat,
const double Long,
108 double &UTMNorthing,
double &UTMEasting,
char* UTMZone) {
115 const double PI = 3.14159265;
117 const double deg2rad = PI / 180;
125 double eccPrimeSquared;
126 double N, T, C, A, M;
129 double LongTemp = (Long + 180) -
int((Long + 180) / 360)*360 - 180;
131 double LatRad = Lat*deg2rad;
132 double LongRad = LongTemp*deg2rad;
133 double LongOriginRad;
136 ZoneNumber = int((LongTemp + 180) / 6) + 1;
138 if (Lat >= 56.0 && Lat < 64.0 && LongTemp >= 3.0 && LongTemp < 12.0)
142 if (Lat >= 72.0 && Lat < 84.0) {
143 if (LongTemp >= 0.0 && LongTemp < 9.0) ZoneNumber = 31;
144 else if (LongTemp >= 9.0 && LongTemp < 21.0) ZoneNumber = 33;
145 else if (LongTemp >= 21.0 && LongTemp < 33.0) ZoneNumber = 35;
146 else if (LongTemp >= 33.0 && LongTemp < 42.0) ZoneNumber = 37;
148 LongOrigin = (ZoneNumber - 1)*6 - 180 + 3;
149 LongOriginRad = LongOrigin * deg2rad;
154 eccPrimeSquared = (eccSquared) / (1 - eccSquared);
156 N = a / sqrt(1 - eccSquared * sin(LatRad) * sin(LatRad));
157 T = tan(LatRad) * tan(LatRad);
158 C = eccPrimeSquared * cos(LatRad) * cos(LatRad);
159 A = cos(LatRad)*(LongRad - LongOriginRad);
161 M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad
162 - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(2 * LatRad)
163 + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * sin(4 * LatRad)
164 - (35 * eccSquared * eccSquared * eccSquared / 3072) * sin(6 * LatRad));
166 UTMEasting = (double) (k0 * N * (A + (1 - T + C) * A * A * A / 6
167 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120)
170 UTMNorthing = (double) (k0 * (M + N * tan(LatRad)*(A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24
171 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720)));
173 UTMNorthing += 10000000.0;
178void UTMtoLL(
int ReferenceEllipsoid,
const double UTMNorthing,
const double UTMEasting,
const char* UTMZone,
179 double& Lat,
double& Long) {
186 const double PI = 3.14159265;
189 const double rad2deg = 180.0 / PI;
194 double eccPrimeSquared;
195 double e1 = (1 - sqrt(1 - eccSquared)) / (1 + sqrt(1 - eccSquared));
196 double N1, T1, C1,
R1, D, M;
205 x = UTMEasting - 500000.0;
208 ZoneNumber = strtoul(UTMZone, &ZoneLetter, 10);
218 if ((*ZoneLetter -
'N') < 0) {
222 LongOrigin = (ZoneNumber - 1)*6 - 180 + 3;
224 eccPrimeSquared = (eccSquared) / (1 - eccSquared);
227 mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256));
229 phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * sin(2 * mu)
230 + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * sin(4 * mu)
231 +(151 * e1 * e1 * e1 / 96) * sin(6 * mu);
234 N1 = a / sqrt(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad));
235 T1 = tan(phi1Rad) * tan(phi1Rad);
236 C1 = eccPrimeSquared * cos(phi1Rad) * cos(phi1Rad);
237 R1 = a * (1 - eccSquared) / pow(1 - eccSquared * sin(phi1Rad) * sin(phi1Rad), 1.5);
240 Lat = phi1Rad - (N1 * tan(phi1Rad) /
R1)*(D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24
241 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);
244 Long = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1)
245 * D * D * D * D * D / 120) / cos(phi1Rad);
246 Long = LongOrigin + Long * rad2deg;
void LLtoUTM(int ReferenceEllipsoid, const double Lat, const double Long, double &UTMNorthing, double &UTMEasting, char *UTMZone)
void UTMtoLL(int ReferenceEllipsoid, const double UTMNorthing, const double UTMEasting, const char *UTMZone, double &Lat, double &Long)