Cálculo do tempo do nascer / pôr do sol ao considerar a topografia

11

Quero calcular o horário de nascer e pôr do sol durante um ano inteiro para um determinado local, levando em consideração a topografia. Talvez nascer / pôr do sol não sejam os termos certos, mas o que eu quero é a hora em que o sol nasce acima do horizonte e a hora em que cai abaixo do horizonte, levando em consideração quaisquer colinas.

Estou usando QGIS ou GRASS. Posso usar r.horizon para gerar o ângulo do horizonte a partir de um ponto específico, mas não tenho certeza de como chegar lá até o horário do nascer e do pôr do sol.

Stu
fonte
Soa como um ponto de vista inverso ... em que ângulo o observador (sol) pode ver a localização e usá-la como um deslocamento para o horário padrão do nascer do sol / hora programada. Essa é uma pergunta muito boa.
Michael Stimson

Respostas:

2

Instalei o pacote ephem python no meu sistema GNU / Debian Linux e, eu poderia usá-lo no console Python do QGIS. Criei um observador para um ponto próximo ao lago Utah (EUA) e foi calculado o nascer e o pôr do sol para o dia '2010/6/21'. O script foi:

import ephem

#defining an observer
obs = ephem.Observer()

#defining position
long = '-112.092807'
lat = '40.135114'

obs.long = ephem.degrees(long)
obs.lat = ephem.degrees(lat)

print "long = ", obs.long, "lat = ", obs.lat

#defining date
date = '2010/6/21'

obs.date = ephem.Date(date)

#defining an astronomic object; Sun in this case
sun = ephem.Sun(obs)

r1 = obs.next_rising(sun)
s1 = obs.next_setting(sun)

print "rising sun (UTC time): ", r1
print "setting sun (UTC time): ", s1

r1_lt = ephem.Date(r1 - 6 * ephem.hour) #local time 

(y, mn, d, h, min, s) = r1_lt.tuple()

print "rising sun: (local time): {:.2f}".format( h + min/60. + s/3600. )

s1_lt = ephem.Date(s1 - 6 * ephem.hour) #local time

(y, mn, d, h, min, s) = s1_lt.tuple()

print "setting sun (local time): {:.2f}".format( h + min/60. + s/3600. )

Após a execução no Python Console do QGIS, o resultado foi:

>>>execfile(u'/home/zeito/pyqgis_scripts/ephem.py'.encode('UTF-8'))
long =  -112:05:34.1 lat =  40:08:06.4
rising sun (UTC time):  2010/6/21 11:58:58
setting sun (UTC time):  2010/6/21 03:01:14
rising sun: (local time): 5.98
setting sun (local time): 21.02

Essa é a resposta.

Nota de edição :

Definindo um novo horizonte (por exemplo, 5 graus):

.
.
.
obs.horizon = '5'

sun = ephem.Sun(obs)

r1 = obs.next_rising(sun)
s1 = obs.next_setting(sun)

print "rising sun (UTC time): ", r1
print "setting sun (UTC time): ", s1

r1_lt = ephem.Date(r1 - 6 * ephem.hour) #local time 

(y, mn, d, h, min, s) = r1_lt.tuple()

print "rising sun: (local time): {:.2f}".format( h + min/60. + s/3600. )

s1_lt = ephem.Date(s1 - 6 * ephem.hour) #local time

(y, mn, d, h, min, s) = s1_lt.tuple()

print "setting sun (local time): {:.2f}".format( h + min/60. + s/3600. )

o resultado é:

>>>execfile(u'/home/zeito/pyqgis_scripts/ephem.py'.encode('UTF-8'))
long =  -112:05:34.1 lat =  40:08:06.4
rising sun (UTC time):  2010/6/21 12:31:48
setting sun (UTC time):  2010/6/21 02:28:24
rising sun: (local time): 6.53
setting sun (local time): 20.47
xunilk
fonte
Obrigado por isso, parece uma peça do quebra-cabeça. Parece que eu poderia usar o PyEphem para calcular os ângulos de azimute e altitude do sol em um determinado momento? Como então utilizo isso para encontrar a hora em que o sol nasce acima / se põe abaixo do horizonte? (Contabilização de topografia, eu estou supondo que os tempos do sol / nascer do sol que o pacote ephem é saída estão assumindo uma terra perfeitamente lisa.)
Stu
2
Talvez alguma combinação de r.horizon e PyEphem funcionasse? Alguma idéia de como usar os dois juntos? O GRASS possui um módulo r.sun, que eu posso usar para calcular o número de horas de luz solar direta em um determinado local em um determinado dia, respondendo pela topografia. Isso parece quase fazer o que eu quero, mas não parece produzir o tempo real em que a luz solar direta começa / para.
Stu
Promissor e útil, mas não leva em consideração a topografia. O horizonte visível do interior de um vale não é o mesmo que o horizonte verdadeiro (não obscurecido).
alphabetasoup
@RichardLaw Você pode definir a topografia com o método 'horizon'.
xunilk
1
Parece que o método do horizonte está apenas definindo um único ângulo do horizonte para todo o horizonte? Se levarmos em conta a topografia, o horizonte não é perfeitamente plano. Portanto, o ângulo do horizonte será diferente para cada azimute diferente calculado. O módulo r.horizon emitirá o ângulo em relação ao horizonte para cada azimute diferente. Não será um número único (por exemplo, 5 graus), mas sim um conjunto de dados de uma série de elevações para todos os azimutes (elevação de 5 graus a 180 graus de azimute, elevação de 6 graus a 185 graus de azimute, elevação de 7 graus a 190 graus azimute, etc.)
Stu
1

Você pode usar uma biblioteca como o PyEphem para encontrar, em um determinado local, altitude, dia, hora (s) (e planeta;) os ângulos de azimute e altitude do sol.

user71991
fonte
Você pode sugerir uma implementação disso? A pergunta original não menciona implicitamente o python, mas o OP pode buscá-lo se o exemplo for simples o suficiente.
Michael Stimson
0

Você pode usar um pouco de python para fazer isso, mas primeiro precisa gerar um dicionário ou tabela, a partir da posição de seus observadores, do ângulo em relação ao horizonte do mundo real. Isso precisaria ser em intervalos de 1 grau, com 0 = norte verdadeiro e para cada grau, dando o ângulo do horizonte. Isso pode vir do seu r.horizon.

Você poderia, então, usar pyephempara: a) criar uma observerlatitude, longitude e altitude do seu observador e, para cada minuto de um determinado dia, usá-lo para calcular as posições aparentes do sol; elas seriam dadas em quatro valores: ra, dec, alt e az.

Então, para cada valor de tempo, você pode comparar o alt com o valor da tabela de elevação naquele azimute e, quando o alt for maior que o valor da tabela, você poderá ver o sol.

É até possível encontrar alguns pontos em que, em um determinado dia, o sol nasce em um vale e depois passa fora do local atrás de uma montanha e depois reaparece sobre o outro lado da montanha.

Steve Barnes
fonte