docs: def UTMtoLL(ReferenceEllipsoid, easting, northing, zone):
          """
          converts UTM coords to lat/long.  Equations from USGS Bulletin 1532
          East Longitudes are positive, West longitudes are negative.
          North latitudes are positive, South latitudes are negative
          Lat and Long are in decimal degrees.
          Written by Chuck Gantz- chuck.gantz@globalstar.com
          Converted to Python by Russ Nelson <nelson@crynwr.com>
          """
  
          k0 = 0.9996
          a = _ellipsoid[ReferenceEllipsoid][_EquatorialRadius]
          eccSquared = _ellipsoid[ReferenceEllipsoid][_eccentricitySquared]
          e1 = old_div((1-sqrt(1-eccSquared)),(1+sqrt(1-eccSquared)))
          #NorthernHemisphere; //1 for northern hemispher, 0 for southern
  
          x = easting-500000.0 #remove 500,000 meter offset for longitude
          y = northing
  
          ZoneLetter = zone[-1]
          if ZoneLetter == 'Z':
                  raise Exception("Latitude is outside the UTM limits")
  
          ZoneNumber = int(zone[:-1])
          if ZoneLetter >= 'N':
                  NorthernHemisphere = 1  # point is in northern hemisphere
          else:
                  NorthernHemisphere = 0  # point is in southern hemisphere
                  y-= 10000000.0          # remove 10,000,000 meter offset used for southern hemisphere
  
          LongOrigin = (ZoneNumber-1)*6-180+3  # +3 puts origin in middle of zone
  
          eccPrimeSquared = old_div((eccSquared),(1-eccSquared))
  
          M = old_div(y, k0)
          mu = old_div(M,(a*(1-old_div(eccSquared,4)-3*eccSquared*eccSquared/64-5*eccSquared*eccSquared*eccSquared/256)))
  
          phi1Rad = (mu+(3*e1/2-27*e1*e1*e1/32)*sin(2*mu)
                    +(21*e1*e1/16-55*e1*e1*e1*e1/32)*sin(4*mu)
                    +(151*e1*e1*e1/96)*sin(6*mu))
          phi1 = degrees(phi1Rad);
  
          N1 = old_div(a,sqrt(1-eccSquared*sin(phi1Rad)*sin(phi1Rad)))
          T1 = tan(phi1Rad)*tan(phi1Rad)
          C1 = eccPrimeSquared*cos(phi1Rad)*cos(phi1Rad)
          R1 = a*(1-eccSquared)/pow(1-eccSquared*sin(phi1Rad)*sin(phi1Rad), 1.5)
          D = old_div(x,(N1*k0))
  
          Lat = phi1Rad-(N1*tan(phi1Rad)/R1)*(D*D/2-(5+3*T1+10*C1-4*C1*C1-9*eccPrimeSquared)*D*D*D*D/24
                       +(61+90*T1+298*C1+45*T1*T1-252*eccPrimeSquared-3*C1*C1)*D*D*D*D*D*D/720)
          Lat = degrees(Lat)
  
          Long = old_div((D-(1+2*T1+C1)*D*D*D/6+(5-2*C1+28*T1-3*C1*C1+8*eccPrimeSquared+24*T1*T1)*D*D*D*D*D/120),cos(phi1Rad))
          Long = LongOrigin+degrees(Long)
          return (Long, Lat)