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, GeoStatsPlots

# 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 Quickstart.

Project organization

The project is split into various packages:

GeoStats.jlMain package reexporting full stack of packages for geostatistics.
Meshes.jlComputational geometry and advanced meshing algorithms.
TableTransforms.jlTransforms and pipelines with tabular data.
Variography.jlVariogram estimation and modeling, and related tools.
KrigingEstimators.jlKriging estimation over general geospatial domains.
DensityRatioEstimation.jlHigh-performance density ratio estimation.
PointPatterns.jlGeospatial point pattern analysis and synthesis.
GeoClustering.jlGeostatistical clustering (a.k.a. domaining).
GeoStatsSolvers.jlBuilt-in geostatistical solvers.
GeoStatsBase.jlBase package with core definitions.

Other packages can be installed separately for additional functionality:

GeoStatsViz.jlRecipes for visualization of geospatial data with Makie.jl.
GeoStatsPlots.jlRecipes for visualization of geospatial data with Plots.jl.
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! 😄🌎