Skip to content

ZeroTrace OSINT

Sun & Shadow Solver

Solar-position math for narrowing a photo's latitude band from timestamp and observed sun bearing or shadow length.

The sun and shadow solver applies the standard solar-position algorithm to a photo's date and time, returning the latitude band where the sun would have the observed properties at that time.

It is the classic OSINT geolocation trick — photo timestamp + sun position constrains location — automated.

Two modes

ModeInputsOutput
Bearing modeDate / time (with timezone), latitude band guess, observed sun bearingLatitude band where the sun has the observed bearing at the observed time
Shadow-ratio modeDate / time (with timezone), two known-distance landmarks, their shadow lengthsLatitude that satisfies the shadow-length ratio

Both modes return a band, not a point — the math constrains latitude tightly but longitude only weakly (and longitude can usually be narrowed by other clues).

Bearing mode

Inputs:

  • Date and time — typically from the photo's EXIF timestamp.
  • Timezone — important because the sun position depends on local solar time.
  • Approximate latitude band — your starting guess (Northern hemisphere / Southern / equatorial).
  • Observed sun bearing — degrees from north (0 = north, 90 = east, 180 = south, 270 = west).

The tool computes where on Earth the sun would have that bearing at the given UTC time, then returns the candidate latitude band.

For most cases, the result narrows latitude to within a few hundred kilometres — enough to rule out continents, often enough to identify a country.

Shadow-ratio mode

Inputs:

  • Date and time — from the photo's EXIF.
  • Timezone.
  • Two known landmarks in the photo whose physical distance you can estimate (e.g., the height of a flagpole, the spacing of two lampposts).
  • Their shadow lengths in the same units.

The tool computes the sun's elevation angle implied by the shadow ratio, then finds the latitudes where that elevation angle is correct at the given time.

This mode is more precise than bearing mode when the inputs are accurate. The catch: estimating physical lengths from a photo is hard. Use it when one of the landmarks has a well-known size (a flagpole of standard height, a soccer goal of regulated width).

Output

FieldExample
Latitude band"Between 41° and 47° North"
Uncertainty"± 3°"
Candidate citiesFive well-known cities within the latitude band, with their sunrise / sunset / azimuth at the time
Other constraintsReminders of what the math does not constrain (longitude, hemisphere if not specified)

The candidate-cities table is helpful for mapping the abstract latitude band to recognisable places. If your latitude band is "between 50° and 53° North" and the candidates include London, Brussels, Berlin, Warsaw, the band is "Northern Europe."

The sun and shadow solver does not "solve" a location — it constrains one dimension. Combine it with other clues from geo clues, reverse image, and aerial comparator to narrow further.

When to use it

  • Image with a clear sun position and a reliable timestamp. The classic case. Outdoor photo with a visible sun direction and the camera's clock plausibly correct.
  • Image with shadows and a reference object of known size. Less common but very precise when it applies.
  • Cross-check against a candidate location. "I think this is in Berlin. Does the sun at this time on this date in Berlin produce shadows like the photo's?"

When not to use it

  • Indoor photos. No sun signal.
  • Photos at solar noon. Sun directly overhead — no bearing to measure.
  • Polar latitudes in summer — sun above the horizon for long periods, low bearing variation.
  • Polar latitudes in winter — sun below the horizon, no shadow at all.

Pivots

Click on...Pivot to
Latitude bandAerial comparator (centred on the band's median)
Candidate cityAerial comparator
Date / time(no pivot — informational)

Sources

The solar-position algorithm runs locally. No external sources are queried. The candidate-cities catalog is bundled with the application.

Command Palette

Search for a command to run...