An extensible framework for high-performance geostatistics in Julia.


In many fields of science, such as mining engineering, hydrogeology, petroleum engineering, and environmental sciences, traditional statistical methods fail to provide unbiased estimates of resources due to the presence of geospatial correlation. Geostatistics (a.k.a. geospatial statistics) is the branch of statistics developed to overcome this limitation. Particularly, it is the branch that takes geospatial coordinates of data into account.

GeoStats.jl is an attempt to bring together bleeding-edge research in the geostatistics community into a comprehensive framework for geospatial modeling, as well as to empower researchers and practioners with a toolkit for fast assessment of different modeling approaches.

The design of this project is the result of many years developing geostatistical software. I hope that it can serve to promote more collaboration between geostatisticians around the globe and to standardize this incredible field of research. If you would like to help support the project, please star the repository STARS and share it with your colleagues. If you would like to extend the framework with new geostatistical solvers, please check the Developer guide.


If you find this project 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},

We ❤ to see our list of publications growing.


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

] add GeoStats


A set of Pluto notebooks demonstrating the current functionality of the project is available in GeoStatsTutorials with an accompanying series of videos:

Quick example

Below is a quick preview of the high-level API:

using GeoStats
using Plots

# attribute table
table = (Z=[1.,0.,1.],)

# coordinates for each row
coord = [(25.,25.), (50.,75.), (75.,50.)]

# georeference data
𝒟 = georef(table, coord)

# estimation domain
𝒢 = CartesianGrid(100, 100)

# estimation problem
problem = EstimationProblem(𝒟, 𝒢, :Z)

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

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

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

For a more detailed example, please consult the Basic workflow section of the documentation.

Project organization

The project is split into various packages:

GeoStats.jlMain package reexporting full stack of packages for geostatistics.
Variography.jlVariogram estimation and modeling, and related tools.
KrigingEstimators.jlHigh-performance implementations of Kriging estimators.
PointPatterns.jlGeospatial point pattern analysis and synthesis.
GeoClustering.jlGeostatistical clustering (a.k.a. domaining).
GeoEstimation.jlBuilt-in solvers for geostatistical estimation.
GeoSimulation.jlBuilt-in solvers for geostatistical simulation.
GeoLearning.jlBuilt-in solvers for geostatistical learning.
GeoStatsBase.jlBase package containing core definitions.

Other packages can be installed separately for additional functionality:

GeoStatsImages.jlTraining images for multiple-point simulation.
GeoTables.jl(Down)load geospatial tables in various formats.
DrillHoles.jlDesurvey/composite drillhole data.
GslibIO.jlLoad/save (extended) GSLIB files.

Besides the packages above, the project can be extended with solver packages.

Community channels

We invite you to join our community channels. There you will meet other fellow geostatisticians who like to code. We are very friendly, come say hi! 😄🌎