from itertools import chain, pairwise import random import geopandas as gpd import matplotlib.colors as mcolors import matplotlib.pyplot as plt from momepy import gdf_to_nx import networkx as nx from more_itertools import batched from shapely import LineString, MultiPoint, Polygon from shapely.ops import split from shapely.plotting import plot_polygon coordinates = [ (50.0, 50.0, 100.0, 50.0), (70.0, 50.0, 75.0, 40.0, 80.0, 50.0), (72.5, 45.0, 77.5, 45.0) ] points = MultiPoint(list(batched(chain.from_iterable(coordinates), 2))) lines = [ line for coo in coordinates for pop in pairwise(batched(coo, 2)) for gc in [split(LineString(pop), points)] for line in gc.geoms ] G = gdf_to_nx( gpd.GeoDataFrame(geometry=lines), multigraph=False, approach="primal" ) fig, ax = plt.subplots(figsize=(16, 4)) pos = dict(zip(G.nodes, G.nodes)) nx.draw(G, pos=pos, with_labels=True, ax=ax,) random.seed(4) colors = list(mcolors.CSS4_COLORS) colors = ["lawngreen", "lightcoral", "lightcyan"] cycles = [ [ tuple(chain.from_iterable(pair)) for pair in pairwise(cyc) ] for cyc in nx.chordless_cycles(G) for cyc in [cyc + [cyc[0]]] ] cycles = nx.chordless_cycles(G) for cyc in cycles: plot_polygon(Polygon(cyc), add_points=False, facecolor=random.choice(colors), color="k", ax=ax)