Calcular fases da Lua - PyEphem

918 views
Skip to first unread message

Sílvia Almeida

unread,
Jun 2, 2015, 9:57:27 AM6/2/15
to python...@googlegroups.com
Boa tarde a todos, 

Se me permitem, gostaria de colocar algumas duvidas.

Necessito de calcular as fases da lua em relação à posição de localização (lat, long ou xyz) na Terra. Tal como o nascer e o por do sol, também em relação a uma posição na terra. 
Para descobri as fase da lua encontrei a livraria pyephem.  (http://rhodesmill.org/pyephem/quick.html) Porém, ainda não consegui encontrar qual é o ano base em que sustentam os cálculos, nem como eles consideram uma posição (lat e long) para o calculo da fase da lua. A menos que combine ephem.Observer() (para a localização) com as formulas de previsão das fases da lua. 

Exemplo:
>>> d1 = ephem.next_full_moon('1984')
>>> print(d1)
R: 1984/1/18 14:05:10

Gostaria de saber que conhecem mais bibliografia sobre esta livraria, aplicações da mesma ou mais conselhos para conseguir realizar estes cálculos. :)
Desde já, muito obrigada. 
Sílvia Almeida

Leonardo Flores Couy

unread,
Jun 2, 2015, 10:39:50 AM6/2/15
to python...@googlegroups.com
Olá Silvia, permita-me te ajudar!
Nunca havia visto esta livraria e não sou tão por dentro deste tema rs. Mas posso tentar te dar um norte pra tentar desvendar esta função.

Eu fui até o repositorio desta lib no Github e fui até a função que você usou: 

Na linha 218 está ela e na linha 180 está a função que ela chama.

Acho que isso pode começar a te ajudar a entender o esquema rs.

Tenha um bom dia, espero que tenha conseguido te dar um help!

Abraços

Marcel Rodrigues

unread,
Jun 2, 2015, 12:31:06 PM6/2/15
to python...@googlegroups.com
Me parece que a fase da Lua não depende da nossa posição na Terra. Por exemplo, hoje é Lua cheia no planeta todo. O nosso ângulo de visão da Lua quase não muda mesmo se viajarmos pro outro lado do planeta, porque o diâmetro da Terra é +/- 30 vezes menor que a distância entre a Terra e a Lua.

Mesmo assim, O PyEphem permite verificar a fase da Lua para um dado observador:

>>> obsv = ephem.Observer()
>>> obsv.lon = "-46"
>>> obsv.lat = "-23"
>>> obsv.elevation = 500
>>> obsv.date = "2015/06/02"
>>> lua = ephem.Moon(obsv)
>>> lua.moon_phase
0.9937350878514498

Este valor indica a fração da Lua que está iluminada: 0 para Lua nova, 1 para Lua cheia.

As horas do nascer e por do Sol são obtidas assim:

>>> sol = ephem.Sun(obsv)
>>> utc = obsv.next_rising(sol, start="2015/06/02")
>>> bst = ephem.Date(utc - 3 * ephem.hour)
>>> bst
2015/6/2 06:37:34
>>> utc = obsv.next_setting(sol, start="2015/06/02")
>>> bst = ephem.Date(utc - 3 * ephem.hour)
>>> bst
2015/6/2 17:26:14

Note que as funções do PyEphem retornam os horários em UTC. A forma como o código acima converte para horário local talvez não seja a melhor, mas serve como um exemplo. De qualquer forma você vai precisar ajustar para a região onde está.

Sobre o ano base, parece que os objetos Observer têm um atributo epoch que você pode alterar antes de fazer os cálculos. O valor padrão é o ano 2000.


  Marcel

--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Arnaldo Russo

unread,
Jun 3, 2015, 6:59:32 AM6/3/15
to python-brasil
Só para colocar mais um e-mail nesse tópico,

Existe o PySolar [1] para realizar esse e mais outros cálculos, sendo uma lib escrita inteiramente em python.
Já o PyEphem é um port da biblioteca Xephem, e é todo escrito em C.


Abrazz

Sílvia Almeida

unread,
Jun 5, 2015, 10:38:58 AM6/5/15
to python...@googlegroups.com
Bom dia, 

Leonardo, Marcel e Arnaldo :)

Fico-vos muito grata pelo auxilio.
Usei as dicas dos 3 e está quase quase :) 
Assim que der por terminado partilho convosco. 

Com apreço, 
Sílvia Almeida 

Sílvia Almeida

unread,
Jun 8, 2015, 7:49:09 AM6/8/15
to python...@googlegroups.com
Bom dia, 

Mais uma vez obrigada. Como disse, segue o trabalho (quase) feito. 
Tenho um novo desafio. 
Conseguir calcular o fuso horário em relação há posição do utilizador. Para se calcular a hora de inverso e verão. ( Para o qual o Marcel Rodrigues tinha-me chamado a atenção.)

"Em python podemos calcular a hora UTC e calcular a hora em qualquer outro FUSO, com DST (daylight saving time). Depois calculamos a diferença. 
Talvez até seja fácil saber o fuso horário em função da lat/lon, mas para já, o utilizador tinha que passar a timezone para o resultado do nascer e o ocaso apareça nas horas locais ... Ou o utilizador passa a hora do seu local, no formato ISO que já tem o fuso horário."

Vou tratar de me por na busca da solução. 


Versão bem composta :) 


A minha versãozinha :)

#-*- coding: utf-8 -*-
import ephem
####Parte 1:
#Fases da Lua:
Meses = range(12)

for i in range(0,12):
Meses[i]="2015/"+str(i+1)

for mluas in Meses:
# mluas = luas durante o mes
m1 = ephem.next_full_moon(mluas)
m2 = ephem.next_last_quarter_moon(mluas)
m3 = ephem.next_new_moon(mluas)
m4 = ephem.next_first_quarter_moon(mluas)
FasesLua = [m1,m2,m3,m4]
print FasesLua

####Parte 2:
#Nascer e Por do Sol:
#Calcular atendendo à posição de um observador:
obs = ephem.Observer()
obs.lon = '-8.446'
obs.lat = '40.575'
obs.elevation = 32.42
#Camara Municiapal de Águeda, Aveiro, PT

NasPorSol =[[0 for x in range (3)]
for x in range (365)]

obs.date = ephem.Date('2015/6/1')
a=obs.date

for i in NasPorSol:
sol = ephem.Sun(obs)
nascer = obs.next_rising(sol,a)
hora_n = ephem.Date(nascer + 1 * ephem.hour) #para correcção da hora
print 'Nascer do Sol', hora_n
porsol = obs.next_setting(sol,a)
hora_p = ephem.Date(porsol + 1 * ephem.hour)
print 'Por do Sol ', hora_p
a=a+1


****
Sílvia Almeida







terça-feira, 2 de Junho de 2015 às 14:57:27 UTC+1, Sílvia Almeida escreveu:
Reply all
Reply to author
Forward
0 new messages