Source code for aequilibrae.project.network.osm.model_area_gridding
# Inspired by https://www.matecdev.com/posts/shapely-polygon-gridding.html
from math import ceil
import geopandas as gpd
import numpy as np
from shapely.geometry import Polygon
[docs]
def geometry_grid(model_area, srid) -> gpd.GeoDataFrame:
minx, miny, maxx, maxy = model_area.bounds
# Some rough heuristic to get the number of points per sub-polygon in the 2 digits range
subd = ceil((len(model_area.exterior.coords) / 32) ** 0.5)
dx = (maxx - minx) / subd
dy = (maxy - miny) / subd
elements = []
x1 = minx
for i in range(subd):
j1 = miny
for j in range(subd):
elements.append(Polygon([[x1, j1], [x1, j1 + dy], [x1 + dx, j1 + dy], [x1 + dx, j1]]))
j1 += dy
x1 += dx
gdf = gpd.GeoDataFrame({"id": np.arange(len(elements))}, geometry=elements, crs=srid)
return gdf.clip(model_area)