56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
"""Validate geometries and make them valid."""
|
|
# TODO: allow for implementations using other than GEOS
|
|
|
|
import shapely
|
|
|
|
__all__ = ["explain_validity", "make_valid"]
|
|
|
|
|
|
def explain_validity(ob):
|
|
"""Explain the validity of the input geometry, if it is invalid.
|
|
|
|
This will describe why the geometry is invalid, and might
|
|
include a location if there is a self-intersection or a
|
|
ring self-intersection.
|
|
|
|
Parameters
|
|
----------
|
|
ob: Geometry
|
|
A shapely geometry object
|
|
|
|
Returns
|
|
-------
|
|
str
|
|
A string describing the reason the geometry is invalid.
|
|
|
|
"""
|
|
return shapely.is_valid_reason(ob)
|
|
|
|
|
|
def make_valid(ob):
|
|
"""Make the input geometry valid according to the GEOS MakeValid algorithm.
|
|
|
|
If the input geometry is already valid, then it will be returned.
|
|
|
|
If the geometry must be split into multiple parts of the same type to be
|
|
made valid, then a multi-part geometry will be returned.
|
|
|
|
If the geometry must be split into multiple parts of different types to be
|
|
made valid, then a GeometryCollection will be returned.
|
|
|
|
Parameters
|
|
----------
|
|
ob : Geometry
|
|
A shapely geometry object which should be made valid. If the object is
|
|
already valid, it will be returned as-is.
|
|
|
|
Returns
|
|
-------
|
|
Geometry
|
|
The input geometry, made valid according to the GEOS MakeValid algorithm.
|
|
|
|
"""
|
|
if ob.is_valid:
|
|
return ob
|
|
return shapely.make_valid(ob)
|