GenPlanner is a territorial zoning engine for generating spatially consistent territorial zones (and optionally blocks) from polygonal territories.
It combines:
ratio-based functional zoning
adjacency constraints via relation matrices
optional fixed spatial anchors
integration of existing zones
road-based splitting
MILP-based multi-feature allocation
geometric optimization via Voronoi splitting
Quickstart¶
Installation¶
pip install genplanner
Minimal example¶
import geopandas as gpd
from genplanner import GenPlanner
from genplanner.zones import basic_func_zone
territory = gpd.read_file("territory.geojson")
gp = GenPlanner(features_gdf=territory)
zones, roads = gp.features2terr_zones(
funczone=basic_func_zone
)
Generate blocks¶
blocks, roads = gp.features2terr_zones2blocks(
funczone=basic_func_zone
)
With relation constraints¶
zones, roads = gp.features2terr_zones(
relation_matrix="default"
)
With fixed anchor points¶
from shapely.geometry import Point
from genplanner.zones import default_terr_zones
fix_points = gpd.GeoDataFrame(
{
"fixed_zone": [default_terr_zones.residential_terr],
"geometry": [Point(30.1, 59.9)],
},
crs=territory.crs,
)
zones, roads = gp.features2terr_zones(
terr_zones_fix_points=fix_points
)
Documentation¶
Design philosophy¶
GenPlanner is built around a small set of composable primitives:
Zoning Primitives define what spatial program should be achieved.
Zone Relations define which zones may or may not be adjacent.
GenPlanner orchestrates preprocessing, validation, optimization and splitting.
Errors define a strict, explicit failure model.
The goal is deterministic, reproducible zoning with clear constraints and explicit spatial control.