rspfDpt rspfPolarStereoProjection::forward(const rspfGpt &latLon)const { double easting = 0.0; double northing = 0.0; rspfGpt gpt = latLon; if (theDatum) { if (theDatum->code() != latLon.datum()->code()) { gpt.changeDatum(theDatum); // Shift to our datum. } } Convert_Geodetic_To_Polar_Stereographic(gpt.latr(), gpt.lonr(), &easting, &northing); return rspfDpt(easting, northing); }
long Convert_Geodetic_To_UPS ( double Latitude, double Longitude, char *Hemisphere, double *Easting, double *Northing) { /* * The function Convert_Geodetic_To_UPS converts geodetic (latitude and * longitude) coordinates to UPS (hemisphere, easting, and northing) * coordinates, according to the current ellipsoid parameters. If any * errors occur, the error code(s) are returned by the function, * otherwide UPS_NO_ERROR is returned. * * Latitude : Latitude in radians (input) * Longitude : Longitude in radians (input) * Hemisphere : Hemisphere either 'N' or 'S' (output) * Easting : Easting/X in meters (output) * Northing : Northing/Y in meters (output) */ double tempEasting, tempNorthing; long Error_Code = UPS_NO_ERROR; if ((Latitude < -MAX_LAT) || (Latitude > MAX_LAT)) { /* latitude out of range */ Error_Code |= UPS_LAT_ERROR; } if ((Latitude < 0) && (Latitude > MIN_SOUTH_LAT)) Error_Code |= UPS_LAT_ERROR; if ((Latitude >= 0) && (Latitude < MIN_NORTH_LAT)) Error_Code |= UPS_LAT_ERROR; if ((Longitude < -PI) || (Longitude > (2 * PI))) { /* slam out of range */ Error_Code |= UPS_LON_ERROR; } if (!Error_Code) { /* no errors */ if (Latitude < 0) { UPS_Origin_Latitude = -MAX_ORIGIN_LAT; *Hemisphere = 'S'; } else { UPS_Origin_Latitude = MAX_ORIGIN_LAT; *Hemisphere = 'N'; } Set_Polar_Stereographic_Parameters( UPS_a, UPS_f, UPS_Origin_Latitude, UPS_Origin_Longitude, false_easting, false_northing); Convert_Geodetic_To_Polar_Stereographic(Latitude, Longitude, &tempEasting, &tempNorthing); UPS_Easting = UPS_False_Easting + tempEasting; UPS_Northing = UPS_False_Northing + tempNorthing; *Easting = UPS_Easting; *Northing = UPS_Northing; } /* END of if(!Error_Code) */ return (Error_Code); } /* END OF Convert_Geodetic_To_UPS */
/* FUNCTIONS * */ long rspfPolarStereoProjection::Set_Polar_Stereographic_Parameters (double a, double f, double Latitude_of_True_Scale, double Longitude_Down_from_Pole, double False_Easting, double False_Northing) { /* BEGIN Set_Polar_Stereographic_Parameters */ /* * The function Set_Polar_Stereographic_Parameters receives the ellipsoid * parameters and Polar Stereograpic projection parameters as inputs, and * sets the corresponding state variables. If any errors occur, error * code(s) are returned by the function, otherwise POLAR_NO_ERROR is returned. * * a : Semi-major axis of ellipsoid, in meters (input) * f : Flattening of ellipsoid (input) * Latitude_of_True_Scale : Latitude of true scale, in radians (input) * Longitude_Down_from_Pole : Longitude down from pole, in radians (input) * False_Easting : Easting (X) at center of projection, in meters (input) * False_Northing : Northing (Y) at center of projection, in meters (input) */ double es2; double slat, clat; double essin; double one_PLUS_es, one_MINUS_es; double pow_es; double temp; const double epsilon = 1.0e-2; long Error_Code = POLAR_NO_ERROR; if (!Error_Code) { /* no errors */ Polar_a = a; two_Polar_a = 2.0 * Polar_a; Polar_f = f; if (Longitude_Down_from_Pole > M_PI) Longitude_Down_from_Pole -= TWO_PI; if (Latitude_of_True_Scale < 0) { Southern_Hemisphere = 1; Polar_Origin_Lat = -Latitude_of_True_Scale; Polar_Origin_Long = -Longitude_Down_from_Pole; } else { Southern_Hemisphere = 0; Polar_Origin_Lat = Latitude_of_True_Scale; Polar_Origin_Long = Longitude_Down_from_Pole; } Polar_False_Easting = False_Easting; Polar_False_Northing = False_Northing; es2 = 2 * Polar_f - Polar_f * Polar_f; es = sqrt(es2); es_OVER_2 = es / 2.0; if (fabs(fabs(Polar_Origin_Lat) - PI_OVER_2) > 1.0e-10) { slat = sin(Polar_Origin_Lat); essin = es * slat; pow_es = POLAR_POW(essin); clat = cos(Polar_Origin_Lat); mc = clat / sqrt(1.0 - essin * essin); Polar_a_mc = Polar_a * mc; tc = tan(PI_Over_4 - Polar_Origin_Lat / 2.0) / pow_es; } else { one_PLUS_es = 1.0 + es; one_MINUS_es = 1.0 - es; e4 = sqrt(pow(one_PLUS_es, one_PLUS_es) * pow(one_MINUS_es, one_MINUS_es)); } } /* Calculate Radius */ Convert_Geodetic_To_Polar_Stereographic(0, Polar_Origin_Long, &temp, &Polar_Delta_Northing); Polar_Delta_Northing = fabs(Polar_Delta_Northing) + epsilon; Polar_Delta_Easting = Polar_Delta_Northing; return (Error_Code); } /* END OF Set_Polar_Stereographic_Parameters */
long Set_Polar_Stereographic_Parameters (double a, double f, double Latitude_of_True_Scale, double Longitude_Down_from_Pole, double False_Easting, double False_Northing) { /* BEGIN Set_Polar_Stereographic_Parameters */ /* * The function Set_Polar_Stereographic_Parameters receives the ellipsoid * parameters and Polar Stereograpic projection parameters as inputs, and * sets the corresponding state variables. If any errors occur, error * code(s) are returned by the function, otherwise POLAR_NO_ERROR is returned. * * a : Semi-major axis of ellipsoid, in meters (input) * f : Flattening of ellipsoid (input) * Latitude_of_True_Scale : Latitude of true scale, in radians (input) * Longitude_Down_from_Pole : Longitude down from pole, in radians (input) * False_Easting : Easting (X) at center of projection, in meters (input) * False_Northing : Northing (Y) at center of projection, in meters (input) */ double es2; double slat, clat; double essin; double one_PLUS_es, one_MINUS_es; double pow_es; double temp, temp_northing = 0; double inv_f = 1 / f; double mc; // const double epsilon = 1.0e-2; long Error_Code = POLAR_NO_ERROR; if (a <= 0.0) { /* Semi-major axis must be greater than zero */ Error_Code |= POLAR_A_ERROR; } if ((inv_f < 250) || (inv_f > 350)) { /* Inverse flattening must be between 250 and 350 */ Error_Code |= POLAR_INV_F_ERROR; } if ((Latitude_of_True_Scale < -PI_OVER_2) || (Latitude_of_True_Scale > PI_OVER_2)) { /* Origin Latitude out of range */ Error_Code |= POLAR_ORIGIN_LAT_ERROR; } if ((Longitude_Down_from_Pole < -PI) || (Longitude_Down_from_Pole > TWO_PI)) { /* Origin Longitude out of range */ Error_Code |= POLAR_ORIGIN_LON_ERROR; } if (!Error_Code) { /* no errors */ Polar_a = a; two_Polar_a = 2.0 * Polar_a; Polar_f = f; if (Longitude_Down_from_Pole > PI) Longitude_Down_from_Pole -= TWO_PI; if (Latitude_of_True_Scale < 0) { Southern_Hemisphere = 1; Polar_Origin_Lat = -Latitude_of_True_Scale; Polar_Origin_Long = -Longitude_Down_from_Pole; } else { Southern_Hemisphere = 0; Polar_Origin_Lat = Latitude_of_True_Scale; Polar_Origin_Long = Longitude_Down_from_Pole; } Polar_False_Easting = False_Easting; Polar_False_Northing = False_Northing; es2 = 2 * Polar_f - Polar_f * Polar_f; es = sqrt(es2); es_OVER_2 = es / 2.0; if (fabs(fabs(Polar_Origin_Lat) - PI_OVER_2) > 1.0e-10) { slat = sin(Polar_Origin_Lat); essin = es * slat; pow_es = POLAR_POW(essin); clat = cos(Polar_Origin_Lat); mc = clat / sqrt(1.0 - essin * essin); Polar_a_mc = Polar_a * mc; tc = tan(PI_Over_4 - Polar_Origin_Lat / 2.0) / pow_es; } else { one_PLUS_es = 1.0 + es; one_MINUS_es = 1.0 - es; e4 = sqrt(pow(one_PLUS_es, one_PLUS_es) * pow(one_MINUS_es, one_MINUS_es)); } /* Calculate Radius */ Convert_Geodetic_To_Polar_Stereographic(0, Longitude_Down_from_Pole, &temp, &temp_northing); Polar_Delta_Northing = temp_northing; if(Polar_False_Northing) Polar_Delta_Northing -= Polar_False_Northing; if (Polar_Delta_Northing < 0) Polar_Delta_Northing = -Polar_Delta_Northing; Polar_Delta_Northing *= 1.01; Polar_Delta_Easting = Polar_Delta_Northing; /* Polar_Delta_Easting = temp_northing; if(Polar_False_Easting) Polar_Delta_Easting -= Polar_False_Easting; if (Polar_Delta_Easting < 0) Polar_Delta_Easting = -Polar_Delta_Easting; Polar_Delta_Easting *= 1.01;*/ } return (Error_Code); } /* END OF Set_Polar_Stereographic_Parameters */