[ANN] GeoStats.jl

This topic will be used for future release updates of the GeoStats.jl framework. Past topics can be found at v0.10, v0.11, v0.14, v0.18, v0.24, v0.33 and v0.36.



GeoStats.jl v0.40 is out with revised documentation using Makie.jl recipes, new algorithms for simulation of spatial point patterns, and important improvements in geometric algorithms.

This is the last release with support for Julia v1.6 (LTS), next releases will require Julia v1.9.



  • New Repair transforms for fixing ill-formed meshes and geometries. These repair operations are parameterized with a number (e.g. Repair{0}) that is documented here.
  • Parameterization of geometries meaning that now one can call geometries as segment(t) with t \in [0,1] or quad(u, v) with (u, v) \in [0,1]^2 or hex(u, v, w) with (u, v, w) \in [0,1]^3 to get points in these geometries. The function isparameterized can be used to check if an implementation is available for a given geometry.
  • New JarvisMarch convex hull algorithm for 2D point sets besides the existing GrahamScan algorithm. This algorithm has O(nh) complexity where n is the number of points and h is the number of points in the hull. Compare it with the GrahamScan algorithm, which has O(n^2) complexity and you can see the speed up clearly when the convex hull has a very small number of vertices compared to the original point set (see docs).
  • New merge operation between geometries and meshes.
  • New vertex function to retrieve a single vertex of a Polytope geometry or Domain.
  • New pointify function to extract “vertices” of geometries even when they are not expressed in terms of a finite set of vertices. This function was useful to generalize some transforms and algorithms.
  • New Primitive geometries such as Cone, ConeSurface, Torus (see docs).
  • New MultiGridPath to traverse Grid subtypes in a hierarchical order.
  • New Selinger simplification algorithm to simplify polygons and closed chains (see docs).
  • New Potrace transform to trace closed regions with holes in raster images (see docs).
  • New Detrend transform to remove trends from geospatial data over any domain (see docs).
  • New inhomogeneous PoissonProcess, InhibitionProcess and ClusterProcess (see docs)


  • Improvements to the default triangulation algorithm for polygons, which now performs a couple of repairs to the vertices before actual triangulation. This improvement was implemented to handle real data in agriculture projects at Arpeggeo®.
  • Less memory allocations in Chain algorithms that are now specialized for Ring and Rope subtypes.
  • Various implementations of missing methods for various geometry types such as discretization, sampling, convexhull, etc.
  • hasintersect methods for all 0D, 1D and 2D geometries. This means that we can now easily filter a heterogeneous collection of geometries that intersect any other geometry in 2D space (see docs).
  • Point is now a Geometry subtype. This enabled the generalization of a few algorithms in the stack.
  • Segment is now a Chain which is equivalent to a Polytope{1}.
  • Improvement of IO methods for geometries to display more meaningful names in interactive use.
  • Support for progress logging in all geostatistical simulation solvers.
  • The new documentation now makes extensive use of the visualization stack built with Makie.jl. The visualization stack built with Plots.jl is already in maintenance mode.
  • Various improvements to the GeoTables.jl package that can now load and save all types of geospatial data from disk including shp, geojson, gpkg, kml using pure Julia backends whenever possible. The package also implements fixes to the different backend’s results to improve the experience of end-users who don’t know or wan’t to deal with low-level interfaces.


  • Replace passive rotations from ReferenceFrameRotations.jl by active rotations from Rotations.jl
  • Replace Chain concrete type by an abstract type with two subtypes Ring (for closed chains) and Rope (for open chains). This way the closedness is part of the type, and we can avoid some internal copies of vertices.
  • Replace Collection by GeometrySet and add support for heterogeneous collections of geometries. This means that points, segments, rings, polygons, etc. can be processed together in some algorithms.
  • Refactoring of IntersectionType to a reduced list of types. This code simplification enabled more flexible intersections with meshes and domain types and also improved maintainability.
    Refactoring of Cylinder and CylinderSurface constructors for greater usability.
  • Replace uniquecoords by UniqueCoords transform.


Thanks to all contributors that made this release possible :heart_hands: :julia: :earth_africa:

DianaPat jwscook vickydeka lihua-cat @stla @dorn-gerhard @jackbeagley @cserteGT3 @kylebeggs @ErickChacon @mfsch @longemen3000 @hyrodium conordoherty spaette @eliascarv

Would like to support us? Leave a :star: on GitHub if you didn’t already!


GeoStats.jl v0.42


This release comes with various performance improvements after a complete review of Meshes.jl internals to use static lists of vertices in geometries whenever possible. We reviewed many algorithms, which are now free of unnecessary memory allocations, implemented geometric optimizations, and fixed various bugs found within industrial applications.

The project now uses package extensions from Julia v1.9 to load Makie.jl recipes automatically for end users. This means that all recipe packages (e.g. GeoStatsPlots.jl and GeoStatsViz.jl) are deprecated.

Users can now start their geospatial data science workflows with:

using GeoStats

import GLMakie as Mke # choose a backend

We highly recommend reading the updated Quickstart.


  • New robust estimator of variograms by Cressie & Hawkins (see docs)
  • New CylindricalTrajectory domain to represent wells in geosciences (see docs)
  • New recipes for plotting variograms and varioplanes (see docs)


  • Estimation solvers (Kriging, IDW, LWR) now make use of a consistent set of neighborhood search methods and domain traversal options
  • Estimation (a.k.a. Interpolation) with Unitful.jl objects works with all solvers now, including affine units, which are automatically converted to absolute units (e.g. Celsius → Kelvin)
  • All loss functions from the LossFunctions.jl submodule are reexported by default
  • DensityRationEstimation.jl now loads optimization backends with package extensions
  • Better documentation for our geometric predicates (see docs)


We would like to acknowledge all contributors and supporters of this project. It is been super fun to develop it more, and continuously apply it in industry. We fixed tons of bugs and corner cases these last months with real data, and will continue to do so.

This last week we reached 5k tests in our Meshes.jl submodule alone, and this is evidence of our commitment to provide a robust experience to our users.

Join our community channel if you would like to receive more updates: