104 using namespace MSP::CCS;
111 const double PI = 3.14159265358979323e0;
122 double ellipsoidSemiMajorAxis,
123 double ellipsoidFlattening,
124 double centralMeridian,
125 double originLatitude,
127 double falseNorthing ) :
129 Ra( 6371007.1810824 ),
130 Sin_Gnom_Origin_Lat( 0.0 ),
131 Cos_Gnom_Origin_Lat( 1.0 ),
132 Gnom_Origin_Long( 0.0 ),
133 Gnom_Origin_Lat( 0.0 ),
134 Gnom_False_Easting( 0.0 ),
135 Gnom_False_Northing( 0.0 ),
136 abs_Gnom_Origin_Lat( 0.0 ),
137 Gnom_Delta_Northing( 40000000 ),
138 Gnom_Delta_Easting( 40000000 )
158 double es2, es4, es6;
159 double inv_f = 1 / ellipsoidFlattening;
161 if (ellipsoidSemiMajorAxis <= 0.0)
165 if ((inv_f < 250) || (inv_f > 350))
173 if ((centralMeridian < -
PI) || (centralMeridian >
TWO_PI))
186 (1.0 - es2 / 6.0 - 17.0 * es4 / 360.0 - 67.0 * es6 / 3024.0);
187 Gnom_Origin_Lat = originLatitude;
188 Sin_Gnom_Origin_Lat = sin(Gnom_Origin_Lat);
189 Cos_Gnom_Origin_Lat = cos(Gnom_Origin_Lat);
190 abs_Gnom_Origin_Lat = fabs(Gnom_Origin_Lat);
191 if (centralMeridian >
PI)
192 centralMeridian -=
TWO_PI;
193 Gnom_Origin_Long = centralMeridian;
194 Gnom_False_Northing = falseNorthing;
195 Gnom_False_Easting = falseEasting;
204 Sin_Gnom_Origin_Lat = g.Sin_Gnom_Origin_Lat;
205 Cos_Gnom_Origin_Lat = g.Cos_Gnom_Origin_Lat;
206 Gnom_Origin_Long = g.Gnom_Origin_Long;
207 Gnom_Origin_Lat = g.Gnom_Origin_Lat;
208 Gnom_False_Easting = g.Gnom_False_Easting;
209 Gnom_False_Northing = g.Gnom_False_Northing;
210 abs_Gnom_Origin_Lat = g.abs_Gnom_Origin_Lat;
211 Gnom_Delta_Northing = g.Gnom_Delta_Northing;
212 Gnom_Delta_Easting = g.Gnom_Delta_Easting;
228 Sin_Gnom_Origin_Lat = g.Sin_Gnom_Origin_Lat;
229 Cos_Gnom_Origin_Lat = g.Cos_Gnom_Origin_Lat;
230 Gnom_Origin_Long = g.Gnom_Origin_Long;
231 Gnom_Origin_Lat = g.Gnom_Origin_Lat;
232 Gnom_False_Easting = g.Gnom_False_Easting;
233 Gnom_False_Northing = g.Gnom_False_Northing;
234 abs_Gnom_Origin_Lat = g.abs_Gnom_Origin_Lat;
235 Gnom_Delta_Northing = g.Gnom_Delta_Northing;
236 Gnom_Delta_Easting = g.Gnom_Delta_Easting;
263 Gnom_False_Easting, Gnom_False_Northing );
288 double sin_dlam, cos_dlam;
289 double temp_Easting, temp_Northing;
290 double easting, northing;
292 double longitude = geodeticCoordinates->
longitude();
293 double latitude = geodeticCoordinates->
latitude();
294 double slat = sin(latitude);
295 double clat = cos(latitude);
301 if ((longitude < -
PI) || (longitude >
TWO_PI))
305 dlam = longitude - Gnom_Origin_Long;
306 sin_dlam = sin(dlam);
307 cos_dlam = cos(dlam);
308 cos_c = Sin_Gnom_Origin_Lat * slat + Cos_Gnom_Origin_Lat * clat * cos_dlam;
309 if (cos_c <= 1.0e-10)
324 if (fabs(abs_Gnom_Origin_Lat -
PI_OVER_2) < 1.0e-10)
326 Ra_cotlat = Ra * (clat / slat);
327 temp_Easting = Ra_cotlat * sin_dlam;
328 temp_Northing = Ra_cotlat * cos_dlam;
329 if (Gnom_Origin_Lat >= 0.0)
331 easting = temp_Easting + Gnom_False_Easting;
332 northing = -1.0 * temp_Northing + Gnom_False_Northing;
336 easting = -1.0 * temp_Easting + Gnom_False_Easting;
337 northing = -1.0 * temp_Northing + Gnom_False_Northing;
340 else if (abs_Gnom_Origin_Lat <= 1.0e-10)
342 easting = Ra * tan(dlam) + Gnom_False_Easting;
343 northing = Ra * tan(latitude) / cos_dlam + Gnom_False_Northing;
348 Ra_kprime = Ra * k_prime;
349 easting = Ra_kprime * clat * sin_dlam + Gnom_False_Easting;
350 northing = Ra_kprime *
351 (Cos_Gnom_Origin_Lat * slat - Sin_Gnom_Origin_Lat * clat * cos_dlam)
352 + Gnom_False_Northing;
381 double longitude, latitude;
383 double easting = mapProjectionCoordinates->
easting();
384 double northing = mapProjectionCoordinates->
northing();
386 if ((easting < (Gnom_False_Easting - Gnom_Delta_Easting))
387 || (easting > (Gnom_False_Easting + Gnom_Delta_Easting)))
391 if ((northing < (Gnom_False_Northing - Gnom_Delta_Northing))
392 || (northing > (Gnom_False_Northing + Gnom_Delta_Northing)))
397 dy = northing - Gnom_False_Northing;
398 dx = easting - Gnom_False_Easting;
399 rho = sqrt(dx * dx + dy * dy);
400 if (fabs(rho) <= 1.0e-10)
402 latitude = Gnom_Origin_Lat;
403 longitude = Gnom_Origin_Long;
410 dy_sinc = dy * sin_c;
411 latitude = asin((cos_c * Sin_Gnom_Origin_Lat)
412 + ((dy_sinc * Cos_Gnom_Origin_Lat) / rho));
414 if (fabs(abs_Gnom_Origin_Lat -
PI_OVER_2) < 1.0e-10)
416 if (Gnom_Origin_Lat >= 0.0)
417 longitude = Gnom_Origin_Long + atan2(dx, -dy);
419 longitude = Gnom_Origin_Long + atan2(dx, dy);
422 longitude = Gnom_Origin_Long
423 + atan2((dx * sin_c),
424 (rho * Cos_Gnom_Origin_Lat * cos_c - dy_sinc *Sin_Gnom_Origin_Lat));
436 else if (longitude < -
PI)