Interpolation methodology

Every 3D view, 2D view, and volume estimate on the results page comes from the same interpolation. A boring only tells you the %RE response at that one location, at discrete sampled depths. Below we describe the method used to estimate what's happening in the space between and around your borings, filling in a full 3D grid from those discrete samples.

What is measured and what is estimated

Only the boring logs are measurements. Everything else on the results page is built from them, in three steps:

One consequence is worth knowing before you compare a figure with a log: the highest value on the grid differs from the highest reading in the logs, because cells rarely sit exactly on a boring and each input is already a 30 cm summary. It is usually lower: on the Example Job the logs peak at 653.8 %RE (SB-02) and the grid at 534.7 %RE. It can also come out slightly higher where kriging overshoots between high readings. Each job's readme.txt gives both numbers.

Depths are below each boring's own ground surface. Ground surface elevations aren't used (the coordinates file's ground_surface_elev_ft column is optional): every boring starts at the same level, so the 3D view, 2D view and volumes treat the ground as flat. On a site with real relief, a layer at one elevation shows up at different depths in different borings.

The problem: estimating between borings

A site is only ever sampled at a handful of discrete locations and depths. To draw a continuous 3D plume, or estimate a volume of material exceeding some %RE threshold, something has to fill in the gaps between those samples with a reasonable estimate.

The simplest approaches — connecting the sampled points with straight lines, or just using whichever sample is nearest — treat every gap the same way, with no regard for how spatially correlated the real %RE response actually is, and no sense of how confident the estimate should be in a sparsely-sampled area versus a densely logged one.

Kriging

Kriging is a geostatistical interpolation method: it predicts a value at an unsampled location by weighting the surrounding known samples, rather than treating every nearby sample equally. The method rests on a simple geographic principle — spatial autocorrelation: two locations close together tend to have more similar %RE responses than two locations far apart. Kriging turns that principle into real numbers by looking at the distance between every pair of known samples.

A schematic 3D view of four borings, each drawn as a vertical column of input points against easting, northing and depth below ground. A dashed line joins two points in the same boring, labeled same boring, 2.4 m; another joins two borings at the same depth, labeled same depth, 10.0 m.
A schematic, not a computed result: four borings, each a column of input points (one per 30 cm interval; every other one drawn). Every pair of input points has its own 3D distance. Two are labeled: two points in the same boring (the vertical direction) and two borings at the same depth (the horizontal one). Kriging uses the distance between every pair.

To turn those distances into weights, lif-viz builds a semivariogram: for every pair of known samples, it plots how different their %RE values are against how far apart they are. Pairs close together typically land low on that plot (similar values, low dissimilarity); pairs far apart typically land higher (less related values) — up to a point, beyond which distance stops making the pairs any less related.

A chart showing semivariance (dissimilarity between sample pairs) on the vertical axis against separation distance on the horizontal axis. Points close together have low semivariance; the values rise with distance and then level off. A smooth curve (the fitted spherical model) passes through the scattered points.
An illustrative semivariogram — dissimilarity between sample pairs rises with distance, then levels off once pairs are far enough apart that distance no longer explains how related they are.

A mathematical curve is fit to that pattern — lif-viz uses a spherical model, a standard, well-established choice in environmental work. That fitted curve is what actually produces the interpolation weights: a sample gets more say over a prediction the closer and more correlated it is, and less the farther and less correlated it is — a more sophisticated rule than "nearest sample wins," because it reflects the real, measured spatial structure of this site's own data, not a fixed assumption applied to every site the same way. Kriging reproduces each input point exactly at that point's own location, but the grid's cells rarely sit exactly on one, so values right next to a boring can differ from its log (see what is measured and what is estimated).

lif-viz builds that semivariogram in two directions: from pairs of readings in the same boring (vertical), and from pairs of borings at the same depth (horizontal). On real UVOST data the two are very different. Readings in one boring typically stop being related within a meter or two, while across borings it takes tens of meters, because contamination tends to spread in thin layers. So the fitted model has its own range in each direction, which keeps a thin contaminated layer thin between borings instead of spreading it over the whole depth. The horizontal range is fitted on the logarithm of %RE: with only a handful of borings, one boring hundreds of times above background would otherwise decide it, depending on which other borings happen to sit at which distances from it. Each job's fitted values are listed in its readme.txt. When a job has too few borings to fit the horizontal direction, that range is set from the site's size instead, and the readme says so.

lif-viz uses ordinary kriging — the variant that assumes an unknown but locally constant mean, rather than requiring you to already know a trend across the site. The interpolation runs on the cleaned, canonical dataset described in the audit report, at every job, before any visualization is drawn.

Like any interpolation method, kriging is only as good as the data feeding it — it can't invent information about parts of a site with no nearby samples, and a wide, high-variance area on a real kriging variance surface is telling you exactly that: more borings would narrow the uncertainty there. The 3D view and volume estimates elsewhere on this page are estimates built on real statistics, not a claim of certainty everywhere on the site. The results page doesn't show the kriging variance itself, and no figure or volume comes with an error band.

That uncertainty also decides how far the results reach beyond your borings; see How far the results reach below.

For the full mathematical background, see Kriging on Wikipedia ↗.

How far the results reach: the 90% rule

Kriging can produce an estimate anywhere, even far from every boring, but far away that estimate tells you little. So lif-viz draws an estimate only where your borings actually support it, judged with numbers the kriging already works with:

Sill
The level where the semivariogram above flattens out: the typical difference between two readings so far apart that they're unrelated. It is about the variance of all of the job's readings, in %RE squared. Each job's fitted sill is listed on the Variogram line of its readme.txt.
Kriging variance
Kriging's own measure of how uncertain each estimate is, in the same units as the sill. It is small next to a boring and grows with distance from the borings until it levels off at the no-data level.
No-data level
The kriging variance of an estimate with no boring nearby, where the borings no longer inform it and kriging returns roughly the site's average reading. It is about the sill, a few percent above it, since ordinary kriging also allows for not knowing the site's average (4.3% above on the Example Job). Each job's no-data level is listed on the Interpolated area line of its readme.txt.
The rule
An estimate is drawn only while its kriging variance is below 90% of the no-data level, meaning the nearby borings have reduced its variance by more than 10% compared with having no data there. The fraction is the same for every job; the no-data level, and so the distance at which this happens, comes from each job's own data.
A line chart of kriging variance, as a percentage of the no-data level, against distance east of boring SB-06 on the Example Job. The variance starts near zero at the boring, rises steadily, crosses 90% at about 21 meters, and levels off at 100%, labeled No borings nearby. The region left of 21 meters is labeled Drawn; the shaded region to the right is labeled Left blank.
Computed from the Example Job (synthetic data): the kriging variance along a line running east from its southeast boring, SB-06, as a share of the job's no-data level. Estimates are drawn out to about 21 m, where the variance reaches 90% of that level, and left blank beyond that.

How far that reaches depends mostly on the fitted horizontal range in the job's readme.txt: about 21 m past the Example Job's SB-06 with its 39.8 m range, and 50 m or more on a site whose fitted range is longer than the site itself. So:

A blank estimate is left out everywhere: the 3D views, the 2D plan view's colors, the GeoTIFF export and the volume estimates. In the 2D view's contour lines, it is where a line turns from solid to dashed (see Contour lines below).

3D View

The results page's 3D View tab renders the full computed kriging grid directly in three dimensions — every interpolated cell at its own real (easting, northing, depth) position, colored by %RE using your chosen color ramp. Drag to rotate, shift-click drag to pan, and scroll to zoom, so you can see the actual shape of the response in space: which depths carry it, whether it's a thin layer or a tall column, and how that shape changes as you adjust the transparency threshold or gamma value (see the visualization-options help page for what those controls do).

This is the one view that shows the true vertical structure of the interpolation — the detail the 2D View below necessarily collapses away to produce a single flat image.

Its vertical scale is exaggerated 3×, so a thin layer stays visible next to a site tens of meters across; layers look three times thicker, and slopes three times steeper, than they are. The vertical axis, Height above ground (m), is 0 at each boring's ground surface and negative below it, so −5 means 5 m below ground. The black rods are the borings, drawn from their first reading to their last. The tick labels on all three axes are true, unexaggerated meters, in the coordinate system of your coordinates file.

2D View

The results page's 2D View tab is a top-down projection of the exact same 3D kriging grid used by the 3D view — it is not a second, separate interpolation, and it does not use a different statistical model. At every (easting, northing) location on the grid, the plan view shows the single highest %RE value found at any depth below that point, so a plume that is strongest at 4 m depth and a plume that is strongest at 9 m depth both show up at full intensity in the same flat image.

Note that the plan view is displayed (and exported as a GeoTIFF) as a smoothed version of the underlying grid, using a 2D spline fit purely for display so the plume reads as a continuous cloud rather than a blocky grid of cells. The smoothing never changes which cells the kriging model actually computed — it's the same values, just interpolated onto a much finer image for a nicer-looking result — so the plan view and the 3D view always agree on the underlying plume shape. Areas left blank follow the 90% rule above. A spot is colored if any depth below it passes the rule.

The 2D view's tick labels are easting (along the bottom) and northing (up the side), in meters in the coordinate system of your coordinates file. Two exports from the Export menu take it into GIS: Plan View (GeoTIFF), a colored image in that same coordinate system, and Contour Lines (GeoJSON), in WGS84 longitude/latitude, which every GIS reprojects on the fly; see the visualization-options page for what each holds. Both line up with your other layers as long as the coordinate system in your coordinates file is the one your borings were surveyed in.

Contour lines. The 2D view can draw contour lines at 10, 25, 50 and 100 %RE, labeled “10%” to “100%”. They are traced on the kriging grid itself (3 m cells, the highest value at any depth) rather than on the smoothed display image, then gently rounded: the smoothing overshoots slightly between grid cells, which is invisible in the colors but would turn a line near a site's background level into many tiny loops. A line is drawn solid between the borings, inside their footprint, and dashed in the extrapolated area past it; where the map is blank, as the estimate fails the 90% rule, the line isn’t drawn at all, so it can end at the edge of the colors. Every level stays drawn whatever the transparency threshold, and the Contour Lines (GeoJSON) export holds the same lines, each piece marked as extrapolated or not.

← Back to upload form