def invTM(E, N, projection): """ geodetic values in radians ellipsoid of class Ellipsoid m0 scale factor E0, N0 false Easting, Northing in meters returns projected coordinates of a point in meters """ ellipsoid = projection.ellipsoid m0 = projection.m0 lat0 = projection.lat0.radians lon0 = projection.lon0.radians E0 = projection.E0 N0 = projection.N0 S = N / m0 lat = latFromMeridianLength(lat0, S, ellipsoid) t = tan(lat) hta2 = ellipsoid.ePrimeSquared * (cos(lat)**2) E = E - E0 W = sqrt(1 - ellipsoid.eSquared * (sin(lat))**2) N = ellipsoid.a / W Q = E / (m0 * N) M = ellipsoid.a * (1 - ellipsoid.eSquared) / (W**3) T10 = t / (2 * m0**2 * M * N) T11 = (t / (24 * m0**4 * M * N**3)) *\ (5 + (3 * t**2) + hta2 - (4 * hta2**2) - (9 * t**2 * hta2)) T12 = (t / (720 * m0**6 * M * N**5)) *\ (61 + (90 * t**2) + (45 * t**4) + (46 * hta2) - (252 * t**2 * hta2) - (3 * hta2**2) + (100 * hta2**3) - (66 * t**2 * hta2**2) - (90 * t**4 * hta2) + (88 * hta2**4) + (225 * t**4 * hta2**2) + (84 * t**2 * hta2**3) - (192 * t**2 * hta2**4)) T13 = (t / (40320 * m0**8 * M * N**7)) *\ (1385 + (3633 * t**2) + (4095 * t**4) + (1575 * t**6)) T14 = 1 / cos(lat) T15 = (1 + (2 * t**2) + hta2) / (6 * cos(lat)) T16 = (5 + (6 * hta2) + (28 * t**2) - (3 * hta2**2) + (8 * t**2 * hta2) + (24 * t**4) - (4 * hta2**3) + (4 * t**2 * hta2**2) + (24 * t**2 * hta2**3)) / (120 * cos(lat)) T17 = (61 + (66 * t**2) + (1320 * t**4) + (720 * t**6)) / 5040 lat = lat - (T10 * E**2) + (T11 * E**4) - (T12 * E**6) + (T13 * E**8) lon = lon0 + (T14*Q) - (T15 * Q**3) + (T16 * Q**5) - (T17 * Q**7) lat = Angle(lat) lat.angleType = 'dms' lon = Angle(lon) lon.angleType = 'dms' return lat, lon
def ECEFtoGeodetic(X, Y, Z, ellipsoid): """ X, Y, Z in meters ellipsoid: class ellipsoid returns Geodetic lat, lon in Angle and h in meters """ lon = atan2(Y, X) P = sqrt(X**2 + Y**2) lat0 = atan2((Z * (1 + ellipsoid.ePrimeSquared)), P) dlat = 1 while dlat > 10**-12: W = sqrt(1 - ellipsoid.eSquared * (sin(lat0))**2) N = ellipsoid.a / W lat = atan2((Z + ellipsoid.eSquared * N * sin(lat0)), P) dlat = abs(lat - lat0) lat0 = lat h = (Z / sin(lat)) - ((1 - ellipsoid.eSquared) * N) lat = Angle(lat) lat.angleType = 'dms' lon = Angle(lon) lon.angleType = 'dms' return lat, lon, h