# Why GPS lies to you > Line of sight, multipath, and concrete — a physics-first explanation of why your map dot lies in parking garages. 2025-09-05 · 20 min read · wheria, physics · by ntan (ntan) for uranashel Canonical HTML: https://uranashel.com/blog/why-gps-lies.html --- Global Navigation Satellite Systems (GPS, GLONASS, Galileo, BeiDou) all run the same geometric trick. Your phone's receiver measures the arrival time of radio signals from at least four satellites, converts each delay into a pseudorange, an estimated distance to that satellite, and solves a system of equations for three-dimensional position plus a clock-bias correction. Under open sky the horizontal result is often 3–8 m at the 95th percentile. That will find you a restaurant, but it will not find your car on level B3 of a concrete parking garage, and no map tile can patch the gap. The failure is physics: signal attenuation, multipath reflection, and geometry collapse. ## A ruler made of time Every satellite broadcasts its orbital position and a timestamp disciplined by atomic clocks on board. The receiver notes when each signal arrives and forms a pseudorange `ρ = c·(t_rx − t_tx)`. Light covers about 0.3 m per nanosecond. A timing error of 1 ns therefore costs 30 cm of range, and the quartz oscillator in your phone is millions of times less stable than the cesium and rubidium clocks upstairs. The solver copes by treating the receiver clock offset as a fourth unknown next to x, y, and z. Four unknowns need four equations. That is where the four-satellite minimum comes from, and extra satellites over-determine the system so the receiver can average noise down. The whole solve rests on one assumption: the signal traveled in a straight line at a known speed. Standard models correct for the ionosphere and the troposphere, which slow and bend the wave by predictable amounts. Nothing in the model accounts for a signal that bounced off a concrete wall on the way in, or for one that arrived 100 times weaker than expected. Underground, both happen at once. ## Concrete eats microwaves GPS transmits on the L1 band around 1575 MHz, microwave radio that behaves roughly like light at architectural scales. It casts shadows, and a parking structure is one enormous shadow. Reinforced concrete attenuates the signal by 20–30 dB or more per pass; 20 dB is a factor of 100 in power. The signal reaches the ground at roughly −130 dBm to begin with, already below the thermal noise floor and recoverable only through correlation gain. One or two slabs push it past anything a correlator can dig out. Two levels underground, the receiver may see zero usable satellites. Or it sees something worse: reflections leaking through the partial sky view at the ramp entrance, delayed and distorted. A receiver holding fewer than four healthy satellite signals cannot solve for position reliably. Some phones then fall back to stale dead-reckoning estimates or Wi-Fi positioning, which drifts or jumps without warning. The blue dot keeps moving regardless. The phone is guessing from degraded inputs and refreshing that guess every second. ## Multipath, the error that looks like motion Some signal does penetrate near ramp mouths, on open-air upper decks, and in garages with skylights. There, multipath dominates the error budget. The direct signal from a satellite arrives at your antenna along with a delayed copy reflected off a concrete wall, a metal roof, or another car. The receiver's correlation engine tracks the strongest peak, which may be a composite of the direct and reflected paths carrying an extra path length Δd. That extra length becomes a pseudorange error, and the pseudorange error becomes a position error on the order of Δd itself. A bounce across a parking aisle and back adds tens of meters of path without difficulty. Stand still and watch the dot orbit 10–30 m around you as satellite geometry shifts and different reflections take over. We measured this properly once. Bench note: 3 phones (one iPhone, one Pixel, one mid-range Samsung), 20 minutes static at a B1 ramp mouth, GNSS fixes logged at 1 Hz. The reported horizontal accuracy never exceeded 15 m. The actual scatter of the fixes spanned more than 40 m. None of this is incompetent map software. The receiver honestly reports the best estimate it can extract from ambiguous measurements; the optimism lives in the accuracy figure attached to it. ## The vertical axis is worse Horizontal error collects the complaints. Vertical error is typically 1.5–3 times worse than horizontal even in good conditions, because the satellites are mostly above you. Seen from the receiver, the constellation is nearly flat, so the geometry constrains altitude weakly and the vertical dilution-of-precision term inflates. This is why GPS cannot reliably answer "which floor am I on?" even when latitude and longitude look reasonable at the garage entrance. The floor question has a better instrument. A garage level is about 3.2 m of height, and air pressure falls by roughly 12 Pa per metre of ascent near sea level. The hydrostatic relation `Δh = ΔP/(ρg)` converts a pressure change straight into a height change, so one floor is a step of about 38 Pa against a phone barometer noise floor of 0.3–1 Pa RMS. That is a clean signal in exactly the place where GPS altitude offers noise. Wheria's barometer floor hints exist because of this asymmetry; the derivation and the failure cases live in the [barometer parking math post](https://uranashel.com/blog/barometer-parking-math.html). ## Other ways the pin goes wrong Underground is the extreme case; the same physics has cousins on the surface. Urban canyons between tall buildings run the same multipath physics as the garage, with glass facades reflecting signals into pseudorange biases of tens of meters while half the sky stays blocked. Cheap RF jammers, illegal but real, flood the band with noise; atuan once logged a 40 s dropout of every constellation at once under clear sky, the classic signature of a jammer driving past rather than anything atmospheric. Faulty electronics achieve the same result by accident with broadband interference. Each mode leaves a different fingerprint in the raw measurements, and every one of them produces the identical user experience: the pin is not where you are. ## What we tried before giving up on the dot We did not jump straight to hiding GPS indoors. First attempt: average fixes over 30 s at the garage entrance and pin the entry portal. That part works and Wheria still does it, since the entrance sits under open sky long enough for a decent fix. Second attempt: keep the fused location provider running underground and low-pass its output. Discarded after a week, because smoothing a measurement whose error is 10 times the quantity of interest yields a smooth wrong answer. Third attempt: Wi-Fi round-trip-time ranging, which is genuinely good hardware when present; in the garages we tested around District 1 and Bình Thạnh, access points supporting RTT were close to nonexistent. Discarded for coverage. What survived is the gate below. ## Gating: when Wheria trusts the fix Wheria treats a GNSS fix as one witness whose story needs corroboration. The reported accuracy must be tight, the satellite count healthy, the implied motion plausible for a person walking near a car, and the barometer must agree that you are still above ground. Any failed check hides the dot. ``` fix = gnss.latestFix() trustworthy = fix.satelliteCount at least 4 and fix.horizontalAccuracy under 20 m and fix.jumpSinceLastFix under 10 m # walking pace, no teleports and barometer.floorEstimate() at or above ground if trustworthy: map.showDot(fix, radius = fix.horizontalAccuracy) else: map.hideDot() path.extend(stepOdometry.delta()) # IMU takes over ``` When the dot disappears, the walked path replaces it. Wheria reconstructs your route from step detection and heading fusion and draws it with honest uncertainty bands, so the screen shows where you actually went rather than where a corrupted satellite solution floats. The full indoor pipeline of IMU dead reckoning, barometer floor hints, and adaptive compass fusion is documented in the [indoor navigation post](https://uranashel.com/blog/building-wheria-indoor.html). Step odometry details live in the [IMU post](https://uranashel.com/blog/step-detection-imu.html). ## The afternoon this became an app Landmark 81, Ho Chi Minh City, level B3. I parked, took a photo of the pillar number, walked to the elevator, and thought nothing of it. On the way back, GPS showed my car floating in the Saigon River, 400 m east of reality. I walked two full laps of the floor before finding it, comparing the map dot against concrete reality and losing every time. That evening the decision was simple: stop showing a lying blue dot underground and show the path actually walked. GPS still works fine when you park outdoors, and Wheria uses it there without fuss. We just stopped pretending it works where physics says it cannot. --- uranashel · [Home](https://uranashel.com/) · [Apps](https://uranashel.com/apps.html) · [Lab](https://uranashel.com/lab.html) · [About](https://uranashel.com/about.html) · [Blog](https://uranashel.com/blog/) · [Developers](https://uranashel.com/developers/) · [API docs](https://uranashel.com/docs/) · [Privacy](https://uranashel.com/privacy.html) Machine-readable: [llms.txt](https://uranashel.com/llms.txt) · [sitemap.xml](https://uranashel.com/sitemap.xml) · [openapi.json](https://uranashel.com/openapi.json) · [API](https://uranashel.com/api/v1/)