106 using namespace MSP::CCS;
114 const double PI = 3.14159265358979323e0;
122 return coeff * (sin (x * latit));
131 Polyconic::Polyconic(
double ellipsoidSemiMajorAxis,
double ellipsoidFlattening,
double centralMeridian,
double originLatitude,
double falseEasting,
double falseNorthing ) :
133 es2( 0.0066943799901413800 ),
134 es4( 4.4814723452405e-005 ),
135 es6( 3.0000678794350e-007 ),
137 c0( .99832429845280 ),
138 c1( .0025146070605187 ),
139 c2( 2.6390465943377e-006 ),
140 c3( 3.4180460865959e-009 ),
141 Poly_Origin_Long( 0.0 ),
142 Poly_Origin_Lat( 0.0 ),
143 Poly_False_Easting( 0.0 ),
144 Poly_False_Northing( 0.0 ),
145 Poly_Max_Easting( 20037509.0 ),
146 Poly_Max_Northing( 15348215.0 ),
147 Poly_Min_Easting( -20037509.0 ),
148 Poly_Min_Northing( -15348215.0 )
169 double lat, sin2lat, sin4lat, sin6lat;
170 double inv_f = 1 / ellipsoidFlattening;
172 if (ellipsoidSemiMajorAxis <= 0.0)
176 if ((inv_f < 250) || (inv_f > 350))
184 if ((centralMeridian < -
PI) || (centralMeridian >
TWO_PI))
192 Poly_Origin_Lat = originLatitude;
193 if (centralMeridian >
PI)
194 centralMeridian -=
TWO_PI;
195 Poly_Origin_Long = centralMeridian;
196 Poly_False_Northing = falseNorthing;
197 Poly_False_Easting = falseEasting;
202 j = 45.0 * es6 / 1024.0;
203 three_es4 = 3.0 * es4;
204 c0 = 1.0 - es2 / 4.0 - three_es4 / 64.0 - 5.0 * es6 / 256.0;
205 c1 = 3.0 * es2 / 8.0 + three_es4 / 32.0 + j;
206 c2 = 15.0 * es4 / 256.0 + j;
207 c3 = 35.0 * es6 / 3072.0;
209 lat = c0 * Poly_Origin_Lat;
213 M0 = polyM(lat, sin2lat, sin4lat, sin6lat);
215 if (Poly_Origin_Long > 0)
219 Poly_Max_Northing = tempCoordinates->
northing();
220 delete tempCoordinates;
224 Poly_Min_Northing = tempCoordinates->
northing();
225 delete tempCoordinates;
227 Poly_Max_Easting = 19926189.0;
228 Poly_Min_Easting = -20037509.0;
230 else if (Poly_Origin_Long < 0)
234 Poly_Max_Northing = tempCoordinates->
northing();
235 delete tempCoordinates;
239 Poly_Min_Northing = tempCoordinates->
northing();
240 delete tempCoordinates;
242 Poly_Max_Easting = 20037509.0;
243 Poly_Min_Easting = -19926189.0;
249 Poly_Max_Northing = tempCoordinates->
northing();
250 delete tempCoordinates;
254 delete tempCoordinates;
256 Poly_Max_Easting = 20037509.0;
257 Poly_Min_Easting = -20037509.0;
260 if(Poly_False_Northing)
262 Poly_Max_Northing -= Poly_False_Northing;
263 Poly_Min_Northing -= Poly_False_Northing;
280 Poly_Origin_Long = p.Poly_Origin_Long;
281 Poly_Origin_Lat = p.Poly_Origin_Lat;
282 Poly_False_Easting = p.Poly_False_Easting;
283 Poly_False_Northing = p.Poly_False_Northing;
284 Poly_Max_Easting = p.Poly_Max_Easting;
285 Poly_Max_Northing = p.Poly_Max_Northing;
286 Poly_Min_Easting = p.Poly_Min_Easting;
287 Poly_Min_Northing = p.Poly_Min_Northing;
310 Poly_Origin_Long = p.Poly_Origin_Long;
311 Poly_Origin_Lat = p.Poly_Origin_Lat;
312 Poly_False_Easting = p.Poly_False_Easting;
313 Poly_False_Northing = p.Poly_False_Northing;
314 Poly_Max_Easting = p.Poly_Max_Easting;
315 Poly_Max_Northing = p.Poly_Max_Northing;
316 Poly_Min_Easting = p.Poly_Min_Easting;
317 Poly_Min_Northing = p.Poly_Min_Northing;
362 double lat, sin2lat, sin4lat, sin6lat;
368 double easting, northing;
370 double longitude = geodeticCoordinates->
longitude();
371 double latitude = geodeticCoordinates->
latitude();
372 double slat = sin(latitude);
378 if ((longitude < -
PI) || (longitude >
TWO_PI))
385 dlam = longitude - Poly_Origin_Long;
386 if (fabs(dlam) > (
PI / 2))
401 northing = -M0 + Poly_False_Northing;
406 NN_OVER_tlat = NN / tan(latitude);
411 MM = polyM(lat, sin2lat, sin4lat, sin6lat);
413 easting = NN_OVER_tlat * sin(EE) + Poly_False_Easting;
414 northing = MM - M0 + NN_OVER_tlat * (1.0 - cos(EE)) +
440 double dx_OVER_Poly_a;
444 double PHIn, Delta_PHI = 1.0;
446 double PHI, sin2PHI,sin4PHI, sin6PHI;
447 double Mn, Mn_prime, Ma;
451 double tolerance = 1.0e-12;
453 double longitude, latitude;
456 double easting = mapProjectionCoordinates->
easting();
457 double northing = mapProjectionCoordinates->
northing();
459 if ((easting < (Poly_False_Easting + Poly_Min_Easting))
460 || (easting > (Poly_False_Easting + Poly_Max_Easting)))
464 if ((northing < (Poly_False_Northing + Poly_Min_Northing))
465 || (northing > (Poly_False_Northing + Poly_Max_Northing)))
470 dy = northing - Poly_False_Northing;
471 dx = easting - Poly_False_Easting;
473 if (floatEq(dy,-M0,1))
476 longitude = dx_OVER_Poly_a + Poly_Origin_Long;
481 BB = dx_OVER_Poly_a * dx_OVER_Poly_a + (AA * AA);
484 while (fabs(Delta_PHI) > tolerance && count)
486 sin_PHIn = sin(PHIn);
487 CC = sqrt(1.0 - es2 * sin_PHIn * sin_PHIn) * tan(PHIn);
492 Mn = polyM(PHI, sin2PHI, sin4PHI, sin6PHI);
493 Mn_prime = c0 - 2.0 * c1 * cos(2.0 * PHIn) + 4.0 * c2 * cos(4.0 * PHIn) -
494 6.0 * c3 * cos(6.0 * PHIn);
497 Ma2_PLUS_BB = Ma * Ma + BB;
498 AA_MINUS_Ma = AA - Ma;
499 Delta_PHI = (AA_Ma * CC + AA_MINUS_Ma - 0.5 * (Ma2_PLUS_BB) * CC) /
500 (es2 * sin2PHI * (Ma2_PLUS_BB - 2.0 * AA_Ma) /
501 4.0 * CC + (AA_MINUS_Ma) * (CC * Mn_prime - 2.0 / sin2PHI) - Mn_prime);
516 if (floatEq(fabs(latitude),
PI_OVER_2,.00001) || (latitude == 0))
517 longitude = Poly_Origin_Long;
521 longitude = (asin(dx_OVER_Poly_a * CC)) / sin(latitude) +
532 else if (longitude < -
PI)
539 double Polyconic::polyM(
double c0lat,
double c1s2lat,
double c2s4lat,
double c3s6lat )
541 return semiMajorAxis * (c0lat - c1s2lat + c2s4lat - c3s6lat);
545 double Polyconic::floatEq(
double x,
double v,
double epsilon )
547 return ((v - epsilon) < x) && (x < (v + epsilon));