Resource Estimation

Turning drill-hole samples into a 3D block model of tonnes and grade. Learn geological domaining, block models, nearest-neighbour and inverse-distance weighting, variograms (nugget, sill, range), ordinary kriging, validation, and resource classification — with a Python IDW implementation.

Drill holes sample a tiny fraction (often < 0.001 %) of a deposit. Estimation interpolates grades into blocks between holes, honouring geology and spatial continuity. The block model is the foundation of mine planning and reserves.

An analogy

Estimating block grades is like guessing the temperature in a town between weather stations: nearby stations matter more, and how fast temperature changes with distance (the variogram) tells you how much to trust them.

Block models

The deposit is divided into blocks (e.g. 10 × 10 × 5 m) each holding rock type, density, grade, and later cost and value. Block size relates to drill spacing and mining selectivity (selective mining unit).

Domaining and statistics

Estimate within geological domains (oxide vs sulphide, vein vs host). Examine histograms, coefficients of variation, and cap (top-cut) extreme values that would spread unrealistically.

Variograms

The variogram measures how grade dissimilarity grows with distance. The nugget reflects short-scale randomness and sampling error; the range is the distance beyond which samples are uncorrelated. Directional variograms reveal anisotropy along strike or plunge.

Kriging and classification

Ordinary kriging uses the variogram to compute optimal, unbiased weights and an estimation variance. Validation: swath plots, global mean comparison, visual checks. Classification into measured/indicated/inferred uses drill spacing, kriging variance and confidence. Conditional simulation quantifies grade uncertainty for risk analysis.

Formulas

Worked example: IDW estimate

Given: Samples 1.2 % at 10 m, 0.8 % at 20 m, 0.5 % at 30 m; Power 2

Find: Block grade.

Answer: ≈ 1.07 % Cu

Worked example: Reading a variogram

Given: Spherical model: nugget 0.1, sill 1.0, range 100 m

Find: γ at 50 m and interpretation.

Answer: Samples 50 m apart are still correlated; drill spacing ≲ 50–70 m supports indicated resources

Inverse-distance weighting of one block

import numpy as np

# Drill-hole composites: x, y (m) and grade (% Cu)
samples = np.array([
    [10.0,  0.0, 1.20],
    [ 0.0, 20.0, 0.80],
    [-30.0, 0.0, 0.50],
])
block = np.array([0.0, 0.0])          # block centre

def idw(block, samples, power=2):
    d = np.linalg.norm(samples[:, :2] - block, axis=1)
    if np.any(d < 1e-9):               # block sits on a sample
        return samples[d.argmin(), 2]
    w = 1.0 / d**power
    return np.sum(w * samples[:, 2]) / np.sum(w)

for p in (1, 2, 3):
    print(f"power {p}: {idw(block, samples, p):.3f} % Cu")
# power 1: 0.964 % Cu
# power 2: 1.069 % Cu
# power 3: 1.135 % Cu

Higher powers give more weight to the closest sample (approaching nearest-neighbour). Real estimation adds search ellipses aligned to geology, maximum samples per hole, domain boundaries and top-cutting of outliers.

Common mistakes

Applications

Key takeaways

Going further