Calcular la longitud de la sombra utilizando PyEphem

Estoy usando PyEphem y quiero calcular la longitud de una sombra (suponiendo que se planta un palo de longitud de unidad en el suelo). La longitud será dada por cuna (phi), donde phi es el ángulo de elevación solar (corríjame si me equivoco). ¿No estoy seguro de qué campo usar en el Sol ? En el siguiente ejemplo, estoy usando el ángulo alt:

import ephem, math o = ephem.Observer() o.lat, o.long = '37.0625', '-95.677068' sun = ephem.Sun() sunrise = o.previous_rising(sun, start=ephem.now()) noon = o.next_transit(sun, start=sunrise) shadow = 1 / math.tan(sun.alt) 

Por favor revise mi interpretación a continuación:

  1. Si la tangente es infinita, indica que el sol está directamente arriba y no hay sombra.
  2. Si la tangente es cero, indica que el sol está en el horizonte y la sombra es infinitamente larga.
  3. No sé cómo interpretar los resultados negativos de cuna (phi). ¿Alguien me puede ayudar?

Finalmente, estoy confundido acerca de cómo usar PyEphem para trabajar hacia atrás desde una longitud de sombra hasta la próxima vez en que el sol proyectará una sombra de esa longitud, dado un ephem.Observer ().

Agradecería ayuda con esto.

¿Qué campo usar en el Sol?

El sun.alt es correcto. alt es una altitud sobre el horizonte; junto con un azimut al este del norte, definen una posición aparente con respecto al horizonte.

Tus cálculos son casi correctos. Olvidó proporcionar un observador: sun = ephem.Sun(o) .

  1. No sé cómo interpretar los resultados negativos de cuna (phi). ¿Alguien me puede ayudar?

El Sol está por debajo del horizonte en este caso.

Finalmente, estoy confundido acerca de cómo usar PyEphem para trabajar hacia atrás desde una longitud de sombra hasta la próxima vez en que el sol proyectará una sombra de esa longitud, dado un ephem.Observer ().

Aquí hay una secuencia de comandos que tiene una función: g(date) -> altitude calcula la próxima vez que el sol proyectará una sombra con la misma longitud que ahora (no se considera un azimut – la dirección de la sombra):

 #!/usr/bin/env python import math import ephem import matplotlib.pyplot as plt import numpy as np import scipy.optimize as opt def main(): # find a shadow length for a unit-length stick o = ephem.Observer() o.lat, o.long = '37.0625', '-95.677068' now = o.date sun = ephem.Sun(o) #NOTE: use observer; it provides coordinates and time A = sun.alt shadow_len = 1 / math.tan(A) # find the next time when the sun will cast a shadow of the same length t = ephem.Date(find_next_time(shadow_len, o, sun)) print "current time:", now, "next time:", t # UTC time ####print ephem.localtime(t) # print "next time" in a local timezone def update(time, sun, observer): """Update Sun and observer using given `time`.""" observer.date = time sun.compute(observer) # computes `sun.alt` implicitly. # return nothing to remember that it modifies objects inplace def find_next_time(shadow_len, observer, sun, dt=1e-3): """Solve `sun_altitude(time) = known_altitude` equation wrt time.""" def f(t): """Convert the equation to `f(t) = 0` form for the Brent's method. where f(t) = sun_altitude(t) - known_altitude """ A = math.atan(1./shadow_len) # len -> altitude update(t, sun, observer) return sun.alt - A # find a, b such as f(a), f(b) have opposite signs now = observer.date # time in days x = np.arange(now, now + 1, dt) # consider 1 day plt.plot(x, map(f, x)) plt.grid(True) ####plt.show() # use a, b from the plot (uncomment previous line to see it) a, b = now+0.2, now+0.8 return opt.brentq(f, a, b) # solve f(t) = 0 equation using Brent's method if __name__=="__main__": main() 

Salida

 current time: 2011/4/19 23:22:52 next time: 2011/4/20 13:20:01