From Samples to One Height
A SWOT pass measures many heights around a gauge, some over open water, some over land or a pier, and some the product flags as suspect, whereas the comparison with the gauge needs one height for each pass beside how far that height can be trusted. Averaging more samples narrows only the random part of a pass's error, since most of that error varies slowly over long distances1, so a pass resting on two samples and a pass resting on forty are different observations, and the heights table carries the count and the spread of each beside its height. This page sets out how Tidemark chooses the samples around each gauge, rebuilds a height from each, moves those heights onto NAVD 88, reduces each pass to one height, and states its uncertainty.
tidemark run computes the coasts table, the heights table, and the selection table from the samples table, which it first brings up to date with the passes mise run data:fetch:swot l2 l3 keeps, beside the coastline, the geoid grid, and the GNSS rates that mise run data:fetch:coast, mise run data:fetch:geoid, and mise run data:fetch:gnss write, and each setting named below is a flag of tidemark run and a key of the [tool.tidemark] table, as Every Setting Declared Once sets out.
Choosing a Level
Each pass at each gauge takes its height from AVISO's Level 3 Unsmoothed product2 wherever its samples within the search radius keep at least min-samples usable samples, five by default, and otherwise from PO.DAAC's Level 2 Unsmoothed file3 where those keep as many, as Level 3's Differences explains. A pass whose two levels both fall short gives no height, and each row of the table names the level it was read from in its product column. A Level 3 pass up to cycle 32, pass 223 rests on Version C of the Level 2 processing, whereas every Level 2 pass the fallback reads is Version D. One sample carries no spread and two or three carry an unstable one, so five is the fewest a pass keeps.
Rebuilding a Height
Both levels give a sea surface height above the ellipsoid, with the ocean tide and the effect of air pressure and wind left in, since a gauge records the water level with both included. Both take out the tides that move the ground beneath a gauge rather than the water against it, meaning the solid Earth tide, the pole tide, and the load tide, the last the crust's give under the ocean tide's weight, since the gauge rises and falls with the ground and records none of them. On the passes we fetched, the load tide within the default 5 km of a gauge came to a median of 8 mm either way and reached 35 mm.
- A Level 2 height adds the crossover correction to
ssh_karin_2and takes out the solid Earth tide, the pole tide, and the load tide,load_tide_fes. JPL's product description (JPL D-56407) computes the crossover correction without applying it, and leaves the three tides in the height, taking them out only from the anomaly, where over land it keeps only the load tide in the ocean tide it removes (§4.1.3).ssh_karin_2corrects the wet troposphere with a weather model, which leaves it free of the voids the radiometer leaves near land, and theheightsetting readsssh_karinin its place - A Level 3 height adds back to
ssha_unfilteredthe mean sea surface, the ocean tide, the correction for air pressure and wind, and the internal tide, the terms the DUACS Level 3 handbook names as removed (§6.1). Rong and colleagues rebuilt the total water level from this product by adding back the first three4, and the internal tide joins them here since a gauge records the water's rise and fall with it. The load tide then comes out, since the file'socean_tideholds the ocean tide and its load tide summed and only AVISO's Technical file separates the two, so each sample takes the medianload_tide_fesof the Level 2 Expert samples of its pass within the radius, which JPL computes from the same FES2022 model. Across those Expert samples the load tide varied by a median of 1.3 mm and at most 5.1 mm, and a Level 3 pass the Level 2 fetch never kept has no height. The file names no ellipsoid for the sum, and its mean sea surface is CNES_CLS 2025, which AVISO publishes above WGS 84, so the heights table reads the sum as a height above WGS 84
No Level 3 file carries either solid tide to add back, so the Level 2 height takes both out and holds the terms the Level 3 height holds.
Selecting the Samples
A sample counts toward a pass's height where it sits within radius-m of the gauge, 5 km by default, measured on the sphere the fetch measures its reach on, and where it meets every condition below that its level carries a column for:
- Quality reads the band of the height a Level 2 sample carries, keeping the band
quality-flagnames and every band ranked above it, from good down to bad, whereas a Level 3 sample counts as good at aquality_flagof good or eclipse, the two values the handbook recommends keeping (§2.5) - The coast reads each sample's
coastline_distance, its distance on the sphere to the nearest point of the OpenStreetMap coastline5, the line between the sea and the land at mean high water springs, negative on the land side, which holds any river upstream of where the coastline crosses its mouth, and positive at sea. Amin-coast-distance-mof zero therefore keeps every sample, and one above zero keeps the samples at least that far out to sea - The surface reads a Level 2 sample's surface type, from a map built from MODIS and GlobCover, keeping the types
surfacesnames, open ocean and continental water by default
Level 3 carries no surface type, since the editing that set its quality_flag already read it (§2.5), so that condition keeps every Level 3 sample, whereas the coast condition reads both levels alike, from the source AVISO builds the Level 3 land-sea mask from (§4.6.1.3), so a sweep of min-coast-distance-m reads one definition at both levels, while its default of zero keeps every Level 3 sample the editing kept. The selection table reports, for every gauge and each level holding a sample within the radius, the passes and the samples there, the share of them each condition removes, and the passes left with enough usable samples beside those the heights table reads from that level.
The coastline this page reads is a derivative database under the Open Database License, and tidemark fetch coast makes a free copy of the cut.
Two Coastlines Compared
The coasts table compares, at every gauge holding a Level 2 Unsmoothed sample within the radius, each sample's coastline_distance with the distance_to_coast the Level 2 file gives it, which the Expert file measures for the 2 km pixel holding the sample and signs negative on the land side, although JPL D-56407 describes it as zero over land (§4.1.5). Each row carries the median of the first less the second, the 90th percentile of that difference's absolute value, which reads a difference of either sign alike, and the share of the samples the two place on opposite sides of the coast, so a reader sees where the two coastlines disagree before the selection reads either.
Reaching NAVD 88
Every gauge series reads on NAVD 88, Bar Harbor's and Camp Ellis's through the offset the station catalog measures for each, so on the reference setting's default of navd88 each height moves onto that datum through the steps Fan and colleagues took the other way, moving their East Coast gauges from NAVD 88 into ITRF2014, the realization this conversion reads SWOT's heights in, since the product description names none6. Each sample's height above WGS 84 is read as its height in ITRF2014, whose GRS80 ellipsoid sits within 0.1 mm of WGS 84 along the Maine coast, and moved to NAD83(2011) through the time-dependent transformation NGS publishes in the EPSG registry, at the sample's own position and instant, and the GEOID18 geoid height at that position7 is then subtracted. Both steps run before the pass reduces, since both change across a gauge's reach, by 1.2 mm and 0.09 m within the default 5 km of Portland.
Once the pass reduces, its height moves back to epoch 2010.0, the epoch GEOID18 is defined for, by the vertical rate the Nevada Geodetic Laboratory measures at the GNSS station chosen for the gauge8, the most certain within gnss-radius-m among those whose series spans gnss-span-years, or the nearest beyond it where none lies within. Each row records the frame change and the geoid height as frame_shift and geoid_height, the median of each over the kept samples, so they need not sum exactly to height_navd88, beside the station, its rate moved into NAD83(2011) as rate_up_nad83, the land_shift it gives, and height_navd88_2010. On ellipsoid, every one of those columns stays empty and a run reads neither the grid nor the rates. The land's rate is the one step no NOAA tool confirms, since NGL's rates at the anchors differ from HTDP's velocity model9 by as much as 1.01 mm a year, at Saco.
Reducing a Pass
The comparisons with gauges closest to this one take the median of the samples around a gauge on each pass10411, which one stray sample barely moves, and the median reduction does the same. Lichtman and colleagues first dropped every sample beyond three median absolute deviations within each pass10, about two standard deviations over normally distributed heights. The clipped reduction first drops every sample further than two standard deviations from that median, reading the standard deviation as the median absolute deviation scaled to equal it over normally distributed heights, as Bazzi and colleagues filtered each acquisition before comparing it with a gauge12. Each row carries the median absolute deviation of the samples kept, their count, their mean distance from the gauge, the first and last instant among them and the median of those instants, and where the gauge sits across the pass, read from The Pass Schedule.
The site draws one Level 2 pass, pass 520 of cycle 11 on 4 March 20243, whose track runs 57.9 km from the Bar Harbor gauge13, so the swath's outer edge crosses the search radius around it, and reduces that pass in the browser by the rules above as a reader moves each setting, on the ellipsoid since the browser holds no geoid grid, keeping only the samples in the default quality band and leaving out every sample the surface map classifies as land. mise run data:excerpt runs tidemark excerpt, which copies the pass into the package from the samples mise run data:fetch:swot fetched, and the drawing reads each height the selection rebuilds, never a Level 3 value.
- Height
- -24.009 m
- Kept
- 874 of 874 usable, 882 within 5.00 km
Stating the Uncertainty
The Unsmoothed file oversamples its grid, in that each pixel of 250 meters is a quarter of a resolution cell of 500 meters, so averaging N pixels narrows the random error by about the square root of N over four rather than of N (JPL D-56407 §4.1.3), and every uncertainty below reads a quarter of the samples as independent. The uncertainty setting names which one the table carries as the height's own, the bootstrap's by default, since it reads any reduction the same way.
| Uncertainty | What It Reads |
|---|---|
bootstrap | The standard error of the reduction over 1,000 resamples of the pass's samples by default, scaled by the square root of the count over the independent samples, since a resample draws single samples. Each pass draws from a generator of its own, seeded from seed, the cycle, the pass, and the gauge, over its samples in the order of their instants and, among the samples of one line, their positions, so a run draws the same resamples for every pass whatever other passes it reduces |
analytic | The scaled deviation of the samples kept, over the square root of the independent samples, times the square root of π over two, the ratio of a median's standard error to a mean's over normally distributed values, so that , where is the median absolute deviation of the samples kept times 1.4826 |
swot | The median of the random error the product states for each sample, read the same way, which Level 3 does not carry and so leaves empty |
The table also carries the spread excess, the part of the samples' standard deviation that their stated random error leaves unexplained, reading the two as variances that add, which is empty wherever the level states no random error.
Every figure or statistic this page or a run computes from Level 3 is computed from AVISO's Level 3 Unsmoothed product2, under the license and with the changes Credits sets out, and implies no endorsement by AVISO or CNES.
The Example Pass
The package ships the samples of the pass the site draws in src/tidemark/swot/example.parquet, one row for each sample within 10 km of the gauge, before any condition removes one. The table below lists its columns, written from ExampleSchema in tidemark.swot.frames by mise run docs:render.
| Column | Holds |
|---|---|
ancillary_surface_classification_flag | The surface type a map built from MODIS and GlobCover gives the sample |
coastline_distance | The distance in meters to the nearest point of the OpenStreetMap coastline, negative on the land side |
cross_track_distance | The distance in meters from the satellite's nadir track, negative on its left side |
distance | The distance in meters of the sample from the gauge |
height_ellipsoid | The sea surface height in meters above the WGS 84 ellipsoid, as a selection rebuilds it |
latitude | Where the sample sits in degrees north |
longitude | Where the sample sits in degrees east, from -180 to 180 |
quality | The quality band of the height |
sample_uncertainty | The one-sigma random error in meters the product states |
time | The instant the sample was measured at, in UTC |
1Hay et al. 2025. "In Situ Geometric Validation of SWOT Satellite Observations in Bass Strait, Australia." Earth and Space Science 12(8): e2025EA004326. https://doi.org/
10.1029/ ↩︎2025EA004326 2AVISO/DUACS 2024. "SWOT Level-3 SSH Unsmoothed." Version 3. CNES. https://doi.org/
10.24400/ .↩︎ ↩︎527896/ A01-2024.003 3SWOT 2025. "SWOT Level 2 KaRIn Low Rate Sea Surface Height Data Product." Version D. NASA Physical Oceanography Distributed Active Archive Center. https://doi.org/
10.5067/ .↩︎ ↩︎SWOT-SSH-D 4Rong et al. 2026. "Evaluating SWOT in the Coastal Zone: Comparisons With Tide Gauge and Airborne LiDAR in the Bristol Channel and Severn Estuary, UK." Geophysical Research Letters 53(2): e2025GL116590. https://doi.org/
10.1029/ ↩︎ ↩︎2025GL116590 5OpenStreetMap contributors 2026. "Coastlines." osmdata.openstreetmap.de. https://osmdata.openstreetmap.de/
data/ .↩︎coastlines.html 6Fan et al. 2026. "Assessing the Consistency of Coastal Sea Surface Height Measurements From SWOT Altimetry and Tide Gauges Along the U.S. East Coast." Acta Geodynamica et Geomaterialia 23(3): 393–402. https://doi.org/
10.13168/ ↩︎agg.2026.0026 7National Geodetic Survey 2019. "GEOID18." PROJ. https://cdn.proj.org/
us_noaa_g2018u0.tif .↩︎8Blewitt et al. 2018. "Harnessing the GPS Data Explosion for Interdisciplinary Science." Eos 99. https://doi.org/
10.1029/ ↩︎2018EO104623 9National Geodetic Survey 2025. "HTDP – Horizontal Time-Dependent Positioning." Version 3.6.0. https://geodesy.noaa.gov/
TOOLS/ .↩︎Htdp/ Htdp.shtml 10Lichtman et al. 2025. "Evaluating Water Levels From the Surface Water and Ocean Topography (SWOT) Mission in a Hyper-Tidal Coastal and Estuarine Environment." Earth and Space Science 12(7): e2024EA004104. https://doi.org/
10.1029/ ↩︎ ↩︎2024EA004104 11Vega-Gimenez et al. 2025. "Expanding the Coastal Observation Frontier: SWOT Reveals the Spatial Footprint of Storm Surges." Geophysical Research Letters 52(24): e2025GL117299. https://doi.org/
10.1029/ ↩︎2025GL117299 12Bazzi et al. 2025. "Assessing SWOT Interferometric SAR Altimetry for Inland Water Monitoring: Insights From Lake Léman." Frontiers in Remote Sensing 6: 1572114. https://doi.org/
10.3389/ ↩︎frsen.2025.1572114 13NOAA CO-OPS 2026. "CO-OPS Data Retrieval API and Metadata API." https://tidesandcurrents.noaa.gov/
web_services_info.html .↩︎