108 using namespace MSP::CCS;
116 const double PI = 3.14159265358979323e0;
129 double ellipsoidSemiMajorAxis,
130 double ellipsoidFlattening,
131 double centralMeridian,
132 double latitudeOfTrueScale,
134 double falseNorthing,
135 double scaleFactor ) :
137 es2( 0.0066943799901413800 ),
138 es4( 4.4814723452405e-005 ),
139 es6( 3.0000678794350e-007 ),
140 es( .081819190842622 ),
142 qp( 1.9955310875028 ),
143 One_MINUS_es2( .99330562000986 ),
144 One_OVER_2es( 6.1110357466348 ),
145 a0( .0022392088624809 ),
146 a1( 2.8830839728915e-006 ),
147 a2( 5.0331826636906e-009 ),
148 b0( .0025188265843907 ),
149 b1( 3.7009490356205e-006 ),
150 b2( 7.4478137675038e-009 ),
151 b3( 1.7035993238596e-011 ),
152 c0( .99832429845280 ),
153 c1( .0025146070605187 ),
154 c2( 2.6390465943377e-006 ),
155 c3( 3.4180460865959e-009 ),
156 Tcea_Origin_Long( 0.0 ),
157 Tcea_Origin_Lat( 0.0 ),
158 Tcea_False_Easting( 0.0 ),
159 Tcea_False_Northing( 0.0 ),
160 Tcea_Scale_Factor( 1.0 ),
161 Tcea_Min_Easting( -6398628.0 ),
162 Tcea_Max_Easting( 6398628.0 ),
163 Tcea_Min_Northing( -20003931.0 ),
164 Tcea_Max_Northing( 20003931.0 )
188 double x, j, three_es4;
189 double Sqrt_One_MINUS_es2;
190 double e1, e2, e3, e4;
191 double lat, sin2lat, sin4lat, sin6lat;
192 double temp, temp_northing;
193 double inv_f = 1 / ellipsoidFlattening;
195 if (ellipsoidSemiMajorAxis <= 0.0)
199 if ((inv_f < 250) || (inv_f > 350))
207 if ((centralMeridian < -
PI) || (centralMeridian >
TWO_PI))
219 Tcea_Origin_Lat = latitudeOfTrueScale;
220 if (centralMeridian >
PI)
221 centralMeridian -=
TWO_PI;
222 Tcea_Origin_Long = centralMeridian;
223 Tcea_False_Northing = falseNorthing;
224 Tcea_False_Easting = falseEasting;
225 Tcea_Scale_Factor = scaleFactor;
229 One_MINUS_es2 = 1.0 - es2;
230 Sqrt_One_MINUS_es2 = sqrt(One_MINUS_es2);
231 One_OVER_2es = 1.0 / (2.0 * es);
235 qp = TCEA_Q(sin_lat_90,x);
237 a0 = es2 / 3.0 + 31.0 * es4 / 180.0 + 517.0 * es6 / 5040.0;
238 a1 = 23.0 * es4 / 360.0 + 251.0 * es6 / 3780.0;
239 a2 = 761.0 * es6 / 45360.0;
241 e1 = (1.0 - Sqrt_One_MINUS_es2) / (1.0 + Sqrt_One_MINUS_es2);
245 b0 = 3.0 * e1 / 2.0 - 27.0 * e3 / 32.0;
246 b1 = 21.0 * e2 / 16.0 - 55.0 * e4 / 32.0;
247 b2 = 151.0 * e3 / 96.0;
248 b3 = 1097.0 * e4 / 512.0;
250 j = 45.0 * es6 / 1024.0;
251 three_es4 = 3.0 * es4;
252 c0 = 1.0 - es2 / 4.0 - three_es4 / 64.0 - 5.0 * es6 / 256.0;
253 c1 = 3.0 * es2 / 8.0 + three_es4 / 32.0 + j;
254 c2 = 15.0 * es4 / 256.0 + j;
255 c3 = 35.0 * es6 / 3072.0;
256 lat = c0 * Tcea_Origin_Lat;
257 sin2lat = TCEA_COEFF_TIMES_SIN(c1, 2.0, Tcea_Origin_Lat);
258 sin4lat = TCEA_COEFF_TIMES_SIN(c2, 4.0, Tcea_Origin_Lat);
259 sin6lat = TCEA_COEFF_TIMES_SIN(c3, 6.0, Tcea_Origin_Lat);
260 M0 = TCEA_M(lat, sin2lat, sin4lat, sin6lat);
264 temp = tempCoordinates->
easting();
265 temp_northing = tempCoordinates->
northing();
266 delete tempCoordinates;
268 if (temp_northing > 0)
270 Tcea_Min_Northing = temp_northing - 20003931.458986;
271 Tcea_Max_Northing = temp_northing;
273 if(Tcea_False_Northing)
275 Tcea_Min_Northing -= Tcea_False_Northing;
276 Tcea_Max_Northing -= Tcea_False_Northing;
279 else if (temp_northing < 0)
281 Tcea_Max_Northing = temp_northing + 20003931.458986;
282 Tcea_Min_Northing = temp_northing;
284 if(Tcea_False_Northing)
286 Tcea_Min_Northing -= Tcea_False_Northing;
287 Tcea_Max_Northing -= Tcea_False_Northing;
304 One_MINUS_es2 = tcea.One_MINUS_es2;
305 One_OVER_2es = tcea.One_OVER_2es;
317 Tcea_Origin_Long = tcea.Tcea_Origin_Long;
318 Tcea_Origin_Lat = tcea.Tcea_Origin_Lat;
319 Tcea_False_Easting = tcea.Tcea_False_Easting;
320 Tcea_False_Northing = tcea.Tcea_False_Northing;
321 Tcea_Scale_Factor = tcea.Tcea_Scale_Factor;
322 Tcea_Min_Easting = tcea.Tcea_Min_Easting;
323 Tcea_Max_Easting = tcea.Tcea_Max_Easting;
324 Tcea_Min_Northing = tcea.Tcea_Min_Northing;
325 Tcea_Max_Northing = tcea.Tcea_Max_Northing;
346 One_MINUS_es2 = tcea.One_MINUS_es2;
347 One_OVER_2es = tcea.One_OVER_2es;
359 Tcea_Origin_Long = tcea.Tcea_Origin_Long;
360 Tcea_Origin_Lat = tcea.Tcea_Origin_Lat;
361 Tcea_False_Easting = tcea.Tcea_False_Easting;
362 Tcea_False_Northing = tcea.Tcea_False_Northing;
363 Tcea_Scale_Factor = tcea.Tcea_Scale_Factor;
364 Tcea_Min_Easting = tcea.Tcea_Min_Easting;
365 Tcea_Max_Easting = tcea.Tcea_Max_Easting;
366 Tcea_Min_Northing = tcea.Tcea_Min_Northing;
367 Tcea_Max_Northing = tcea.Tcea_Max_Northing;
416 double qq, qq_OVER_qp;
418 double sin2betac, sin4betac, sin6betac;
420 double phi, sin2phi, sin4phi, sin6phi;
424 double longitude = geodeticCoordinates->
longitude();
425 double latitude = geodeticCoordinates->
latitude();
426 double sin_lat = sin(latitude);
432 if ((longitude < -
PI) || (longitude >
TWO_PI))
437 dlam = longitude - Tcea_Origin_Long;
441 if (fabs(dlam) >= (
PI / 2))
462 qq = TCEA_Q(sin_lat, x);
463 qq_OVER_qp = qq / qp;
467 if (qq_OVER_qp > 1.0)
469 else if (qq_OVER_qp < -1.0)
472 beta = asin(qq_OVER_qp);
473 betac = atan(tan(beta) / cos(dlam));
479 sin2betac = TCEA_COEFF_TIMES_SIN(a0, 2.0, betac);
480 sin4betac = TCEA_COEFF_TIMES_SIN(a1, 4.0, betac);
481 sin6betac = TCEA_COEFF_TIMES_SIN(a2, 6.0, betac);
482 PHIc = TCEA_L(betac, sin2betac, sin4betac, sin6betac);
486 double easting =
semiMajorAxis * cos(beta) * cos(PHIc) * sin(dlam) /
487 (Tcea_Scale_Factor * cos(betac) * sqrt(1.0 - es2 *
488 sinPHIc * sinPHIc)) + Tcea_False_Easting;
491 sin2phi = TCEA_COEFF_TIMES_SIN(c1, 2.0, PHIc);
492 sin4phi = TCEA_COEFF_TIMES_SIN(c2, 4.0, PHIc);
493 sin6phi = TCEA_COEFF_TIMES_SIN(c3, 6.0, PHIc);
494 Mc = TCEA_M(phi, sin2phi, sin4phi, sin6phi);
496 double northing = Tcea_Scale_Factor * (Mc - M0) + Tcea_False_Northing;
500 warning, easting, northing );
526 double sin2mu, sin4mu, sin6mu, sin8mu;
530 double beta, betac, beta_prime;
531 double sin2beta, sin4beta, sin6beta;
536 double easting = mapProjectionCoordinates->
easting();
537 double northing = mapProjectionCoordinates->
northing();
539 if ((easting < (Tcea_False_Easting + Tcea_Min_Easting))
540 || (easting > (Tcea_False_Easting + Tcea_Max_Easting)))
544 if( (northing < (Tcea_False_Northing + Tcea_Min_Northing))
545 || (northing > (Tcea_False_Northing + Tcea_Max_Northing)))
550 dy = northing - Tcea_False_Northing;
551 dx = easting - Tcea_False_Easting;
552 Mc = M0 + dy / Tcea_Scale_Factor;
555 sin2mu = TCEA_COEFF_TIMES_SIN(b0, 2.0, MUc);
556 sin4mu = TCEA_COEFF_TIMES_SIN(b1, 4.0, MUc);
557 sin6mu = TCEA_COEFF_TIMES_SIN(b2, 6.0, MUc);
558 sin8mu = TCEA_COEFF_TIMES_SIN(b3, 8.0, MUc);
559 PHIc = MUc + sin2mu + sin4mu + sin6mu + sin8mu;
563 Qc = TCEA_Q(sin_lat, x);
564 Qc_OVER_qp = Qc / qp;
566 if (Qc_OVER_qp < -1.0)
568 else if (Qc_OVER_qp > 1.0)
571 betac = asin(Qc_OVER_qp);
572 cosbetac = cos(betac);
573 temp = Tcea_Scale_Factor * dx * cosbetac * sqrt(1.0 -
577 else if (temp < -1.0)
579 beta_prime = -asin(temp);
580 beta = asin(cos(beta_prime) * sin(betac));
582 sin2beta = TCEA_COEFF_TIMES_SIN(a0, 2.0, beta);
583 sin4beta = TCEA_COEFF_TIMES_SIN(a1, 4.0, beta);
584 sin6beta = TCEA_COEFF_TIMES_SIN(a2, 6.0, beta);
585 double latitude = TCEA_L(beta, sin2beta, sin4beta, sin6beta);
587 double longitude = Tcea_Origin_Long - atan(tan(beta_prime) / cosbetac);
601 else if (longitude < -
PI)
609 double TransverseCylindricalEqualArea::TCEA_Q(
double sinlat,
double x )
611 return One_MINUS_es2*(sinlat/(1.0-es2*sinlat*sinlat)-One_OVER_2es*log((1-x)/(1+x)));
615 double TransverseCylindricalEqualArea::TCEA_COEFF_TIMES_SIN(
616 double coeff,
double x,
double latit )
618 return coeff * sin(x*latit);
622 double TransverseCylindricalEqualArea::TCEA_M(
623 double c0lat,
double c1lat,
double c2lat,
double c3lat )
629 double TransverseCylindricalEqualArea::TCEA_L(
630 double Beta,
double c0lat,
double c1lat,
double c2lat )
632 return Beta + c0lat + c1lat + c2lat;