public class Mercator {
    //    final 
	private double R_MAJOR = 6378137.0;
    //    final 
	private double R_MINOR = 6356752.3142;
 
    public double[] merc(double x, double y) {
        return new double[] {mercX(x,y), mercY(y)};
    }
 
    private double  mercX(double lon, double lat) {
	double temp_R_MAJOR = R_MAJOR;

// 	if (lat > 25 && lat < 30) 
// 	    temp_R_MAJOR -= 200000;
// 	else if (lat > 30 && lat <= 35)
// 	    temp_R_MAJOR -= 100000;
// 	else if (lat > 35 && lat <= 40)
// 	    temp_R_MAJOR -= 700;
// 	else if (lat > 40 && lat <= 45)
// 	    temp_R_MAJOR += 100000;
// 	else if (lat > 45)
// 	    temp_R_MAJOR += 150000;

        return temp_R_MAJOR * Math.toRadians(lon);
    }
 
    private double mercY(double lat) {
        if (lat > 89.5) {
            lat = 89.5;
        }
        if (lat < -89.5) {
            lat = -89.5;
        }

        double temp = R_MINOR / R_MAJOR;
        double es = 1.0 - (temp * temp);
        double eccent = Math.sqrt(es);
        double phi = Math.toRadians(lat);
        double sinphi = Math.sin(phi);
        double con = eccent * sinphi;
        double com = 0.5 * eccent;
        con = Math.pow(((1.0-con)/(1.0+con)), com);
        double ts = Math.tan(0.5 * ((Math.PI*0.5) - phi))/con;

	double temp_R_MAJOR = R_MAJOR;

        double y = 0 - temp_R_MAJOR * Math.log(ts);
        return y;
    }
}