GEOS Ruby Bindings via FFI


  • the ffi extension for Ruby.

  • GEOS version 3.3.0 or greater. GEOS 3.2.2 and below will work to an extent, but some features and methods will be disabled or missing.

Ruby versions known to work according to travis-ci and local testing:

  • Ruby MRI 1.9.3, 2.0+, 2.1+, 2.2+

  • Ruby MRI 1.8.7 works but as Ruby 1.8 is no longer being maintained, there's no guarantee this will continue in the future and is therefore no longer being tested with the same rigour as more modern versions of Ruby.

  • Rubinius 2

  • JRuby 1.6+, with the exception of versions of JRuby prior to 1.6.3 as per below. This includes both 1.8 and 1.9 modes.

JRuby Notes

Note that versions of JRuby prior to version 1.6.3 have problems in their ffi implementation when dealing with AutoPointers that can lead to segfaults during garbage collection.


ffi-geos supports all of the features found in the binary SWIG-based GEOS Ruby bindings along with the following enhancements and additions:

  • support for prepared geometries via Geos::Geometry#to_prepared.

  • an implementation of Geos::STRtree.

  • use of GEOS's re-entrant interface for thread-safety.

  • new options for controlling WKT output like trim and rounding precision.

  • many new methods on geometry types. See below for a list.

  • Geos::LineString, Geos::LinearRing, Geos::CoordinateSequence and Geos::GeometryCollection and its descendants are now enumerable.

  • The aforementioned enumerable classes also define some additional Array-like methods such as [] and slice.

  • Geos::WkbWriter and Geos::WktWriter have had their constructors extended to allow for settings via an options Hash.

  • Geos::WkbWriter#write, Geos::WkbWriter#write_hex and Geos::WktWriter#write have been enhanced to take options Hashes allowing you to set per-write settings.

  • Geos::BufferParams class that allows for more extensive Geos::Geometry#buffer options.

  • Geos::PreparedGeometry class and Geos::Geometry#to_prepared method to allow for prepared geometries and more efficient relationship testing.

  • Geos::Interrupt module that allows you to interrupt certain calls to the GEOS library and perform other work or cancel GEOS calls outright. The interruption API was added in GEOS 3.4.0.

New Methods and Additions (not exhaustive)

  • SRIDs can be copied on many operations. GEOS doesn't usually copy SRIDs around, but for the sake of convenience, we do. The default behaviour for SRID copying can be set via the Geos.srid_copy_policy= method. The default behaviour is to use 0 values as before, but you can optionally allow for copying in either a lenient or a strict sort of manner. See the documentation for Geos.srid_copy_policy= for details.

  • There are many, many new methods added all over the place. Pretty much the entire GEOS C API is represented in ffi-geos along with all sorts of useful convenience methods and geometry conversion and manipulation methods.

  • *NEW IN ffi-geos 1.0.0* – all errors thrown by ffi-geos are now instances of Geos::Error or subclasses thereof. Geos::Error itself is a descendant of RuntimeError as is the case with the native Geos extension. This means that code like rescue RuntimeError should still work but you can now further capture more precise error types by capturing errors like Geos::Error, Geos::ParseError, etc.

  • *NEW IN ffi-geos 1.0.0* – new methods for Geom::Geometry#voronoi_diagram, Geos::MultiLineString#closed? and Geos::Geometry#clip_by_rect when using GEOS 3.5.0+.


  • Daniel Azuma for the testing and JRuby help.

  • Christopher Meiklejohn for the bug reporting and PreparedGeometry fix.

  • Wayne Meissner for some help with some ffi issues.

  • Charlie Savage for the original SWIG-based GEOS bindings implementation and some fixes for MinGW.

  • Peter M. Goldstein for some JRuby fixes.


This gem is licensed under an MIT-style license. See the MIT-LICENSE file for details.