Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
@require_same_crs
def f(sources, targets):
raise RuntimeError("Something went wrong.")
@require_same_crs
def absorb_by_shared_perimeter(sources, targets, relative_threshold=None):
if len(sources) == 0:
return targets
if len(targets) == 0:
raise IndexError("targets must be nonempty")
inters = intersections(sources, targets, area_cutoff=None).buffer(0)
assignment = assign_to_max(inters.length)
if relative_threshold is not None:
under_threshold = (
sources.area / assignment.map(targets.area)
) < relative_threshold
assignment = assignment[under_threshold]
@require_same_crs
def intersections(sources, targets, area_cutoff=None):
"""Computes all of the nonempty intersections between two sets of geometries.
The returned `~geopandas.GeoSeries` will have a MultiIndex, where the geometry
at index *(i, j)* is the intersection of ``sources[i]`` and ``targets[j]``
(if it is not empty).
:param sources: geometries
:type sources: :class:`~geopandas.GeoSeries` or :class:`~geopandas.GeoDataFrame`
:param targets: geometries
:type targets: :class:`~geopandas.GeoSeries` or :class:`~geopandas.GeoDataFrame`
:rtype: :class:`~geopandas.GeoSeries`
:param area_cutoff: (optional) if provided, only return intersections with
area greater than ``area_cutoff``
:type area_cutoff: Number or None
"""
reindexed_sources = get_geometries_with_range_index(sources)
@require_same_crs
def assign(sources, targets):
"""Assign source geometries to targets. A source is assigned to the
target that covers it, or, if no target covers the entire source, the
target that covers the most of its area.
"""
assignment = assign_by_covering(sources, targets)
unassigned = sources[assignment.isna()]
assignments_by_area = assign_by_area(unassigned, targets)
assignment.update(assignments_by_area)
assignment.name = None
return assignment.astype(targets.index.dtype, errors="ignore")