Calcul du lever / coucher du soleil tout en tenant compte de la topographie

11

Je veux calculer les heures de lever et de coucher du soleil pour une année complète pour un endroit donné en tenant compte de la topographie. Le lever / coucher du soleil n'est peut-être pas le bon terme, mais ce que je veux, c'est l'heure à laquelle le soleil se lève au-dessus de l'horizon et l'heure à laquelle il tombe en dessous de l'horizon, en tenant compte des collines.

J'utilise QGIS ou GRASS. Je peux utiliser r.horizon pour générer l'angle d'horizon à partir d'un point spécifique, mais je ne sais pas comment aller de là aux heures de lever / coucher du soleil.

Stu
la source
Cela ressemble à un champ de vision inversé ... sous quel angle l'observateur (soleil) peut-il voir l'emplacement, puis l'utiliser comme décalage par rapport aux heures de lever / coucher standard. Voilà une très bonne question.
Michael Stimson

Réponses:

2

J'ai installé le paquet ephem python dans mon système Linux GNU / Debian et je pouvais l'utiliser sur la console Python de QGIS. J'ai créé un observateur pour un point près du lac Utah (USA) et il a été calculé le lever et le coucher du soleil pour la journée '2010/6/21'. Le script était:

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. )

Après avoir exécuté sur la console Python de QGIS, le résultat était:

>>>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

Telle est la réponse.

Note d'édition :

Définir un nouvel horizon (par exemple 5 degrés):

.
.
.
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. )

le résultat est:

>>>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
la source
Merci pour cela, cela semble être une pièce du puzzle. Il semble que je pourrais utiliser PyEphem pour calculer les angles d'azimut et d'altitude du soleil à un moment particulier? Comment puis-je l'utiliser pour trouver le moment où le soleil se lève au-dessus / se couche sous l'horizon? (En tenant compte de la topographie, je suppose que les heures de coucher / lever de soleil que le paquet éphémère émet supposent une terre parfaitement lisse.)
Stu
2
Peut-être qu'une combinaison de r.horizon et PyEphem fonctionnerait? Avez-vous des réflexions sur la façon d'utiliser les deux ensemble? GRASS possède un module r.sun, que je peux utiliser pour calculer le nombre d'heures d'ensoleillement direct à un endroit donné un jour donné, en tenant compte de la topographie. Cela semble faire presque ce que je veux, mais cela ne semble pas produire l'heure réelle où la lumière directe du soleil démarre / s'arrête.
Stu
Prometteur et utile, mais il ne prend pas en compte la topographie. L'horizon visible de l'intérieur d'une vallée n'est pas le même que l'horizon vrai (dégagé).
alphabetasoup
@RichardLaw Vous pouvez définir la topographie avec la méthode «horizon».
xunilk
1
Il semble que la méthode de l'horizon ne fait que définir un angle d'horizon unique pour l'ensemble de l'horizon? Si l'on tient compte de la topographie, l'horizon n'est pas parfaitement plat. Ainsi, l'angle par rapport à l'horizon sera différent pour chaque azimut différent calculé. Le module r.horizon affichera l'angle à l'horizon pour chaque azimut différent. Ce ne sera pas un nombre unique (par exemple 5 degrés), mais plutôt un ensemble de données d'une série d'élévations pour tous les azimuts (5 degrés d'élévation à 180 degrés d'azimut, 6 degrés d'élévation à 185 degrés d'azimut, 7 degrés d'élévation à 190 degrés azimut, etc.)
Stu
1

Vous pouvez utiliser une bibliothèque comme PyEphem pour trouver, pour un emplacement donné, l'altitude, le jour, l'heure (et la planète), les angles d'azimut et d'altitude du soleil.

user71991
la source
Pouvez-vous suggérer une mise en œuvre de cela? La question d'origine ne fait pas mention implicite de python mais l'OP pourrait être capable de le récupérer si l'exemple est assez simple.
Michael Stimson
0

Vous pouvez utiliser un peu de python pour cela, mais vous devez d'abord générer un dictionnaire ou un tableau, à partir de la position de vos observateurs, de l'angle par rapport à l'horizon du monde réel qui semble être. Cela devrait être disons à des intervalles de 1 degré avec 0 = nord vrai et pour chaque degré donnant l'angle de l'horizon. Cela peut provenir de votre r.horizon.

Vous pouvez ensuite, l' utilisation pyephemà a) créer un observerà la latitude, la longitude et l' altitude de votre observateur et pour chaque minute d'une utilisation de jour donné pour calculer les soleils positions apparentes, celles - ci seraient données en quatre valeurs, ra, dec, alt et az.

Ensuite, pour chaque valeur de temps, vous pouvez comparer l'alt avec la valeur du tableau d'élévation à cet azimut et lorsque l'alt est supérieur à la valeur du tableau, vous pourrez voir le soleil.

Il est même possible que vous trouviez des points où, un jour donné, le soleil se lève dans une vallée puis passe hors du site derrière une montagne puis réapparaît sur ou de l'autre côté de la montagne.

Steve Barnes
la source