Beispiel #1
0
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
Beispiel #2
0
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