Skip to main content
Join the official 2019 Python Developers SurveyStart the survey!

GEOS wrapped in numpy ufuncs

Project description

Documentation Status Travis CI status Appveyor CI status PyPI

PyGEOS is a C/Python library with vectorized geometry functions. The geometry operations are done in the open-source geometry library GEOS. PyGEOS wraps these operations in NumPy ufuncs providing a performance improvement when operating on arrays of geometries.

Why ufuncs?

A universal function (or ufunc for short) is a function that operates on n-dimensional arrays in an element-by-element fashion, supporting array broadcasting. The for-loops that are involved are fully implemented in C diminishing the overhead of the Python interpreter.

The Geometry object

The pygeos.Geometry object is a container of the actual GEOSGeometry object. A C pointer to this object is stored in a static attribute of the Geometry object. This keeps the python interpreter out of the ufunc inner loop. The Geometry object keeps track of the underlying GEOSGeometry and allows the python garbage collector to free memory when it is not used anymore.

Geometry objects are immutable. Construct them as follows:

>>> from pygeos import Geometry

>>> geometry = Geometry.from_wkt("POINT (5.2 52.1)")

Or using one of the provided (vectorized) functions:

>>> from pygeos import points

>>> point = points(5.2, 52.1)


Compare an grid of points with a polygon:

>>> geoms = points(*np.indices((4, 4)))
>>> polygon = box(0, 0, 2, 2)

>>> contains(polygon, geoms)

  array([[False, False, False, False],
         [False,  True, False, False],
         [False, False, False, False],
         [False, False, False, False]])

Compute the area of all possible intersections of two lists of polygons:

>>> from pygeos import box, area, intersection

>>> polygons_x = box(range(5), 0, range(10, 15), 10)
>>> polygons_y = box(0, range(5), 10, range(10, 15))

>>> area(intersection(polygons_x[:, np.newaxis], polygons_y[np.newaxis, :]))

array([[100.,  90.,  80.,  70.,  60.],
     [ 90.,  81.,  72.,  63.,  54.],
     [ 80.,  72.,  64.,  56.,  48.],
     [ 70.,  63.,  56.,  49.,  42.],
     [ 60.,  54.,  48.,  42.,  36.]])

Installation using conda

Pygeos requires the presence of NumPy and GEOS >= 3.5. It is recommended to install these using Anaconda from the conda-forge channel (which provides pre-compiled binaries):

$ conda install numpy geos pygeos --channel conda-forge

Installation using system GEOS

On Linux:

$ sudo apt install libgeos-dev


$ brew install geos

Make sure geos-config is available from you shell; append PATH if necessary:

$ export PATH=$PATH:/path/to/dir/having/geos-config
$ pip install pygeos

Installation for developers

Ensure you have numpy and GEOS installed (either using conda or using system GEOS, see above).

Clone the package:

$ git clone

Install it using pip:

$ pip install -e .[test]

Run the unittests:

$ pytest

If GEOS is installed, normally the geos-config command line utility will be available, and pip install will find GEOS automatically. But if needed, you can specify where PyGEOS should look for the GEOS library before installing it:

On Linux / OSX:

$ export GEOS_INCLUDE_PATH=$CONDA_PREFIX/Library/include

On windows (assuming you are in a Visual C++ shell):

$ set GEOS_INCLUDE_PATH=%CONDA_PREFIX%\Library\include

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for pygeos, version 0.5
Filename, size File type Python version Upload date Hashes
Filename, size pygeos-0.5.tar.gz (49.7 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page