2013-08-09 14 views
7

Jestem nowy w PyEphem i jest to prawdopodobnie proste pytanie. Chcę obliczyć kąt słońca nad horyzontem w określonym punkcie GPS i datę. Mój kod wygląda następująco:Jak obliczyć kąt słońca nad horyzontem za pomocą 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 

a wyjście jest:

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 

Dlaczego alt negatywne? Lokalizacja GPS jest gdzieś w Meksyku i określiłem 12 południa w parametrze daty obserwatora. Słońce powinno być prawie bezpośrednio nad głową, więc pomyślałem, że zmienna alt zwróci kąt gdzieś w zakresie 70 - 90 stopni? Czego tu mi brakuje?

Dzięki

Stephen

+0

Moja pamięć jest trochę rozmyta dzięki użyciu datetime. Czy jest możliwe, że istnieje tam strefa czasowa? Może efem i datetime konspirują do interpretowania twojego czasu tak, jak w innej strefie czasowej, takiej jak UTC czy twój lokalny TZ? –

Odpowiedz

4

Uważam, że problemem jest to, że w PyEphem, dates are always in UTC. Tak więc bez względu na to, jaka lokalna strefa czasowa jest dla twojego/długa obserwatora, jeśli powiesz to w południe, zakłada się, że masz na myśli południe w UTC. Oznacza to, że musisz przejść w czasie, który zamierzasz przekonwertować na UTC.

Czas UTC dla "gdzieś w Meksyku pod numerem datetime.datetime(2010,1,1,12,0,0)" wynosi mniej więcej datetime.datetime(2010,1,1,18,0,0).

Z tym nowym terminie, ja wyprowadzał

sun_angle: 33.672932 

To wciąż wydaje rodzaju niska, ale bardziej rozsądne niż -25.

Jeśli chcesz programowy sposób, możesz (na własne ryzyko) mieszać się z modułem 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 
Powiązane problemy