11 votos

Calcular la hora de salida y puesta del sol teniendo en cuenta la topografía

Quiero calcular las horas de salida y puesta del sol para un año completo para un lugar determinado teniendo en cuenta la topografía. Tal vez los términos amanecer/atardecer no sean los adecuados, pero lo que quiero es la hora a la que el sol sale por encima del horizonte, y la hora a la que cae por debajo del horizonte, teniendo en cuenta cualquier colina.

Estoy utilizando QGIS o GRASS. Puedo utilizar r.horizon para generar el ángulo del horizonte a partir de un punto específico, pero no estoy seguro de cómo llegar desde allí a las horas de salida/puesta del sol.

0 votos

Suena como un viewshed inverso... en qué ángulo puede el observador (sol) ver la ubicación y luego usar eso como una compensación a los tiempos estándar de salida y puesta del sol. Es una muy buena pregunta.

2voto

Yada Puntos 9489

He instalado el ephem paquete python en mi sistema Linux GNU/Debian y, pude utilizarlo en la consola Python de QGIS. Creé un observador para un punto cerca del Lago Utah (USA) y se calculó la salida y puesta del sol para el día '2010/6/21'. El script era:

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

Después de ejecutar en la consola de Python de QGIS, el resultado fue:

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

Esta es la respuesta.

Nota de edición :

Definir un nuevo horizonte (por ejemplo, 5 grados):

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

el resultado es:

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

0 votos

Gracias por esto, parece una pieza del rompecabezas. Parece que podría utilizar PyEphem para calcular los ángulos de acimut y altitud del sol en un momento determinado? ¿Cómo puedo usar eso para encontrar el momento en que el sol sale por encima/se pone por debajo del horizonte? (Teniendo en cuenta la topografía, estoy asumiendo que las horas de puesta/salida del sol que el paquete ephem está produciendo están asumiendo una tierra perfectamente lisa).

2 votos

¿Quizás una combinación de r.horizon y PyEphem podría funcionar? ¿Alguna idea sobre cómo usar los dos juntos? GRASS tiene un módulo r.sun, que puedo utilizar para calcular el número de horas de luz solar directa en un lugar determinado en un día determinado, teniendo en cuenta la topografía. Eso parece hacer casi lo que quiero, pero no parece mostrar la hora real en que la luz solar directa comienza/se detiene.

0 votos

Prometedor y útil, pero no tiene en cuenta la topografía. El horizonte visible desde el interior de un valle no es el mismo que el verdadero horizonte (sin obstáculos).

1voto

Jason Morse Puntos 2149

Podrías usar una biblioteca como PyEphem para encontrar, para una ubicación, elevación, día, hora(s) (y planeta ;) los ángulos de azimut y altitud del sol.

0 votos

¿Puede sugerir una aplicación de esto? La pregunta original no menciona implícitamente a python, pero el P.O. podría ser capaz de captarlo si el ejemplo es lo suficientemente sencillo.

1voto

Peter Westlake Puntos 391

Puedes usar un poco de python para hacer esto, pero primero necesitas generar un diccionario o tabla, a partir de la posición de tus observadores, del ángulo con el horizonte del mundo real parece estar. Esto tendría que ser en intervalos de 1 grado con 0 = norte verdadero y para cada grado dando el ángulo del horizonte. Esto puede provenir de su horizonte real.

A continuación, podría utilizar pyephem para a) crear un observer en la latitud, longitud y altitud de tu observador y para cada minuto de un día determinado úsalo para calcular las posiciones aparentes del sol, éstas se darían como cuatro valores, ra, dec, alt y az.

Entonces para cada valor de tiempo puedes comparar la alt con el valor de la tabla de elevación en ese acimut y cuando la alt sea mayor que el valor de la tabla podrás ver el sol.

Incluso es posible que se puedan encontrar algunos puntos en los que, en un día determinado, el sol sale por un valle y luego desaparece detrás de una montaña para luego reaparecer por encima o al otro lado de la misma.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X