[ANN] GeoStats.jl - Geospatial Data Science and Geostatistical Modeling in Julia

Quick update:

We are now using uv texture mapping in Makie.jl to visualize “rasters”, which gives an additional 2.5x speedup. If you need this speed, please update your environment.

1 Like

If you want faster upsampling, look into NNlib. The julia native bilinear upsampling there is parallelized for cpu and gpu and supports 1, 2 & 3D data and is as fast as it can probably get.

1 Like

Relevant update:

1 Like

GeoStats.jl v0.66

Refactored Slice transform and other minor fixes:

1 Like

Two job opportunities:

1 Like

I’m finishing a Masters in Geophysics that is in the geospatial realm (my research is in geodesy). Maybe by the end of my degree I’ll qualify as for being “proficient in high-performance programming languages” because as of now, I’m firmly between novice and adequate. lol

Good luck with the search! :+1:

2 Likes

GeoStats.jl v0.68

New discretization and refinement methods, and various other small improvements and fixes.

  • New MaxLengthDiscretization to discretize geometries into subgeometries of maximum length. This is used in viz of geodesic geometries.

    Example

    If you create a Segment from two points with LatLon coordinates, and call viz you will see it is “curved”. Below you can see this with random segments:

    segs = rand(Segment, 100, crs=LatLon)
    
    viz(segs)
    

    image
    Works for various other geometries of course, including all geometries with parametric dimension 1 (e.g. Rings of polygons).

  • The TriRefinement now supports a predicate function for adaptive refinement. For instance, you can refine all elements with area greater than a given threshold TriRefinement(e -> area(e) > 1km^2).

  • The georef function now supports a lenunit option besides the crs to specify the length units of some CRS from raw unitless columns.

  • All Grid subtypes now support CRS (e.g., RectilinearGrid, StructuredGrid, RegularGrid, CartesianGrid). The CartesianGrid is now an alias to a RegularGrid with Cartesian CRS. If you need to convert back and forth between LatLon and Projected coordinates, prefer RegularGrid in your workflows.

We are seeing more and more articles in applied sciences citing the software. Thank you :juliaheartpulsing:

4 Likes

GeoStats.jl v0.71

This release introduces transiogram functions, which measure the transition probability between categorical values at any given distance along any given direction. Transiograms are used to simulate Markov processes in more than one dimension (e.g. space).

Various models are implemented, including the MatrixExponentialTransiogram model by Carle et al and the PiecewiseLinearTransiogram model by Li et al.

Below is an example where transition probabilities are estimated for 4 categorical values DebrisFlow, Floodplain, Overbank and Channel along the vertical direction.

Another function that was introduced recently is eachvertex, which can be used to iterate over the vertices of a polytope (polygon, segment, etc.) or mesh (e.g. grid) without memory allocation:

for v1 in eachvertex(g1)
  for v2 in eachvertex(g2)
    ...
  end
end

Various other performance optimizations related to eachvertex were implemented to speed things up and reduce the memory usage of specific algorithms.

6 Likes

Appreciate it if you could share your thoughts in our 2025 survey:

1 Like

GeoStats.jl v0.73

New features

Multivariate interpolation with CoKriging that exploits the cross-variable correlation at any lag distance besides the auto-correlation. We support any number of variables, as well as any geostatistical function, including variograms, covariances and transiograms.

CoKriging interpolation is quite useful when a subset of one or more variables are under-sampled, and another subset of densely-sampled variables are linearly correlated to the first subset. The cross-variable correlation can greatly improve the interpolation of the under-sampled variables. Below is an example where we interpolate 5 variables jointly along a well trajectory:

Please reach out in our #geostats.jl channel if you need help setting up multivariate interpolation.

Anisotropic variogram models can now be constructed with ranges and rotation. There is no need to create a MetricBall manually:

GaussianVariogram(ranges = (1, 2, 3), rotation=I)

Breaking changes

We took this opportunity to review and optimize the Interpolate and InterpolateNeighbors transforms. Their syntax was simplified to

Interpolate(domain; model=model, ...)

and we no longer support the complex syntax with variable names. This is important now that we have multivariate interpolation routines. If you pass a geotable with N>1 columns to a univariate interpolation model, you will get an assertion error. Please Select(variable) before Interpolate or InterpolateNeighbors in this case.

The variants InterpolateMissing and InterpolateNaN were removed in favor of more explicit pipelines with DropMissing and DropNaN respectively.

5 Likes

We’ve updated the official documentation of the project to include more examples, and cover more undocumented features:

It is far from complete coverage, but already an improvement. We will try to find the time to work on it again during the year, in between our scheduled deliverables.

7 Likes

GeoStats.jl v0.74

New features

Multivariate Gaussian simulation

Full support for multivariate Gaussian simulation, dispatched in the presence of multivariate variogram, covariance or transiogram functions:

# joint covariance model between 2 variables with 0.8 correlation
fun = [1.0 0.8; 0.8 1.0] * SphericalCovariance(range=600)

# Gaussian process with multivariate geostatistical function
proc = GaussianProcess(fun)

# load unstructured mesh from disk
mesh = GeoIO.load("norne.vtu").geometry

# simulate 2 variables jointly over the mesh
real = rand(proc, mesh)

Similar to the previous post about CoKriging, multivariate Gaussian simulation (a.k.a. Gaussian cosimulation) can be useful in contexts where a subset of variables is under-sampled. The main advantage of geostatistical simulation compared to geostatistical interpolation is the reproduction of local features, which are smoothed out by interpolation routines.

Better plotting of geostatistical functions

New funplot and surfplot functions that generalize and replace old plot recipes for multivariate, anisotropic geostatistical functions:

fun = [1.0 0.8; 0.8 1.0] * SphericalCovariance(ranges=(600,300,200))

funplot(fun)

Improved heuristics for simulation methods

Alternative simulation methods are chosen much more carefully now based on traits over the type of domain, data and process. If you are using random fields in your work, we highly recommend the update to v0.74.

Breaking changes

The rand interface for geospatial stochastic processes is much simpler now:

reals = rand(process, domain, [n]; data=nothing, ...)

It generates n realizations of the stochastic process over the domain. The data is a GeoTable with pre-existing values over the domain or nothing. All pre-existing values are honored by the simulation.

Finally, the varioplot, transioplot and planeplot functions were removed in favor of the more general funplot and surfplot.

Frequently asked questions (FAQ)

I’ve started a FAQ in our official documentation:

If you have suggestions of questions for our FAQ, please let me know or feel free to open a pull request. Happy to review and merge.