使用PyEphem来计算阴影长度

| 我正在使用PyEphem,并想计算阴影的长度(假设在地面上植有一根长度为单位的棍子)。长度将由cot(phi)给出,其中phi是太阳仰角(如果我错了,请纠正我)。我不确定要在太阳上使用哪个字段?在下面的示例中,我使用的是角度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)
请在下面检查我的解释: 如果切线是无限大,则表示太阳直接在头顶上方,没有阴影。 如果切线为零,则表示太阳在地平线上,阴影无限长。 我不知道如何解释cot(phi)的负面结果。有人能帮我吗? 最后,对于给定ephem.Observer(),我对如何使用PyEphem从阴影长度向后工作感到困惑,直到下一次太阳将投射该长度的阴影。 我将不胜感激。     
已邀请:
  在太阳上使用哪个字段?
sun.alt
是正确的。
alt
是地平线以上的高度;连同北方以北的方位角,它们确定了相对于地平线的视在位置。 您的计算几乎是正确的。您忘记提供观察员了:
sun = ephem.Sun(o)
。      我不知道如何解释cot(phi)的负面结果。能够   谁来帮帮我?    在这种情况下,太阳在地平线以下。   最后,我对如何使用感到困惑   PyEphem从   到下一次的阴影长度   太阳将蒙上阴影   给定一个ephem.Observer()的长度。 这是一个提供功能的脚本:
g(date) -> altitude
计算下一次太阳将投射与当前长度相同的阴影的时间(方位角-不考虑阴影的方向):
#!/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 w.r.t. 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()
输出量
current time: 2011/4/19 23:22:52 next time: 2011/4/20 13:20:01
    

要回复问题请先登录注册