Quelqu'un veut partager un joli code qui donne la position du soleil (élévation et azimut) étant donné la latitude et la longitude et l'heure de la journée ?
Et bien sûr, la date.
Quelqu'un veut partager un joli code qui donne la position du soleil (élévation et azimut) étant donné la latitude et la longitude et l'heure de la journée ?
Et bien sûr, la date.
Voici ma mise en œuvre en R de l'algorithme de l'Almanach de l'astronome (Joseph J. Michalsky. L'algorithme de l'almanach astronomique pour la position solaire approximative (1950–2050). Énergie solaire, 40(3) : 227-235, 1988.) Il est facile de le traduire dans n'importe quelle autre langue:
sunPosition <- function(year, month, day, hour=12, min=0, sec=0,
lat=46.5, long=6.5) {
twopi <- 2 * pi
deg2rad <- pi / 180
# Obtenir le jour de l'année, par exemple le 1er février = 32, le 1er mars = 61 pour les années bissextiles
month.days <- c(0,31,28,31,30,31,30,31,31,30,31,30)
day <- day + cumsum(month.days)[month]
leapdays <- year %% 4 == 0 & (year %% 400 == 0 | year %% 100 != 0) & day >= 60
day[leapdays] <- day[leapdays] + 1
# Obtenir la date julienne - 2400000
hour <- hour + min / 60 + sec / 3600 # heure plus fraction
delta <- year - 1949
leap <- trunc(delta / 4) # anciennes années bissextiles
jd <- 32916.5 + delta * 365 + leap + day + hour / 24
# L'entrée de l'almanach de l'astronome est la différence entre
# la date julienne et JD 2451545,0 (midi, 1er janvier 2000)
time <- jd - 51545.
# Coordonnées écliptiques
# Longitude moyenne
mnlong <- 280.460 + .9856474 * time
mnlong <- mnlong %% 360
mnlong[mnlong < 0] <- mnlong[mnlong < 0] + 360
# Anomalie moyenne
mnanom <- 357.528 + .9856003 * time
mnanom <- mnanom %% 360
mnanom[mnanom < 0] <- mnanom[mnanom < 0] + 360
mnanom <- mnanom * deg2rad
# Longitude écliptique et obliquité de l'écliptique
eclong <- mnlong + 1.915 * sin(mnanom) + 0.020 * sin(2 * mnanom)
eclong <- eclong %% 360
eclong[eclong < 0] <- eclong[eclong < 0] + 360
oblqec <- 23.429 - 0.0000004 * time
eclong <- eclong * deg2rad
oblqec <- oblqec * deg2rad
# Coordonnées célestes
# Ascension droite et déclinaison
num <- cos(oblqec) * sin(eclong)
den <- cos(eclong)
ra <- atan(num / den)
ra[den < 0] <- ra[den < 0] + pi
ra[den >= 0 & num < 0] <- ra[den >= 0 & num < 0] + twopi
dec <- asin(sin(oblqec) * sin(eclong))
# Coordonnées locales
# Temps sidéral moyen de Greenwich
gmst <- 6.697375 + .0657098242 * time + hour
gmst <- gmst %% 24
gmst[gmst < 0] <- gmst[gmst < 0] + 24.
# Temps sidéral moyen local
lmst <- gmst + long / 15.
lmst <- lmst %% 24.
lmst[lmst < 0] <- lmst[lmst < 0] + 24.
lmst <- lmst * 15. * deg2rad
# Angle horaire
ha <- lmst - ra
ha[ha < -pi] <- ha[ha < -pi] + twopi
ha[ha > pi] <- ha[ha > pi] - twopi
# Latitude en radians
lat <- lat * deg2rad
# Azimut et élévation
el <- asin(sin(dec) * sin(lat) + cos(dec) * cos(lat) * cos(ha))
az <- asin(-cos(dec) * sin(ha) / cos(el))
elc <- asin(sin(dec) / sin(lat))
az[el >= elc] <- pi - az[el >= elc]
az[el <= elc & ha > 0] <- az[el <= elc & ha > 0] + twopi
el <- el / deg2rad
az <- az / deg2rad
lat <- lat / deg2rad
return(list(elevation=el, azimuth=az))
}
Voici le code qui utilise ephem
, une bibliothèque Python pour réaliser des calculs d'astronomie de haute précision :
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import datetime
import ephem # pour l'installer, exécutez `pip install pyephem`
o = ephem.Observer()
# Los Angeles, Calif. 34°3'N, 118°15'W
o.lat, o.long, o.date = '34:3', '-118:15', datetime.datetime.utcnow()
sun = ephem.Sun(o)
print o.date
print sun.az, sun.alt
2010/3/29 20:52:25 UTC
205:40:44.9 56:59:27.7
, où :
Le National Renewable Energy Lab dispose d'un calculateur de position et d'intensité solaires appelé Solpos. Je l'ai utilisé il y a des années pour suivre la position du soleil afin d'éviter les "coups de soleil" sur nos systèmes de communication optique.
Voir le code source en C sur : http://rredc.nrel.gov/solar/codesandalgorithms/solpos/
Vous pouvez tester l'algorithme sur : http://www.nrel.gov/midc/solpos/solpos.html
Si vous avez besoin de données réellement précises, alimentées par la NASA-JPL, consultez le service de données HORIZONS de JPL qui propose diverses passerelles vers les données utilisées par la NASA pour suivre les corps célestes. Ils disposent de "431015 astéroïdes, 2966 comètes, 168 satellites planétaires, 8 planètes, le Soleil, L1, L2, des engins spatiaux sélectionnés et les barycentres du système". HORIZONS est disponible sur http://ssd.jpl.nasa.gov/?horizons
Faire cela correctement n'est pas facile. Cela dépend de l'orbite de la Terre, ce qui est probablement au-delà de ce que vous cherchiez à faire. Le moyen le plus simple d'obtenir une réponse complètement correcte est de la tirer de JPL Horizons. Obtenez simplement les lectures az/el une fois par heure, et faites une interpolation linéaire. Cela aura un aspect visuel plutôt bon.
Si vous avez besoin de le déterminer pour de nombreuses positions sur la Terre, demandez à Horizons de vous donner des coordonnées ECI (que vous pouvez à nouveau interpoler linéairement entre elles), puis convertissez les coordonnées ECI en az/el. Consultez Celestrak pour des informations sur cette conversion. Vous voulez les articles sur les "Systèmes de coordonnées orbitales". Astronomical Algorithms par Meeus est également utile.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.