I'm calculating the longitude of positions where the current sun altitude currently is ~0.0. This is done by iterating over a range of latitudes, calculating the time of sunrise at (0.0, latitude)
and then calculate the longitude by multiplying the time difference (fractional hours) with 15 (the amount of degrees the sun "moves" over the earth surface).
When calculating the time of sunrise from the calculated coordinate tuples, the lowest latitudes show a time difference of a few minutes with the highest latitudes. How can this difference be explained?
In:
points=walk_the_earth()
Out:
[-66.53673944994807, -65.0] 2012-08-21 12:07:04.748893
[-67.13184367865324, -64.5] 2012-08-21 12:07:05.666852
[-67.70314011722803, -64.0] 2012-08-21 12:07:06.541521
...
[-119.24775995314121, 64.0] 2012-08-21 12:08:45.536679
[-119.93103107437491, 64.5] 2012-08-21 12:08:47.770382
[-120.64480075612664, 65.0] 2012-08-21 12:08:50.152224
(Times are in UTC). The code runs under ~second.
What is the cause of this difference?
Code
import math
import xephem
def longitude_from_latitude(lat):
"""
Calculate the longitude at which Sun altitude is ~0.0.
Args:
lat: A float indicating the latitude to calculate longitude
for.
Returns:
float
"""
now = xephem.julianday.now()
meridian = xephem.Observer(now.midnight.dublin, 0.0, lat)
sun = xephem.Sun.fromobserver(meridian)
transit = sun.transit(-1)
# Calculate time difference between sun position and local time.
delta_t = ((now - transit['rs_risetm']) * 24.0) * 15.0
return delta_t
def walk_the_earth(resolution=0.5, minlat=-65.0, maxlat=65.0):
"""
Calculate the coordinate at which Sun altitude is ~0.0 for
a given range of latitudes.
Args:
resolution: A float indicating the number of points to
return for the specified range of latitudes. 1.0 means
that 1 longitude will be calculated for each real
latitude, 0.5 means 2, etc.
minlat: A float indicating the lowest latitude to start
calculating.
maxlat: A float indicating the highest latitude to
calculate up to.
Returns:
list of longitude, latitude, xephem.Sun tuples.
"""
now = xephem.julianday.now()
lat = minlat
points = []
while True:
if lat > maxlat:
break
lng = longitude_from_latitude(lat)
# Create an Observer for longitude and latitude
obs = xephem.Observer(now.dublin, lng, lat)
sun = xephem.Sun.fromobserver(obs)
points.append([lng, lat, sun])
# sun.transit() calculates the rising, transit and setting times
# of the sun at Observers location. The -1 argument specifies
# that we consider sunrise to occur when the upper limb touches
# the horizon (0 indicates center, 1 indicates lower limb).
print points[-1], sun.transit(-1)['rs_risetm'].datetime()
lat += resolution
return points