2015-03-03 1 views
2

Je suis en train de calculer l'azimut du soleil levant et couchant avec le code suivant:Module Python Ephem pas Conscient que la chaîne de latitude apparemment valide

import ephem 
import csv 
import math 

def convert_angle(angle): 
    fields = math.modf(angle) 
    deg = fields[1] 
    min_dec = abs(fields[0]*60) 
    min_fields = math.modf(min_dec) 
    minu = min_fields[1] 
    sec = min_fields[0]*60 
    s = '\'{:2.0f}:{:2.0f}:{:2.1f}\''.format(deg,minu,sec) 
    return s 

sun = ephem.Sun() 

with open('locations.txt', 'rb') as csvfile: 
    rdrreader = csv.reader(csvfile, delimiter='\t', quotechar='"') 
    for row in rdrreader: 
     print row[2],row[5],row[6] 

     lat = convert_angle(float(row[5])) 
     lon = convert_angle(float(row[6])) 

     print lat,lon 

     obs = ephem.Observer() 
     obs.lat = lat  
     obs.lon = lon 
     rising = obs.next_rising(sun) 
     print('Visual sunrise: %s' % rising) 

Le script est mécontent de ma mise en forme:

ipdb> c 
'60:47:31.2' '-161:52:35.5' 
> /Users/mmuratet/weather/solar_ephem.py(35)<module>() 
    34   obs = ephem.Observer() 
3--> 35   obs.lat = lat  
    36   obs.lon = lon 
ipdb> s 
ValueError: 'your angle string %r does not have the format  [number[:number[:number]]]' 
> /Users/mmuratet/weather/solar_ephem.py(35)<module>() 
    34   obs = ephem.Observer() 
3--> 35   obs.lat = lat  
    36   obs.lon = lon 

et pourtant les mêmes œuvres de commande dans une console python avec couper et coller des

>>> obs.lat = '60:47:31.2' 
>>> print obs 
<ephem.Observer date='2015/3/3 20:00:58' epoch='2000/1/1 12:00:00'  lon=-161:52:35.5 lat=60:47:31.2 elevation=0.0m horizon=0:00:00.0 temp=15.0C pressure=1010.0mBar> 

Je sais qu'il doit y avoir une solution simple et évidente, mais je ne le vois pas. Toute suggestion sera appréciée.

Voici quelques données:

AK  Bethel PABC 60.791987#N  161.876539#W 60.7919870  -161.876539 
AK  Fairbanks/Pedro Dome PAPD 65.0351238#N 147.5014222#W 65.0351238  -147.5014222 

Répondre

1

Il ressemble à votre lat et lon chaîne ont chacun guillemets simples à l'intérieur, une au début de la chaîne et une à la fin:

s = '\'{:2.0f}:{:2.0f}:{:2.1f}\''.format(deg,minu,sec) 

Les guillemets simples ne font pas partie de la façon dont un scientifique écrit une latitude ou une longitude, donc PyEphem est confus. Essayez de construire la chaîne sans les deux caractères supplémentaires à l'intérieur:

s = '{:2.0f}:{:2.0f}:{:2.1f}'.format(deg,minu,sec) 

Quand il ne voit que des chiffres et des côlons, PyEphem devrait être heureux!