106 using namespace MSP::CCS;
114 const double PI = 3.14159265358979323e0;
121 return coeff * (sin (x * latit));
130 Cassini::Cassini(
double ellipsoidSemiMajorAxis,
double ellipsoidFlattening,
double centralMeridian,
double originLatitude,
double falseEasting,
double falseNorthing ) :
132 es2( 0.0066943799901413800 ),
133 es4( 4.4814723452405e-005 ),
134 es6( 3.0000678794350e-007 ),
136 c0( .99832429845280 ),
137 c1( .0025146070605187 ),
138 c2( 2.6390465943377e-006 ),
139 c3( 3.4180460865959e-009 ),
140 One_Minus_es2( .99330562000986 ),
141 a0( .0025188265843907 ),
142 a1( 3.7009490356205e-006 ),
143 a2( 7.4478137675038e-009 ),
144 a3( 1.7035993238596e-011 ),
145 Cass_Origin_Long( 0.0 ),
146 Cass_Origin_Lat( 0.0 ),
147 Cass_False_Easting( 0.0 ),
148 Cass_False_Northing( 0.0 ),
149 Cass_Min_Easting( -20037508.4 ),
150 Cass_Max_Easting( 20037508.4 ),
151 Cass_Min_Northing( -56575846.0 ),
152 Cass_Max_Northing( 56575846.0 )
173 double x, e1, e2, e3, e4;
174 double lat, sin2lat, sin4lat, sin6lat;
175 double inv_f = 1 / ellipsoidFlattening;
177 if (ellipsoidSemiMajorAxis <= 0.0)
181 if ((inv_f < 250) || (inv_f > 350))
189 if ((centralMeridian < -
PI) || (centralMeridian >
TWO_PI))
197 Cass_Origin_Lat = originLatitude;
198 if (centralMeridian >
PI)
199 centralMeridian -=
TWO_PI;
200 Cass_Origin_Long = centralMeridian;
201 Cass_False_Northing = falseNorthing;
202 Cass_False_Easting = falseEasting;
206 j = 45.0 * es6 / 1024.0;
207 three_es4 = 3.0 * es4;
208 c0 = 1 - es2 / 4.0 - three_es4 / 64.0 - 5.0 * es6 / 256.0;
209 c1 = 3.0 * es2 /8.0 + three_es4 / 32.0 + j;
210 c2 = 15.0 * es4 / 256.0 + j;
211 c3 = 35.0 * es6 / 3072.0;
212 lat = c0 * Cass_Origin_Lat;
216 M0 = cassM( lat, sin2lat, sin4lat, sin6lat );
218 One_Minus_es2 = 1.0 - es2;
219 x = sqrt (One_Minus_es2);
220 e1 = (1 - x) / (1 + x);
224 a0 = 3.0 * e1 / 2.0 - 27.0 * e3 / 32.0;
225 a1 = 21.0 * e2 / 16.0 - 55.0 * e4 / 32.0;
226 a2 = 151.0 * e3 / 96.0;
227 a3 = 1097.0 * e4 /512.0;
229 if (Cass_Origin_Long > 0)
233 Cass_Max_Northing = tempCoordinates->
northing();
234 delete tempCoordinates;
238 Cass_Min_Northing = tempCoordinates->
northing();
239 delete tempCoordinates;
241 Cass_Max_Easting = 19926188.9;
242 Cass_Min_Easting = -20037508.4;
244 else if (Cass_Origin_Long < 0)
248 Cass_Max_Northing = tempCoordinates->
northing();
249 delete tempCoordinates;
253 Cass_Min_Northing = tempCoordinates->
northing();
254 delete tempCoordinates;
256 Cass_Max_Easting = 20037508.4;
257 Cass_Min_Easting = -19926188.9;
263 Cass_Max_Northing = tempCoordinates->
northing();
264 delete tempCoordinates;
268 Cass_Min_Northing = tempCoordinates->
northing();
269 delete tempCoordinates;
271 Cass_Max_Easting = 20037508.4;
272 Cass_Min_Easting = -20037508.4;
275 if(Cass_False_Northing)
277 Cass_Min_Northing -= Cass_False_Northing;
278 Cass_Max_Northing -= Cass_False_Northing;
295 One_Minus_es2 = c.One_Minus_es2;
300 Cass_Origin_Long = c.Cass_Origin_Long;
301 Cass_Origin_Lat = c.Cass_Origin_Lat;
302 Cass_False_Easting = c.Cass_False_Easting;
303 Cass_False_Northing = c.Cass_False_Northing;
304 Cass_Min_Easting = c.Cass_Min_Easting;
305 Cass_Max_Easting = c.Cass_Max_Easting;
306 Cass_Min_Northing = c.Cass_Min_Northing;
307 Cass_Max_Northing = c.Cass_Max_Northing;
330 One_Minus_es2 = c.One_Minus_es2;
335 Cass_Origin_Long = c.Cass_Origin_Long;
336 Cass_Origin_Lat = c.Cass_Origin_Lat;
337 Cass_False_Easting = c.Cass_False_Easting;
338 Cass_False_Northing = c.Cass_False_Northing;
339 Cass_Min_Easting = c.Cass_Min_Easting;
340 Cass_Max_Easting = c.Cass_Max_Easting;
341 Cass_Min_Northing = c.Cass_Min_Northing;
342 Cass_Max_Northing = c.Cass_Max_Northing;
386 double lat, sin2lat, sin4lat, sin6lat;
391 double AA, A2, A3, A4, A5;
395 double longitude = geodeticCoordinates->
longitude();
396 double latitude = geodeticCoordinates->
latitude();
397 double tlat = tan(latitude);
398 double clat = cos(latitude);
399 double slat = sin(latitude);
405 if ((longitude < -
PI) || (longitude >
TWO_PI))
410 dlam = longitude - Cass_Origin_Long;
414 if (fabs(dlam) > (4.0 *
PI / 180))
435 CC = es2 * clat * clat / One_Minus_es2;
440 MM = cassM( lat, sin2lat, sin4lat, sin6lat );
442 double easting = NN * (AA - (TT * A3 / 6.0) - (8.0 - TT + 8.0 * CC) *
443 (TT * A5 / 120.0)) + Cass_False_Easting;
444 double northing = MM - M0 + NN * tlat * ((A2 / 2.0) + (5.0 - TT +
445 6.0 * CC) * A4 / 24.0) + Cass_False_Northing;
471 double sin2mu, sin4mu, sin6mu, sin8mu;
474 double tanphi1, sinphi1, cosphi1;
478 double DD, D2, D3, D4, D5;
479 const double epsilon = 1.0e-1;
480 double longitude, latitude;
482 double easting = mapProjectionCoordinates->
easting();
483 double northing = mapProjectionCoordinates->
northing();
485 if ((easting < (Cass_False_Easting + Cass_Min_Easting))
486 || (easting > (Cass_False_Easting + Cass_Max_Easting)))
490 if ((northing < (Cass_False_Northing + Cass_Min_Northing - epsilon))
491 || (northing > (Cass_False_Northing + Cass_Max_Northing + epsilon)))
496 dy = northing - Cass_False_Northing;
497 dx = easting - Cass_False_Easting;
505 phi1 = mu1 + sin2mu + sin4mu + sin6mu + sin8mu;
510 longitude = Cass_Origin_Long;
512 else if (floatEq(phi1,-
PI_OVER_2,.00001))
515 longitude = Cass_Origin_Long;
522 T1 = tanphi1 * tanphi1;
523 RD = cassRd( sinphi1 );
525 R1 = N1 * One_Minus_es2 / (RD * RD);
531 T = (1.0 + 3.0 * T1);
532 latitude = phi1 - (N1 * tanphi1 / R1) * (D2 / 2.0 - T * D4 / 24.0);
534 longitude = Cass_Origin_Long + (DD - T1 * D3 / 3.0 + T * T1 * D5 / 15.0) / cosphi1;
548 else if (longitude < -
PI)
554 if (fabs(longitude - Cass_Origin_Long) > (4.0 *
PI / 180))
564 double Cassini::cassM(
565 double c0lat,
double c1s2lat,
double c2s4lat,
double c3s6lat )
571 double Cassini::cassRd(
double sinlat )
573 return sqrt(1.0 - es2 * (sinlat * sinlat));
577 double Cassini::floatEq(
double x,
double v,
double epsilon )
579 return ((v - epsilon) < x) && (x < (v + epsilon));