An extensible framework for high-performance geostatistics in Julia


Cite as ↗

Project goals

  • Design a comprehensive framework for geostatistics (or spatial statistics) in a modern programming language.
  • Address the lack of a platform for scientific comparison of different geostatistical algorithms in the literature.
  • Exploit modern hardware aggressively, including GPUs and computer clusters.
  • Educate people outside of the field about the existence of geostatistics.

Related packages

  • GaussianProcesses.jl — Gaussian processes (the method) and Simple Kriging are essentially two names for the same concept. The derivation of Kriging estimators, however; does not require distributional assumptions. It is a beautiful coincidence that for multivariate Gaussian distributions, Simple Kriging gives the conditional expectation. Matheron and other important geostatisticians have generalized Gaussian processes to more general random fields with locally-varying mean and for situations where the mean is unknown. GeoStats.jl includes Gaussian processes as a special case as well as other more practical Kriging variants, see the Gaussian processes example.

  • MLKernels.jl — Spatial structure can be represented in many different forms: covariance, variogram, correlogram, etc. Variograms are more general than covariance kernels according to the intrinsic stationary property. This means that there are variogram models with no covariance counterpart. Furthermore, empirical variograms can be easily estimated from the data (in various directions) with an efficient procedure. GeoStats.jl treats variograms as first-class objects, see the Variogram modeling example.

  • Interpolations.jl — Kriging and Spline interpolation have different purposes, yet these two methods are sometimes listed as competing alternatives. Kriging estimation is about minimizing variance (or estimation error), whereas Spline interpolation is about forcedly smooth estimators derived for computer visualization. Kriging is a generalization of Splines in which one has the freedom to customize spatial structure based on data. Besides the estimate itself, Kriging also provides the variance map as a function of knots configuration.


Get the latest stable release with Julia's package manager:

] add GeoStats

Project organization

The project is split into various packages:

Package Description
GeoStats.jl Main package containing Kriging-based solvers, and other geostatistical tools.
GeoStatsImages.jl Training images for multiple-point geostatistical simulation.
GslibIO.jl Utilities to read/write extended GSLIB files.
Variography.jl Variogram estimation and modeling, and related tools.
KrigingEstimators.jl High-performance implementations of Kriging estimators.
GeoStatsBase.jl Base package containing problem and solution specifications (for developers).

The main package (i.e. GeoStats.jl) is self-contained, and provides high-performance Kriging-based estimation/simulation algorithms over arbitrary domains. Other packages can be installed from the list above for additional functionality.

Problems and solvers

Solvers for geostatistical problems can be installed separately depending on the application. They are automatically integrated with GeoStats.jl thanks to Julia's multiple dispatch features.

Estimation problems

Solver Description Build Coverage References
Kriging Kriging (SK, OK, UK, EDK) Matheron 1971
InvDistWeight Inverse distance weighting Shepard 1968
LocalWeightRegress Locally weighted regression Cleveland 1979

Simulation problems

All simulation solvers can generate realizations in parallel unless otherwise noted.

Solver Description Build Coverage References
DirectGaussSim Direct Gaussian simulation Alabert 1987
SeqGaussSim Sequential Gaussian simulation Gómez-Hernández 1993
SpecGaussSim Spectral Gaussian simulation Gutjahr 1997
TuringPat Turing patterns Turing 1952
ImgQuilt Fast image quilting Hoffimann 2017
StratSim Stratigraphy simulation Hoffimann 2018
CookieCutter Cookie-cutter scheme Begg 1992

If you are a developer and your solver is not listed above, please open a pull request and we will be happy to review and add it to the list. Please check the developer guide in the documentation below for instructions on how to write your own solvers.


  • STABLEmost recently tagged version of the documentation.
  • LATESTin-development version of the documentation.


A set of Jupyter notebooks demonstrating the current functionality of the package is available in GeoStatsTutorials.

Below is a quick preview of the high-level API. For the full example, please check this notebook.

using GeoStats
using Plots

# data.csv:
#    x,    y,       station, precipitation
# 25.0, 25.0,     palo alto,           1.0
# 50.0, 75.0,  redwood city,           0.0
# 75.0, 50.0, mountain view,           1.0

# read spreadsheet file containing spatial data
sdata = readgeotable("data.csv", coordnames=[:x,:y])

# define spatial domain (e.g. regular grid, point collection)
sdomain = RegularGrid{Float64}(100, 100)

# define estimation problem for any data column(s) (e.g. :precipitation)
problem = EstimationProblem(sdata, sdomain, :precipitation)

# choose a solver from the list of solvers
solver = Kriging(
  :precipitation => (variogram=GaussianVariogram(range=35.),)

# solve the problem
solution = solve(problem, solver)

# plot the solution
contourf(solution, contour_labels=true)


Contributing and supporting

Contributions are very welcome, as are feature requests and suggestions. Please open an issue if you encounter any problems. We have written instructions to help you with the process.

If you have questions, don't hesitate to ask. Join our community in our gitter channel. We are always willing to help.

GeoStats.jl was developed as part of academic research. It will always be open source and free of charge. If you would like to help support the project, please star the repository and share it with your colleagues.


If you find GeoStats.jl useful in your work, please consider citing it:


  title={GeoStats.jl – High-performance geostatistics in Julia},
  author={Hoffimann, Júlio},
  journal={Journal of Open Source Software},
  publisher={The Open Journal},

Used at

First Commit


Last Touched

6 days ago


689 commits