112 using namespace MSP::CCS;
120 const double PI = 3.14159265358979323e0;
124 const double ONE = (1.0 *
PI / 180.0);
132 Stereographic::Stereographic(
double ellipsoidSemiMajorAxis,
double ellipsoidFlattening,
double centralMeridian,
double originLatitude,
double falseEasting,
double falseNorthing ) :
133 Stereo_Ra( 6371007.1810824 ),
134 Two_Stereo_Ra( 12742014.3621648 ),
136 Stereo_Origin_Long( 0.0 ),
137 Stereo_Origin_Lat( 0.0 ),
138 Stereo_False_Easting( 0.0 ),
139 Stereo_False_Northing( 0.0 ),
140 Sin_Stereo_Origin_Lat( 0.0 ),
141 Cos_Stereo_Origin_Lat( 1.0 ),
142 Stereo_Delta_Easting( 1460090226.0 ),
143 Stereo_Delta_Northing( 1460090226.0 )
161 double es2, es4, es6;
163 double inv_f = 1 / ellipsoidFlattening;
165 if (ellipsoidSemiMajorAxis <= 0.0)
169 if ((inv_f < 250) || (inv_f > 350))
177 if ((centralMeridian < -
PI) || (centralMeridian >
TWO_PI))
189 (1.0 - es2 / 6.0 - 17.0 * es4 / 360.0 - 67.0 * es6 /3024.0);
190 Two_Stereo_Ra = 2.0 * Stereo_Ra;
191 Stereo_Origin_Lat = originLatitude;
192 Sin_Stereo_Origin_Lat = sin(Stereo_Origin_Lat);
193 Cos_Stereo_Origin_Lat = cos(Stereo_Origin_Lat);
194 if (centralMeridian >
PI)
195 centralMeridian -=
TWO_PI;
196 Stereo_Origin_Long = centralMeridian;
197 Stereo_False_Easting = falseEasting;
198 Stereo_False_Northing = falseNorthing;
199 if(fabs(fabs(Stereo_Origin_Lat) -
PI_OVER_2) < 1.0e-10)
204 if ((Stereo_At_Pole) || (fabs(Stereo_Origin_Lat) < 1.0e-10))
206 Stereo_Delta_Easting = 1460090226.0;
211 if (Stereo_Origin_Long <= 0)
221 Stereo_Delta_Easting = tempCoordinates->
easting();
222 delete tempCoordinates;
224 if(Stereo_False_Easting)
225 Stereo_Delta_Easting -= Stereo_False_Easting;
226 if (Stereo_Delta_Easting < 0)
227 Stereo_Delta_Easting = -Stereo_Delta_Easting;
236 Stereo_Ra = s.Stereo_Ra;
237 Two_Stereo_Ra = s.Two_Stereo_Ra;
238 Stereo_At_Pole = s.Stereo_At_Pole;
239 Stereo_Origin_Long = s.Stereo_Origin_Long;
240 Stereo_Origin_Lat = s.Stereo_Origin_Lat;
241 Stereo_False_Easting = s.Stereo_False_Easting;
242 Stereo_False_Northing = s.Stereo_False_Northing;
243 Sin_Stereo_Origin_Lat = s.Sin_Stereo_Origin_Lat;
244 Cos_Stereo_Origin_Lat = s.Cos_Stereo_Origin_Lat;
245 Stereo_Delta_Easting = s.Stereo_Delta_Easting;
246 Stereo_Delta_Northing = s.Stereo_Delta_Northing;
261 Stereo_Ra = s.Stereo_Ra;
262 Two_Stereo_Ra = s.Two_Stereo_Ra;
263 Stereo_At_Pole = s.Stereo_At_Pole;
264 Stereo_Origin_Long = s.Stereo_Origin_Long;
265 Stereo_Origin_Lat = s.Stereo_Origin_Lat;
266 Stereo_False_Easting = s.Stereo_False_Easting;
267 Stereo_False_Northing = s.Stereo_False_Northing;
268 Sin_Stereo_Origin_Lat = s.Sin_Stereo_Origin_Lat;
269 Cos_Stereo_Origin_Lat = s.Cos_Stereo_Origin_Lat;
270 Stereo_Delta_Easting = s.Stereo_Delta_Easting;
271 Stereo_Delta_Northing = s.Stereo_Delta_Northing;
320 double easting, northing;
322 double longitude = geodeticCoordinates->
longitude();
323 double latitude = geodeticCoordinates->
latitude();
324 double slat = sin(latitude);
325 double clat = cos(latitude);
331 if ((longitude < -
PI) || (longitude >
TWO_PI))
336 dlam = longitude - Stereo_Origin_Long;
346 cos_dlam = cos(dlam);
347 g = 1.0 + Sin_Stereo_Origin_Lat * slat + Cos_Stereo_Origin_Lat * clat * cos_dlam;
348 if (fabs(g) <= 1.0e-10)
357 if (fabs(fabs(latitude) -
PI_OVER_2) < 1.0e-10)
359 easting = Stereo_False_Easting;
360 northing = Stereo_False_Northing;
364 if (Stereo_Origin_Lat > 0)
366 num = Two_Stereo_Ra * tan(
PI_OVER_4 - latitude / 2.0);
367 easting = Stereo_False_Easting + num * sin(dlam);
368 northing = Stereo_False_Northing + (-num * cos_dlam);
372 num = Two_Stereo_Ra * tan(
PI_OVER_4 + latitude / 2.0);
373 easting = Stereo_False_Easting + num * sin(dlam);
374 northing = Stereo_False_Northing + num * cos_dlam;
380 if (fabs(Stereo_Origin_Lat) <= 1.0e-10)
382 k = 2.0 / (1.0 + clat * cos_dlam);
383 Ra_k = Stereo_Ra * k;
384 northing = Stereo_False_Northing + Ra_k * slat;
389 Ra_k = Stereo_Ra * k;
390 northing = Stereo_False_Northing + Ra_k * (Cos_Stereo_Origin_Lat * slat - Sin_Stereo_Origin_Lat * clat * cos_dlam);
392 easting = Stereo_False_Easting + Ra_k * clat * sin(dlam);
419 double longitude, latitude;
421 double easting = mapProjectionCoordinates->
easting();
422 double northing = mapProjectionCoordinates->
northing();
424 if ((easting < (Stereo_False_Easting - Stereo_Delta_Easting))
425 ||(easting > (Stereo_False_Easting + Stereo_Delta_Easting)))
429 if ((northing < (Stereo_False_Northing - Stereo_Delta_Northing))
430 || (northing > (Stereo_False_Northing + Stereo_Delta_Northing)))
435 dy = northing - Stereo_False_Northing;
436 dx = easting - Stereo_False_Easting;
437 rho = sqrt(dx * dx + dy * dy);
438 if (fabs(rho) <= 1.0e-10)
440 latitude = Stereo_Origin_Lat;
441 longitude = Stereo_Origin_Long;
445 c = 2.0 * atan(rho / (Two_Stereo_Ra));
448 dy_sin_c = dy * sin_c;
451 if (Stereo_Origin_Lat > 0)
452 longitude = Stereo_Origin_Long + atan2(dx, -dy);
454 longitude = Stereo_Origin_Long + atan2(dx, dy);
457 longitude = Stereo_Origin_Long + atan2(dx * sin_c, (rho * Cos_Stereo_Origin_Lat * cos_c - dy_sin_c * Sin_Stereo_Origin_Lat));
458 latitude = asin(cos_c * Sin_Stereo_Origin_Lat + ((dy_sin_c * Cos_Stereo_Origin_Lat) / rho));
461 if (fabs(latitude) < 2.2e-8)
470 if (longitude -
PI < 3.5e-6)
477 if (fabs(longitude +
PI) < 3.5e-6)
483 if (fabs(longitude) < 2.0e-7)
487 else if (longitude < -
PI)