29 votes

Position du soleil en fonction de l'heure de la journée et de la latitude/longitude

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.

23voto

lindelof Points 9802

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

17voto

J.F. Sebastian Points 102961

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    

Sortie

2010/3/29 20:52:25 UTC
205:40:44.9 56:59:27.7

, où :

  • az — azimut à l'est du nord
  • alt — altitude au-dessus de l'horizon

8voto

Toybuilder Points 4143

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

7voto

Jay Kominek Points 3254

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.

5voto

De quelle précision avez-vous besoin?

(Par exemple, vos latitude et longitude sont-elles exprimées en WGS84 ou dans un autre système de coordonnées?)

Le code de P. J. Naughter a probablement tout ce dont vous avez besoin et même plus...

http://www.naughter.com/aa.html

Prograide.com

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.

Powered by:

X