There are a few issues that I've noticed. I actually just created basically the exact same version of this script using another geonet users post as a starting point, only their data was in Colorado state plane west. But I've managed to get it to work for Georgia. Here are the issues that I've noticed:
1. Your latitude of origin is unused. It is needed to calculate the correct meridian arc.
//unused
latitudeOfOrigin = 30.0
2. Unless I'm missing something, you are multiplying your latitude by 10 for no reason which would just make your latitude 10 times too large in every scenario.
var latitudeDeg = latitude * (180 / PI)*10;
3. You convert x,y to meters first, and then subtract the false easting, which was already converted to meters. It's a bit cleaner and easier to keep them in ft-us and then convert to meters at the end like so:
var ft_to_m = 0.3048006096012192; // US survey foot -> metervar E_m = (E - falseE_ft) * ft_to_m;
var N_m = (N - falseN_ft) * ft_to_m;
Here is my version which works for Georgia state plane west. Let me know if you have any questions.
// Inverse Transverse Mercator for EPSG:2240 (NAD83 / Georgia West (ftUS))
// Returns latitude, longitude in decimal degrees
// Input projected coordinates (assumes geometry is in EPSG:2240)
var E = Geometry($feature).x; // Easting (ftUS)
var N = Geometry($feature).y; // Northing (ftUS)
// Projection parameters from EPSG:2240
var a = 6378137.0; // semimajor axis (meters)
var inv_f = 298.257222101; // inverse flattening
var f = 1 / inv_f;
var e2 = 2 * f - f * f; // eccentricity squared
var k0 = 0.9999; // scale factor
var lon0 = -84.1666666666667; // central meridian (deg)
var lat0 = 30.0; // latitude of origin (deg)
var falseE_ft = 2296583.333; // false easting (ftUS)
var falseN_ft = 0.0; // false northing (ftUS)
var ft_to_m = 0.3048006096012192; // US survey foot -> meter
// helpers
function degToRad(d) { return d * PI / 180.0; }
function radToDeg(r) { return r * 180.0 / PI; }
// convert inputs into meters and remove false easting/northing
var E_m = (E - falseE_ft) * ft_to_m;
var N_m = (N - falseN_ft) * ft_to_m;
// --- compute meridian arc for latitude of origin (M0) ---
function meridianArc(phi) {
// phi in radians
var n2 = e2;
var a0 = 1 - (n2/4) - (3*Pow(n2,2)/64) - (5*Pow(n2,3)/256);
var a2 = (3.0/8.0) * (n2 + (Pow(n2,2)/4) + (15*Pow(n2,3)/128));
var a4 = (15.0/256.0) * (Pow(n2,2) + (3*Pow(n2,3)/4));
var a6 = (35.0/3072.0) * Pow(n2,3);
return a * (a0 * phi - a2 * Sin(2*phi) + a4 * Sin(4*phi) - a6 * Sin(6*phi));
}
var lat0R = degToRad(lat0);
var M0 = meridianArc(lat0R);
// --- compute M (meridian arc to footpoint) from N_m ---
var M = M0 + (N_m / k0);
// --- Compute footpoint latitude (phi1) from M using series ---
var mu = M / (a * (1 - e2/4 - 3*Pow(e2,2)/64 - 5*Pow(e2,3)/256));
// e1 (called e' or e1 in many references)
var e1 = (1.0 - Sqrt(1.0 - e2)) / (1.0 + Sqrt(1.0 - e2));
// series coefficients for footpoint latitude
var J1 = (3*e1/2) - (27*Pow(e1,3)/32);
var J2 = (21*Pow(e1,2)/16) - (55*Pow(e1,4)/32);
var J3 = (151*Pow(e1,3)/96);
var J4 = (1097*Pow(e1,4)/512);
var phi1 = mu + J1 * Sin(2*mu) + J2 * Sin(4*mu) + J3 * Sin(6*mu) + J4 * Sin(8*mu);
// --- compute parameters at phi1 ---
var sin1 = Sin(phi1);
var cos1 = Cos(phi1);
var tan1 = Tan(phi1);
var N1 = a / Sqrt(1 - e2 * Pow(sin1,2)); // radius of curvature in prime vertical
var R1 = a * (1 - e2) / Pow(1 - e2 * Pow(sin1,2), 1.5); // meridional radius of curvature
var T1 = Pow(tan1,2);
var C1 = (e2 / (1 - e2)) * Pow(cos1,2); // e'² * cos²(phi1)
var D = E_m / (N1 * k0);
// --- Series expansion to get latitude (phi) ---
var term1 = (D*D / 2.0);
var term2 = (5 + 3*T1 + 10*C1 - 4*Pow(C1,2) - 9*(e2/(1-e2))) * Pow(D,4) / 24.0;
var term3 = (61 + 90*T1 + 298*C1 + 45*Pow(T1,2) - 252*(e2/(1-e2)) - 3*Pow(C1,2)) * Pow(D,6) / 720.0;
var phi = phi1 - (N1 * tan1 / R1) * (term1 - term2 + term3);
// --- Series expansion to get longitude ---
var lon_term1 = D;
var lon_term2 = (1 + 2*T1 + C1) * Pow(D,3) / 6.0;
var lon_term3 = (5 - 2*C1 + 28*T1 - 3*Pow(C1,2) + 8*(e2/(1-e2)) + 24*Pow(T1,2)) * Pow(D,5) / 120.0;
var lon = degToRad(lon0) + (lon_term1 - lon_term2 + lon_term3) / cos1;
// convert to decimal degrees
var lat_dd = radToDeg(phi);
var lon_dd = radToDeg(lon);
// change me
return lat_dd