This system is used in Italy. I came across this:
It says that lambda zero is 9° if it's to epsg:3003 otherwise if it's to epsg:3004 it's 15°
I came up with this Java code, but the result is wrong:
public static Posizione fromGeo2MonteMario(Posizione from, String srid)
{
double fi = from.getLatitude();
double la = from.getLongitude();
double b = la - (srid.equals("EPSG:3003") ? 9d : 15d);
fi = convert2Rad(fi);
la = convert2Rad(la);
b = convert2Rad(b);
double w = Math.sqrt(1 + (0.0067681702 * Math.pow(Math.cos(fi),2)) );
double a = Math.atan( Math.tan(fi) / Math.cos(w * b));
double v = Math.sqrt(1 + (0.0067681702 * Math.pow(Math.cos(a),2)) );
double y = 6397376.633 * asinh( Math.cos(a) * Math.tan(b) / v);
Posizione to = new Posizione();
to.setNorth( (111092.08210 * a) - (16100.59187 * Math.sin(2*a)) + (16.96942 * Math.sin(4*a)) - (0.02226 * Math.sin(6*a)) );
to.setEast( y + 500000);
return to;
}
public static double asinh(double x)
{
return Math.log(x + Math.sqrt(x*x + 1.0));
}
public static double convert2Rad(double degAngle)
{
return degAngle * Math.PI / 180;
}
For example, latitude 42 and longitude 11, is EPSG:3003 so it should be around: East: 1665646.4 North: 4651793.5 You can test it here (or check the example in the pdf)