2017-07-07 3 views
3

Comment prendre en compte l'élévation de l'observateur lors du calcul du lever/coucher de soleil?Comment prendre en compte l'altitude de l'observateur lors du calcul du lever/coucher de soleil?

Calculer sunrise/set pour n'importe quel lat/longitude n'est pas un problème, mais comment tenir compte de l'élévation au lieu du niveau de la mer ??? Je n'ai plus de combinaisons pour essayer, et après avoir passé plus de trois jours sur ce coup, je mets ma main à l'aide

J'utilise l'excellente source C du domaine public de Paul Schlyter qui semble être la plus courante. Il vous permet de définir "l'altitude que le soleil doit traverser", par exemple -12 pour le crépuscule nautique ou -35/60 etc, mais je ne suis pas sûr de savoir comment modifier cela pour tenir compte de l'élévation de l'observateur au-dessus du niveau de la mer. Par exemple, Quito en Equateur est l'une des villes les plus hautes à 2850m d'altitude.
Lat + Lon: -78,46784, -0,18065
Fuseau horaire: -5
Elév: 2850m

En utilisant la calculatrice de Casio (http://keisan.casio.com/exec/system/1224686065), l'un des rares que j'ai trouvé que compte le fait pour l'élévation, il retourne les éléments suivants (date = 1 janvier 2017):
Sunrise = 6: 14 Sunset = 18: 22 élévation = 0 m <- je peux déjà obtenir ce
Sunrise = 6: 05 Sunset = 18: 30 Altitude = 2850m < - mais comment puis-je l'obtenir?

Je suis en mesure d'obtenir le premier (Asc = 0) en réglant l'altitude = -35/60 (-0,58333) = 1,0 membre supérieur Mais comment obtenir le second?

J'utilise la fonction suivante:

int sunriset(int year, int month, int day, double lon, double lat, 
        double altit, int upper_limb, double *trise, double *tset) 
/*************************************************************/ 
/* altit = the altitude which the Sun should cross   */ 
/*   Set to -35/60 degrees for rise/set, -6 degrees */ 
/*   for civil, -12 degrees for nautical and -18  */ 
/*   degrees for astronomical twilight.    */ 
/* upper_limb: non-zero -> upper limb, zero -> center  */ 
/*   Set to non-zero (e.g. 1) when computing rise/set */ 
/*   times, and to zero when computing start/end of */ 
/*   twilight.           */ 
/**************************************************************/ 

SUNRISE.C (je l'ai fait ce PRÊT-À-RUN Exemple): avec Quito codé en dur lat/long/etc: https://pastebin.com/XSWR2Hby Compile: gcc sunrise.c -o sunrise.exe

+0

Le dernier paragraphe de [cette section] (https://en.wikipedia.org/wiki/Sunrise_equation#Hour_angle)? –

+0

C'est ce que je pensais mais j'avais déjà essayé toutes les combinaisons de ces exemples, par exemple. alt = -0,8333 + -0,5536
alt = -0,8333--1,388
alt = -0,8333 + -101,378
alt = -0,8333 - (0,347 * SQR (mètres))
etc –

+0

leur exemple est également source de confusion, comme l'algorithme affiché semble utiliser à la fois Division et Square Root? mais leur exemple utilise seulement Division !? –

Répondre

0

En supposant un environnement non élevé, c'est-à-dire sur une montagne, pas sur un grand plateau, vous pouvez d'abord calculer le cercle formé par tous les points qui touchent les tangentes à la surface de la Terre qui traverse le point d'intérêt (Quito) et ensuite trouver l'oreille liest sunrise et le dernier coucher de soleil sur ce cercle. Si le soleil brille sur n'importe quelle partie de ce cercle, il brillera aussi sur le point d'intérêt.

Sur un plateau, je ne pense pas que vous ayez besoin de faire quoi que ce soit (et si Quito est sur un plateau cela signifie que Casio a tort) comme la bonne chose à faire serait de faire les calculs pour une Terre avec un plus grand rayon ou diamètre mais il n'y a aucune variable pour ceci dans le code de Paul. Vraisemblablement, l'effet de la taille de la planète est trop petit pour être pertinent et les rayons du soleil atteignant la Terre sont supposés être parallèles (ce qu'ils ne sont pas).