PackageTrack
Sign in Get early access

geo

Geospatial primitives and algorithms

0.33.1 21M downloads/mo #2033 most downloaded on crates.io georust/geo

What this package is like to depend on

Last release 4 months ago

20 Apr 2026

Release timing varies

gaps range from 2 weeks to 8 months

Nearly every release is documented

notes for 86 of 92 stable releases

Nothing withdrawn

no release was ever pulled

12 years old

92 releases · first in 2015

4 releases in the last 12 months

see the full history below

Release timeline

92 releases · Jan 2015 to Apr 2026
2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026
Release Pre-release

Releases

latest 60 of 92
  1. 0.33.1 20 Apr 2026
    Release notes

    prepare for 0.33.1 release

    Open source →
    Release notes
    Open source →
  2. 0.33.0 15 Apr 2026
    Release notes

    prepare for geo v0.33.0 release

    Open source →
    Release notes
    • Polygon validation now uses PreparedGeometry to cache R-tree structures for interior/exterior containment checks, improving validation speed for polygons with many holes.
    • Update i_overlay to 4.4 and enable OGC-compliant polygon extraction for all boolean operations, fixing cases where holes sharing vertices produced invalid geometry.
    • Fix CoordinatePosition for LineString to handle dimensionally collapsed input e.g. LINESTRING(0 0) is treated like POINT(0 0).
    • Fix CoordinatePosition for Triangle to correctly return CoordPos::OnBoundary for coordinate within vertical segment.
    • Split TriangulateDelaunay trait to support Point collections in addition to existing geometries
    • Use Coord as DelaunayTriangulation vertex type
    • Add Voronoi diagram generation functionality
    • Fix Euclidean distance fast path for open LineStrings to consider the last vertex (avoids incorrect LineString-to-LineString distances for separable geometries).
    • Bump float_next_after dependency to 2.0.0
    • Bump geo MSRV to 1.88
    • Bump geo-types to 0.7.19
    • Update earcutr dependency to 0.5.0
    • POSSIBLY BREAKING: Triangles returned by earcut_triangles are now oriented CCW.
    • POSSIBLY BREAKING: earcut_triangles_raw now omits the redundant "closing" coordinate from vertices. It wasn't referenced by the triangle_indices cut by earcutr, but you may notice a different triangulation for a given input.
    • Deprecate StitchTriangulation. Instead convert your triangles to Polygon and use unary_union.
    • Replace earcutr crate with the faster earcut crate.
      • https://github.com/georust/geo/pull/1508
      • The high level TriangulateEarcut::earcut_triangles API hasn't changed, but may return a different triangulation.
      • BREAKING: The low level TriangulateEarcut::earcut_triangles_raw API now groups coordinates [[x0, y0],[x1 y1]]], previously it was flattened: [x0, y1, x1, y1]
      • Replace quadratic algorithms in triangulate_delaunay
      • Add MakeValid trait for (Multi)Polygon repair using the prepair algorithm
      • Use portable source of randomness for kmeans. The output of kmeans might change slightly vs. previous versions, but it should now be consistent across platforms given a particular seed.
      • Update rand dependency to 0.10.0
      • kmeans is now deterministic unless provided a random seed.
    • Add MonotoneChain-backed geometry types
    • Add Substring / SubstringableLine traits for extracting the section of a Line or LineString between two distance- or ratio-along-line bounds. Generic over any metric space implementing InterpolatePoint + Length (Euclidean, Haversine, Geodesic, Rhumb).
    Open source →
  3. 0.32.0 05 Dec 2025
    Release notes

    prepare for geo-0.32.0 release

    Open source →
    Release notes
    • Move PreparedGeometry into a new indexed module intended to provide index-backed geometries. relate::PreparedGeometry has been deprecated.
    • Use an interval tree for faster (Multi)Point in MultiPolygon checks
    • LOF algorithm efficiency improvements due to caching kth distance
    • Add DBSCAN clustering algorithm implementation
    • Add distance_within method with default impl for any geometry that implements Distance, with similar semantics to the PostGIS ST_DWithin function
    • Add fast minimum 1D and 2D Euclidean distance algorithm for linearly separable geometries (#1424)
    • Add ContainsProperly trait to relate and as a standalone operation
    • Add k-means clustering algorithm
    • POSSIBLY BREAKING: minimum_rotated_rect is about 1.3-2x faster, but might return slightly different results.
    • Renamed features use-proj, use-serde to simply proj and serde (removing the use- prefix) and deprecated the old spelling.
    • Update ConcaveHull algorithm with implementation of mapbox/concaveman.
      • BREAKING: The concave_hull method now has no concavity parameter.
      • Add concave_hull_with_options method which requires ConcaveHullOptions as a parameter with concavity and length_threshold options.
      • https://github.com/georust/geo/pull/1442
    • Add Covers trait to relate and as a standalone operation
      • custom implementations for checking Geometries covered by Rect, Triangle, Line, Point, Coord
      • custom implementations for checking Geometries covering Point and MultiPoint
    Open source →
  4. 0.31.0 01 Sep 2025
    Release notes
    • Added: Geometry buffering to "grow" or "shrink" a geometry by creating a buffer whose boundary is the specified offset from the input.
    • BREAKING: BoolOpsNum must now implement GeoFloat, not just GeoNum. In practice, this shouldn't break for any concrete types (like f32, f64).
    • BREAKING: The Simplify, SimplifyVw, and SimplifyVwIdx traits no longer require a borrowed epsilon parameter as these are Copy types
    • Performance: Reduce memory consumption of FrechetDistance calculation.
    • Bump geo MSRV to 1.85
    • Update i_overlay (dependency of BooleanOps and Buffer). This is mostly an internal change. However, if you are using i_overlay directly in your project, you'll notice that the FillRule, LineCap, and LineJoin options, which are re-exported from i_overlay, are now compatible with 4.0 https://github.com/georust/geo/pull/1405
    • Simplify test rustc and libproj version specification in CI
    • Performance: Avoid running through entire iterator to reach last element in outlier_detection when calculating LRD and LOF
    • Add Bearing and Destination trait implementations for Euclidean
    • Add FillRule-configurable boolean operations to BooleanOps trait
    • Fix panic in algorithm::simplify::compute_rdp with one point
    • Fix Clippy warning (surfaced in Rust 1.89) related to lifetime elision
    • Silence Clippy warnings related to old_sweep module
    • Fix false positive convexity check for "star polygon" LineStrings
      • BREAKING: previously, an empty LineString was considered non-convex. This has changed: empty LineStrings are now considered convex, in line with tools such as PostGIS
    • Update to proj 0.31.0 (libproj 9.6.2)
    • Update Intersections with new implementation of the Bentley-Ottmann sweep-line algorithm to efficiently find sparse intersections between groups of lines.
    • Fix is_convex to correctly handle duplicate points
    • Fixgraham_hull to correctly handle duplicate points when on_hull is set to true
    • BREAKING: Break up blanket implementation of Intersects<LineString> into specific traits
    • Added Contains implementation for all remaining geometries.
    Open source →
  5. 0.30.0 24 Mar 2025
    Release notes
    • Bump geo MSRV to 1.81
    • BREAKING: Update proj dependency to 0.29.0
    • BREAKING: FrechetDistance is now defined on the metric space, rather than a method on a Linestring.
      // before (implicitly Euclidean)
      line_string_1.frechet_distance(&line_string_2);
      
      // after
      Euclidean.frechet_distance(&line_string_1, &line_string_2);
      Haversine.frechet_distance(&line_string_1, &line_string_2);
      
    • BREAKING: Densify and Length are now defined on the metric space, rather than a generic method on the geometry.
      // before
      line_string.length::<Euclidean>()
      line_string.densify::<Euclidean>()
      line_string.densify::<Haversine>()
      
      // after
      Euclidean.length(&line_string)
      Euclidean.densify(&line_string)
      Haversine.densify(&line_string)
      
    • Add configurable HaversineMeasure for doing calculations on a custom sphere. Use the Haversine instance for the default Earth radius.
      // before
      Haversine::distance(point1, point2)
      
      // after
      Haversine.distance(point1, point2)
      
      // For custom earth (or non-earth!) radius
      HaversineMeasure::new(3_389_500.0).distance(point1, point2)
      
    • Add configurable GeodesicMeasure for doing calculations on a custom geoid. Use the Geodesic instance for the default Earth geoid.
      // before
      Geodesic::distance(point1, point2)
      
      // after
      Geodesic.distance(point1, point2)
      
      // For custom Earth (or non-earth!) geoids:
      let nad83_flattening = 1. / 298.257222101;
      GeodesicMeasure::new(6_378_137, nad83_flattening).distance(point1, point2)
      
    • Add InterpolateLine to interpolate a point along a line using Euclidean, Haversine, Geodesic, Rhumb metric spaces.
    • Deprecate LineInterpolatePoint which was implicitly Euclidean only.
    • Fix bug in SegmentizeHaversine which caused segments to be unequal lengths
    • Rename triangulate_spade and TriangulateSpade to triangulate_delaunay and TriangulateDelaunay
    • Docs: Fix page location of citation for mean earth radius used in Haversine calculations
    • Docs: Add top-level doc link for InteriorPoint
    • Add Unary Union algorithm for fast union ops on adjacent / overlapping geometries
    • Loosen bounds on RemoveRepeatedPoints trait (num_traits::FromPrimitive isn't required)
    • Fix a math error in some rhumb line calculations
    • Added: Validation trait to check validity of Geometry.
      • https://github.com/georust/geo/pull/1279
      // use in control flow
      if polygon.is_valid() { foo() }
      
      // raise an error if invalid
      polygon.check_validation()?;
      
      // get all validation errors
      let errors = polygon.validation_errors();
      // error implements Display for human readable explanations
      println!("{}", errors[0]);
      
    • Polygons returned by Boolean Ops are now oriented correctly (ccw shell, cw inner rings)
    • Update i_overlay, which is used by the BoolOps trait.
    • BREAKING: Speed up Relate for PreparedGeometry - this did require changing some trait constraints, but they are unlikely to affect you in practice unless you have your own Relate implementation.
    • Add: PreparedGeometry::geometry and into_geometry to get at the inner geometry type.
    • Add: Clone and Debug implementations for PreparedGeometry.
    Open source →
  6. 0.29.3 03 Dec 2024
    Release notes
    Open source →
  7. 0.29.2 15 Nov 2024
    Release notes
    Open source →
  8. 0.29.1 02 Nov 2024
    Release notes
    Open source →
  9. 0.29.0 30 Oct 2024
    Release notes
    • Implement getter methods on AffineTransform to access internal elements.

    • Fix issue in Debug impl for AffineTransform where yoff is shown instead of xoff

    • Polygon in Rect performance improvements.

    • Fix AffineTransform::compose ordering to be conventional - such that the argument is applied after self.

    • Add PreparedGeometry to speed up repeated Relate operations.

    • Implement Frechet distance using linear algorithm to avoid fatal runtime error: stack overflow and improve overall performances.

    • Bump geo MSRV to 1.74 and update CI

    • Add StitchTriangles trait which implements a new kind of combining algorithm for Triangles

    • BREAKING: Remove deprecated Bearing trait

    • Unify various line measurements under new line_measures::{Bearing, Distance, Destination, InterpolatePoint} traits Before:

      use geo::{GeodesicBearing, HaversineBearing, GeodesicDistance, HaversineDistance, EuclideanDistance};
      p1.geodesic_bearing(p2)
      p1.haversine_bearing(p2)
      p1.geodesic_distance(p2)
      p1.haversine_distance(p2)
      p1.euclidean_distance(p2)
      

      After:

      use geo::{Geodesic, Haversine, Euclidean, Bearing, Distance};
      Geodesic::bearing(p1, p2)
      Haversine::bearing(p1, p2)
      Geodesic::distance(p1, p2)
      Haversine::distance(p1, p2)
      Euclidean::distance(p1, p2)
      
    • Deprecated legacy line measure traits in favor of those added in the previous changelog entry:

    • Deprecated HaversineLength, EuclideanLength, RhumbLength, GeodesicLength in favor of new generic Length trait.

      // Before
      line_string.euclidean_length();
      line_string.haversine_length();
      // After
      line_string.length::<Euclidean>();
      line_string.length::<Haversine>();
      
    • Deprecated DensifyHaversine

    • BREAKING: Densify::densify is no longer strictly Euclidean, and now accepts a generic line measure parameter.

      // Before
      line_string.densify();
      line_string.densify_haversine();
      // After
      line_string.densify::<Euclidean>();
      line_string.densify::<Haversine>();
      
      // Additional measures are now supported
      line_string.densify::<Geodesic>();
      line_string.densify::<Rhumb>();
      
    • Added InterpolatePoint::point_at_distance_between for line_measures.

    • Change IntersectionMatrix::is_equal_topo to now consider empty geometries as equal.

    • Fix (LINESTRING EMPTY).contains(LINESTRING EMPTY) and (MULTIPOLYGON EMPTY).contains(MULTIPOINT EMPTY) which previously reported true

    • Improve HasDimensions::dimensions to handle dimensionally collapsed and empty geometries more consistently. A collection (like MultiPolygon) will now have EmptyDimensions when all of its elements have EmptyDimensions.

    • Enable i128 geometry types

    Open source →
  10. 0.28.0 24 Feb 2024
    Release notes
    Open source →
  11. 0.27.0 14 Nov 2023
    Release notes
    Open source →
  12. 0.26.0 13 Jul 2023
    Release notes
    Open source →
  13. 0.25.1 26 Jun 2023
    Release notes
    Open source →
  14. 0.25.0 17 May 2023
    Release notes
    Open source →
  15. 0.24.1 23 Mar 2023
    Release notes
    Open source →
  16. 0.24.0 08 Mar 2023
    Release notes
    Open source →
  17. 0.23.1 06 Dec 2022
    Release notes
    Open source →
  18. 0.23.0 25 Aug 2022
    Release notes
    Open source →
  19. 0.22.1 04 Jul 2022
    Release notes
    Open source →
  20. 0.22.0 24 Jun 2022
    Release notes
    Open source →
  21. 0.21.0 12 Jun 2022
    Release notes
    • Boolean operations for Polygons and MultiPolygons: intersect, union, xor, and difference. Refer trait bool_ops::BooleanOps for more info.

    • POSSIBLY BREAKING: Minimum supported version of Rust (MSRV) is now 1.58

    • BREAKING: rstar version upgraded to 0.9.x

    • POSSIBLY BREAKING: GeoFloat types must now implement num_traits::Signed and num_traits::Bounded. This shouldn't affect you if you are using a standard Geometry<f64> or Geometry<f32> or geo::GeoFloat generically.

    • Speed up Relate and Contains traits for large LineStrings and Polygons by using an RTree to more efficiently inspect edges in our topology graph.

    • Flatten algorithm namespace. For example:

      # Before
      use geo::algorithm::area::Area;
      use geo::algorithm::bounding_rect::BoundingRect;
      # After
      use geo::{Area, BoundingRect};
      
    • Speed up intersects checks by using a preliminary bbox check

    • BREAKING: Remove unneeded reference for *MapCoords* closure parameter.

    • BREAKING: Bump proj dependency to 0.26 which uses PROJ version 9.0

    • rename Translate::translate_inplace -> Translate::translate_in_place

    • MapCoords restructuring: https://github.com/georust/geo/pull/811

      • rename MapCoordsInplace::map_coords_inplace -> MapCoordsInPlace::map_coords_in_place
      • rename TryMapCoordsInplace::try_map_coords_inplace -> TryMapCoordsInPlace::try_map_coords_in_place
      • Consolidate traits TryMapCoords into MapCoords and TryMapCoordsInplace into MapCoordsInPlace
    • Implement ChamberlainDuquetteArea for all geo types.

    • Add {Convert,TryConvert} traits for coordinate value type conversion.

    • BREAKING: MapCoords/MapCoordsInPlace now map Coordinates rather than (x,y) tuples

    • Tidy fast-path distance algorithm

    Open source →
  22. 0.20.1 19 Apr 2022
    Release notes
    Open source →
  23. 0.20.0 16 Apr 2022
    Release notes
    Open source →
  24. 0.19.0 21 Feb 2022
    Release notes
    Open source →
  25. 0.18.0 19 Apr 2021
    Release notes
    Open source →
  26. 0.17.1 25 Feb 2021
    Release notes
    Open source →
  27. 0.17.0 13 Jan 2021
    Release notes
    Open source →
  28. 0.16.0 24 Nov 2020
    Release notes
    Open source →
  29. 0.15.0 07 Oct 2020
    Release notes Open source →
  30. 0.14.2 18 Aug 2020
    Release notes
    Open source →
  31. 0.14.1 11 Jul 2020
    Release notes
    Open source →
  32. 0.14.0 21 Jun 2020
    Release notes
    Open source →
  33. 0.13.0 22 Mar 2020
    Release notes
    Open source →
  34. 0.12.2 26 May 2019
    Release notes
    Open source →
  35. 0.12.1 05 Apr 2019
    Release notes
    Open source →
  36. 0.12.0 17 Feb 2019
    Release notes
    Open source →
  37. 0.11.0 03 Dec 2018
    Release notes
    Open source →
  38. 0.10.3 23 Nov 2018
    Release notes Open source →
  39. 0.10.2 11 Oct 2018
    Release notes
    Open source →
  40. 0.10.1 06 Oct 2018
    Release notes
    Open source →
  41. 0.10.0 16 Aug 2018
    Release notes
    Open source →
  42. 0.9.1 19 May 2018
    Release notes
    Open source →
  43. 0.9.0 15 May 2018
    Release notes
    Open source →
  44. 0.8.3 03 May 2018
    Release notes
    Open source →
  45. 0.8.2 19 Apr 2018
    Release notes
    Open source →
  46. 0.8.1 18 Apr 2018
    Release notes
    Open source →
  47. 0.8.0 13 Apr 2018
    Release notes
    Open source →
  48. 0.7.4 12 Mar 2018
    Release notes Open source →
  49. 0.7.3 11 Mar 2018
    Release notes Open source →
  50. 0.7.2 04 Mar 2018
    Release notes Open source →
  51. 0.7.1 04 Feb 2018
    Release notes Open source →
  52. 0.7.0 27 Jan 2018
    Release notes Open source →
  53. 0.6.3 24 Sep 2017
    Release notes Open source →
  54. 0.6.2 16 Sep 2017
    Release notes Open source →
  55. 0.6.1 10 Sep 2017
    Release notes Open source →
  56. 0.6.0 05 Sep 2017
    Release notes Open source →
  57. 0.5.0 30 Aug 2017
    Release notes Open source →
  58. 0.4.13 14 Aug 2017
    Release notes Open source →
  59. 0.4.12 11 Aug 2017
    Release notes Open source →
  60. 0.4.11 08 Aug 2017
    Release notes Open source →

Every package, every release, already written down.

The archive is open and free. Watching your own project is what we are building next.

Browse the archive