This exception is a really annoying error I get occasionally when
entering sometimes invalid shapely.geometry
objects into
shapely
functions:
GEOSException: IllegalArgumentException:
Argument must be Polygonal or LinearRing
I solved this by uninstalling pygeos
and installing Rtree
(we use Rtree==1.0.1
):
$ pip uninstall pygeos
$ pip install Rtree
Downsides of substituting Rtree for pygeos
Rtree is not a complete replacement for pygeos because the
geopandas spatial index
does not use the same argument format for gdf.sindex.nearest()
queries.
This behavior is documented on the geopandas SpatialIndex page:
nearest
currently only works with PyGEOS >= 0.10.Note that if PyGEOS is not available, geopandas will use rtree for the spatial index, where nearest has a different function signature to temporarily preserve existing functionality. See the documentation of
rtree.index.Index.nearest()
for the details on the rtree-based implementation.
Documentation on the rtree.index.Index.nearest()
argument formats can be
found on the rtree readthedocs.
Syntax difference with rtree's nearest()
While the pygeos nearest()
function takes in shapely.geometry
objects,
the Rtree nearest()
function only takes in arrays of coordinates:
from rtree import index
idx = index.Index()
idx.insert(4321, (34.37, 26.73, 49.37, 41.73), obj=42)
hits = idx.nearest((0, 0, 10, 10), 3, objects=True)