public override double[] DegreesToMeters(double[] lonlat)
{
double lon = Degrees2Radians(lonlat[0]);
double lat = Degrees2Radians(lonlat[1]);
double delta_lon=0.0; /* Delta longitude (Given longitude - center */
double sin_phi, cos_phi;/* sin and cos value */
double al, als; /* temporary values */
double c, t, tq; /* temporary values */
double con, n, ml; /* cone constant, small m */
delta_lon = adjust_lon(lon - central_meridian);
sincos(lat, out sin_phi, out cos_phi);
al = cos_phi * delta_lon;
als = Math.Pow(al,2);
c = esp * Math.Pow(cos_phi,2);
tq = Math.Tan(lat);
t = Math.Pow(tq,2);
con = 1.0 - es * Math.Pow(sin_phi,2);
n = this._semiMajor / Math.Sqrt(con);
ml = this._semiMajor * mlfn(e0, e1, e2, e3, lat);
double x =
scale_factor * n * al * (1.0 + als / 6.0 * (1.0 - t + c + als / 20.0 *
(5.0 - 18.0 * t + Math.Pow(t, 2) + 72.0 * c - 58.0 * esp))) + false_easting;
double y = scale_factor * (ml - ml0 + n * tq * (als * (0.5 + als / 24.0 *
(5.0 - t + 9.0 * c + 4.0 * Math.Pow(c,2) + als / 30.0 * (61.0 - 58.0 * t
+ Math.Pow(t,2) + 600.0 * c - 330.0 * esp))))) + false_northing;
if(lonlat.Length<3)
return new double[] { x / _metersPerUnit, y / _metersPerUnit };
else
return new double[] { x / _metersPerUnit, y / _metersPerUnit, lonlat[2] };
}