Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def assign_by_covering(sources, targets):
indexed_sources = IndexedGeometries(sources)
return indexed_sources.assign(targets)
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)
reindexed_targets = get_geometries_with_range_index(targets)
spatially_indexed_sources = IndexedGeometries(reindexed_sources)
records = [
# Flip i, j to j, i so that the index is ["source", "target"]
(sources.index[j], targets.index[i], geometry)
for i, j, geometry in spatially_indexed_sources.enumerate_intersections(
reindexed_targets
)
]
df = GeoDataFrame.from_records(records, columns=["source", "target", "geometry"])
geometries = df.set_index(["source", "target"]).geometry
geometries.sort_index(inplace=True)
geometries.crs = sources.crs
if area_cutoff is not None:
geometries = geometries[geometries.area > area_cutoff]
def iter_adjacencies(geometries):
indexed = IndexedGeometries(geometries)
for i, geometry in indexed.geometries.items():
possible = indexed.query(geometry)
possible = possible[possible.index > i]
inters = possible.intersection(geometry)
inters = inters[-inters.is_empty]
for j, inter in inters.items():
yield (i, j), inter