Skip to content

Instantly share code, notes, and snippets.

@schuyler
Last active September 26, 2022 17:14
Show Gist options
  • Save schuyler/3b8ae12b7478f5646deb0c3082e46ca0 to your computer and use it in GitHub Desktop.
Save schuyler/3b8ae12b7478f5646deb0c3082e46ca0 to your computer and use it in GitHub Desktop.
When was this photo of the Brooklyn Bridge taken?

Around 2010 or so, I bought a print of this photo in a frame at either Target or Ikea, I can't recall which, because it made me nostalgic for New York City, which I had just left.

an image of the Brooklyn Bridge with the full moon setting behind it

After spending about a year with this print on my wall, I realized that the orientation of bridge and moon in the original photo could probably be used to work out when the photo was taken.

My first estimate was that photo was taken from Emily Warren Roebling Plaza in Empire Fulton Ferry State Park just to the north of the southeast pier of the Brooklyn Bridge. The coordinates are roughly 40.70427ºN, 73.99420ºW.

viewer_coords = (40.70427, -73.99420)

In the photo, the moon is roughly in line with the bridge itself. Plainly visible to its right is 375 Pearl Street, also known as the Verizon building, or Intergate Manhattan. The building was built in 1975 to a height of 160 meters. Its coordinates are roughly 40.7108ºN, 74.00122ºW.

bldg_coords = (40.71080, -74.00122)
bldg_height = 160

The bearing from E. W. Roebling Plaza to Intergate Manhattan is roughly the same as that of the bridge, so we can use that to compute the azimuth between them, and find the rough azimuth of the moon when the photo was taken.

import pyproj

geodesic = pyproj.Geod(ellps='WGS84')
azimuth, _, distance = geodesic.inv(viewer_coords[1], viewer_coords[0], bldg_coords[1], bldg_coords[0])

if (azimuth < 0): azimuth += 360

"{:.1f} m apart @ {:.1f}º".format(distance, azimuth)
'936.9 m apart @ 320.7º'

A simple measurement in Google Maps confirms that this is more or less the correct distance.

In the photo, 375 Pearl Street can be seen with its original Bell Telephone logo. This facade was changed to a Verizon logo after Bell Atlantic's merger with GTE to form Verizon in late 2000. So we know that this photo was taken on the night of a full moon sometime between 1975 and 2000, inclusive.

We start by finding all of the full moons between Jan 1, 1975 and Dec 31, 2000.

from skyfield import api, almanac
from datetime import timedelta

time = api.load.timescale()
eph = api.load('de421.bsp')

full_moons = []
start = time.utc(1975)
while start.utc.year < 2001:
    end = start + 28
    ts, ys = almanac.find_discrete(start, end, almanac.moon_phases(eph))
    for t, y in zip(ts, ys):
        if y == 2:
            full_moons.append(t)
    start = end
    
print(len(full_moons))
322

In the photo, the moon is about to set below the western horizon as seen from Brooklyn. Moreover, the moon looks, if anything, just shy of full.

So, for each of the 322 full moons during this 26 year period, we want to find the moonset immediately before the full moon.

brooklyn = api.wgs84.latlon(viewer_coords[0], viewer_coords[1])

is_rising = almanac.risings_and_settings(eph, eph['Moon'], brooklyn)
moonsets = []

for t1 in full_moons:
    t0 = t1 - timedelta(hours=26)
    ts, ys = almanac.find_discrete(t0, t1, is_rising)
    for t, y in zip(ts, ys):
        if y == 0:
            moonsets.append(t)
            break
            
print(len(moonsets))
322

The photo was taken some time before moonset, of course. In the photo, the bottom of the moon appears roughly level with the top of 375 Pearl. We can use some simple trigonometry to work out the elevation from the horizon.

import math
elev = math.degrees(math.atan2(bldg_height, distance))
"{:.1f}º".format(elev)
'9.7º'

To estimate how long the photo was taken before moonset, we need to consider how fast the moon moves. The Moon moves 360º around the Earth's sky in about 24 hours.

deg_per_hour = 360.0 / 24.0
deg_per_min = deg_per_hour / 60.0
min_before_moonset = elev / deg_per_min
"{:.1f} min".format(min_before_moonset)
'38.8 min'

Now we can look at each moonset, rewind by 39 minutes, and examine the altitude and azimuth of the moon at that time. The closest one is probably the time at which the photo was taken.

from zoneinfo import ZoneInfo
est = ZoneInfo("America/New_York")

brooklyn = eph['earth'] + api.wgs84.latlon(viewer_coords[0], viewer_coords[1])
moments = []
for t in moonsets:
    t = t - timedelta(minutes=67)
    astro = brooklyn.at(t).observe(eph['moon'])
    apparent = astro.apparent()
    alt, az, _ = apparent.altaz()
    moments.append((az.degrees, alt.degrees, t.astimezone(est).ctime()))
    
moments.sort()
moments.reverse()

for alt, az, t in moments[:5]:
    print("{}: {:.1f}º high @ bearing {:.0f}º".format(t, az, alt))
    
Sun Jan  3 06:15:08 1988: 9.7º high @ bearing 298º
Thu Dec 22 05:53:38 1988: 9.7º high @ bearing 298º
Wed Jan 14 06:16:27 1987: 9.9º high @ bearing 297º
Tue Dec 12 06:13:06 1989: 9.7º high @ bearing 297º
Thu Dec 26 05:51:44 1985: 9.8º high @ bearing 297º

Notably, at none of these times was the Moon far enough north to be seen from the plaza at a bearing of 320º. The Moon never gets that far north, ever. Therefore the photographer must have been somewhere farther north themselves, with a limit placed by the location of the Manhattan Bridge.

A quick search of Getty Images for "Brooklyn Bridge moon" confirms that the Moon is normally photographed well to the south of the bridge.

This conclusion is backed up by the fact that the Moon would've been at the estimated elevation 67 minutes prior to setting (not 39)... unless the viewer were closer to 375 Pearl than the far bank of the river.

Very likely the photgrapher was on a boat in the East River on the morning of Sunday Jan 3 1988, or maybe Thursday Dec 22 later that year. It would have been a cold morning -- the weather station at LaGuardia reported a temperature of 25ºF at 6am on Jan 3. The same weather station report gives the atmospheric conditions that morning as "fair", which matches the cloudless sky.

This exercise is how I learned about the 18.6 year lunar nodal cycle and the concept of lunar standstill. Indeed, 1988 was near the peak of one of these cycles, aligning the full Moon as close to the angle of the Brooklyn Bridge as it ever gets, only a handful of times in every 20 years.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment