Naval Observatory Risings and Settings
One of the most famous and reliable sources of astronomical almanacs is
the United States Naval Observatory. Ship captains were amongst the
earliest consumers of precision celestial data, since on the wide and
featureless expanses of the world’s oceans you can often deduce your
position only by comparing the altitude of the stars and Sun and Moon
against the time given by the ship’s clock.
If you want to compute rising and setting times that match the ones
given by the Navy in their Astronomical Almanac, then turn off
PyEphem’s native mechanism for computing atmospheric refraction near the
horizon. As explained above, you can do this simply by setting the
pressure
of your observer to zero. Then, manually set
the horizon that you want to use to one that is exactly 34 arcminutes
lower than the normal horizon, to match the value by which the Navy
reckons that an object at the horizon is refracted:
>>> import ephem
>>> atlanta = ephem.Observer()
>>> atlanta.pressure = 0
>>> atlanta.horizon = '-0:34'
Let’s see if these values work! Here are the rising and setting times
for the Sun and Moon in Atlanta today, as returned by the USNO web
site:
Sunday
6 September 2009 Eastern Daylight Time
SUN
Begin civil twilight 6:50 a.m.
Sunrise 7:15 a.m.
Sun transit 1:36 p.m.
Sunset 7:56 p.m.
End civil twilight 8:21 p.m.
MOON
Moonrise 8:17 p.m. on preceding day
Moon transit 2:37 a.m.
Moonset 9:05 a.m.
Moonrise 8:44 p.m.
Moonset 10:05 a.m. on following day
To get the same results, we simply need to use the Navy’s longitude and
latitude for Atlanta (which their web page helpfully printed atop the
printout shown above) with the Observer
that we constructed
above with the correct pressure and horizon settings:
>>> atlanta.lat, atlanta.lon = '33.8', '-84.4' # use strings for degrees!
>>> atlanta.date = '2009/09/06 17:00' # noon EST
>>> print(atlanta.previous_rising(ephem.Sun()))
2009/9/6 11:14:57
>>> print(atlanta.next_setting(ephem.Sun()))
2009/9/6 23:56:10
>>> print(atlanta.previous_rising(ephem.Moon()))
2009/9/6 00:16:32
>>> print(atlanta.next_setting(ephem.Moon()))
2009/9/7 14:05:29
As you can see, these values, given in Universal Time, match quite
precisely the USNO values given above in Eastern Daylight Time (which,
as you can see, runs four hours earlier). So, simply use these settings
whenever you want your results to match those of the Navy.
Computing Twilight
You will note that the Navy printout in the previous section contains
another kind of information, besides simple risings and settings: it
specifies the beginning and end of twilight, which is the time during
the morning and evening when there is light but the Sun is still below
the horizon.
To compute the beginning and end of twilight, ask when the Sun reaches a
position several degrees below the horizon. There are different horizon
values you should use depending on which twilight (civil, nautical, or
astronomical) you are interested in:
- Civil twilight uses the value –6 degrees.
- Nautical twilight uses the value –12 degrees.
- Astronomical twilight uses the value –18 degrees.
Note, however, that these twilight definitions specify the position of
the center of the Sun, while the rising and setting functions normally
pay attention to the top edge of an object instead. To make them use
the Sun’s center, simply set the use_center
parameter to True
when doing the calculation. For example, here is how you would use the
Observer
created in the section above to calculate the civil
twilight in Atlanta:
>>> atlanta.horizon = '-6'
>>> print(atlanta.previous_rising(ephem.Sun(), use_center=True))
2009/9/6 10:49:40
>>> print(atlanta.next_setting(ephem.Sun(), use_center=True))
2009/9/7 00:21:23
As you can see, these values match quite precisely the times given in
the table in the previous section for civil twilight.