2013-08-09 15 views
7

Sono nuovo di PyEphem e questa è probabilmente una semplice domanda. Voglio calcolare l'angolo del sole sopra l'orizzonte in un determinato punto e data GPS. Il mio codice è il seguente:Come calcolare l'angolo del sole sopra l'orizzonte usando pyEphem

import ephem 
import datetime 

date = datetime.datetime(2010,1,1,12,0,0) 
print "Date: " + str(date) 

obs=ephem.Observer() 
obs.lat='31:00' 
obs.long='-106:00' 
obs.date = date 
print obs 

sun = ephem.Sun(obs) 
sun.compute(obs) 
print float(sun.alt) 
print str(sun.alt) 
sun_angle = float(sun.alt) * 57.2957795 # Convert Radians to degrees 
print "sun_angle: %f" % sun_angle 

e l'uscita è:

python sunTry.py 
Date: 2010-01-01 12:00:00 
<ephem.Observer date='2010/1/1 12:00:00' epoch='2000/1/1 12:00:00' lon=-106:00:00.0 lat=31:00:00.0 elevation=0.0m horizon=0:00:00.0 temp=15.0C pressure=1010.0mBar> 
-0.44488877058 
-25:29:24.9 
sun_angle: -25.490249 

Perché l'alt negativo? La posizione GPS è da qualche parte in Messico e ho specificato 12 Noon nel parametro data dell'osservatore. Il sole dovrebbe essere praticamente direttamente sopra la testa quindi avrei pensato che la variabile alt avrebbe restituito un angolo da qualche parte nel range di 70 - 90 gradi? Cosa mi manca qui?

Grazie

Stephen

+0

La mia memoria è un po 'confusa con l'utilizzo datetime. È possibile che ci sia un problema di fuso orario lì? Forse ephem e datetime stanno cospirando per interpretare il tuo tempo come in un altro fuso orario, come l'UTC o il tuo TZ locale? –

risposta

4

Credo che il problema è che in PyEphem, dates are always in UTC. Quindi non importa quale sia il fuso orario locale per lat/lon del tuo osservatore, se lo dici Noon, si presume che tu faccia mezzogiorno in UTC. Ciò significa che devi passare il tempo che intendi già convertito in UTC.

L'ora UTC per "da qualche parte in Messico a datetime.datetime(2010,1,1,12,0,0)" è approssimativamente datetime.datetime(2010,1,1,18,0,0).

Con questa nuova data, ottengo l'uscita

sun_angle: 33.672932 

Che sembra ancora un po 'bassa, ma più ragionevole di -25.

Se si desidera un modo programmatico per farlo, è possibile (a proprio rischio) intromettersi con il modulo pytz.

tz_mexico = pytz.timezone('America/Mexico_City') 
mexico_time = datetime.datetime(2010,1,1,12,0,0,0,tz_mexico) 
utc_time = mexico_time.astimezone(pytz.utc) 
obs.date = utc_time 
Problemi correlati