Source code for pyiem.geom_util
"""Geometry utility functions."""
# third party
from shapely.geometry import (
GeometryCollection,
MultiLineString,
MultiPolygon,
Point,
)
from shapely.ops import split
# Local
from pyiem.util import LOG
[docs]
def rhs_split(poly, splitter):
"""Provide the Right Hand Side Polygon associated with a split operation.
Args:
poly (shapely.geometry.Polygon): polygon to split.
splitter (shapely.geometry.LineString): linestring to spliy by.
Returns:
shapely.geometry.Polygon
"""
# compute the part of the splitter that intersects the polygon
split_intersection = splitter.intersection(poly)
# May be a MultiLineString
if isinstance(split_intersection, (MultiLineString, GeometryCollection)):
# Just take the first one, it should not matter as long as it is
# not a Point object
if isinstance(split_intersection.geoms[0], Point):
split_intersection = split_intersection.geoms[1]
else:
split_intersection = split_intersection.geoms[0]
# do the splitting
geomcollect = split(poly, splitter)
# If we got more than two polygons, we likely can cull some small cruft
if len(geomcollect.geoms) > 2:
geomcollect = MultiPolygon(
[geo for geo in geomcollect.geoms if geo.area > 0.1]
)
if len(geomcollect.geoms) > 2:
LOG.warning("intersection found more than 2 polys, failing")
return None
if len(geomcollect.geoms) == 1:
return geomcollect.geoms[0]
(polya, polyb) = geomcollect.geoms[0], geomcollect.geoms[1]
# We project two points along the splitter intersection back onto polya
pt0 = Point(split_intersection.coords[0])
pt1 = Point(split_intersection.coords[1])
start_dist = polya.exterior.project(pt0)
end_dist = polya.exterior.project(pt1)
return polya if end_dist > start_dist else polyb