Skip to main content

Generate a leaf-level DCEL map from a hierarchical zone tree

Project description

dcel-map-generator

Generate whimsical continent-style maps from a rooted hierarchy of zones. The pipeline produces a leaf-level DCEL planar subdivision, an optional rendered PNG, and a frontend-ready JSON bundle for interactive exploration.

Live Demo | GitHub

Installation

pip install dcel-map-generator

Requires Python 3.11+.

Quick Example

from dcel_builder import generate_dcel

dcel, report = generate_dcel(
    zone_edges_path="zone_edges.json",
    tree_stats_path="zone_tree_stats.json",
    zone_index_path="zone_index.json",
    seed=42,
)

interior_faces = [f for f in dcel.faces if not f.is_outer]
print(f"Generated {len(interior_faces)} leaf territories")

Python API

generate_dcel(...) -> (DCEL, report)

Build a leaf-level DCEL from a rooted zone tree.

generate_frontend_bundle(...) -> (bundle_dict, report)

Build a frontend-ready hierarchy bundle (JSON-serializable dict) that can be consumed by the companion React component @alonso-cancino/dcel-map-frontend.

generate_map_artifacts(...) -> (DCEL, report, tree, zone_index)

Low-level entry point that returns all intermediate artifacts.

All three functions accept the same parameters:

Parameter Type Default Description
zone_edges_path str | Path required Directed [parent, child] edge-list JSON
tree_stats_path str | Path required Sidecar stats JSON (can be {})
zone_index_path str | Path required { "id": "name" } mapping JSON
seed int | None None RNG seed for reproducible maps
resolution int 512 Raster grid size H x H
land_fraction float 0.40 Target fraction of land pixels
noise_exponent float 2.3 Power-law exponent for spectral noise
warp_strength float 0.10 Domain-warp amplitude (fraction of resolution)
split_mode str "contour_guided" Split strategy: contour_guided, field_guided, or seeded
quiet bool False Suppress progress output

CLI

The package installs a dcel-map command:

dcel-map \
  --zone-edges zone_edges.json \
  --tree-stats zone_tree_stats.json \
  --zone-index zone_index.json \
  --output dcel_map.json \
  --render --render-output map.png \
  --frontend-bundle map_bundle.json \
  --seed 42 --validate

Key flags:

Flag Description
--output Path for the output DCEL JSON
--render Render the DCEL to a PNG image
--render-output PNG output path (default: dcel_map.png)
--frontend-bundle Generate a frontend-ready JSON bundle
--seed RNG seed for reproducibility
--resolution Raster grid size (default: 512)
--split-mode contour_guided (default), field_guided, or seeded
--validate Run structural invariant checks before writing
--quiet Suppress progress output

Input Files

The generator expects three JSON files describing a rooted tree of zones:

zone_edges.json — directed parent-child pairs:

[[0, 1], [0, 2], [1, 3], [1, 4]]

zone_index.json — zone ID to display name:

{"0": "World", "1": "North", "2": "South", "3": "Tundra", "4": "Forest"}

zone_tree_stats.json — optional metadata (an empty {} is accepted).

Outputs

  • DCEL JSON — serialized planar subdivision with vertices, half-edges, and faces. Each interior face is tagged with a zone_id from the input tree.
  • PNG render — static map image colored by zone.
  • Frontend bundle — JSON structure with SVG paths, bounding boxes, hierarchy, and zoom thresholds for interactive rendering.

How It Works

The pipeline is tree-first:

  1. Load a rooted hierarchy from the edge-list
  2. Generate a continent mask using spectral noise with domain warping
  3. Recursively partition each parent region among its children using weighted splits
  4. Extract leaf polygons from the raster partition
  5. Build a DCEL planar subdivision

Split modes control how regions are divided:

  • contour_guided — splits along raster contour lines (organic, natural-looking boundaries)
  • field_guided — uses distance/flow fields for partitioning
  • seeded — random Voronoi-like splits

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dcel_map_generator-0.8.0.tar.gz (435.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dcel_map_generator-0.8.0-py3-none-any.whl (28.6 kB view details)

Uploaded Python 3

File details

Details for the file dcel_map_generator-0.8.0.tar.gz.

File metadata

  • Download URL: dcel_map_generator-0.8.0.tar.gz
  • Upload date:
  • Size: 435.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for dcel_map_generator-0.8.0.tar.gz
Algorithm Hash digest
SHA256 cefaa6ffdb3aedf68213a1ce4e267dc05b42aa615f9535f01d37ef80c5de2277
MD5 2bcb06b33e501eeb37f52609a42f67d9
BLAKE2b-256 ee15aa7c4f651438465e4d0607b9500a0414917b034280e1df27242097445164

See more details on using hashes here.

Provenance

The following attestation bundles were made for dcel_map_generator-0.8.0.tar.gz:

Publisher: release.yml on alonso-cancino/map-generator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dcel_map_generator-0.8.0-py3-none-any.whl.

File metadata

File hashes

Hashes for dcel_map_generator-0.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 82485d61eacea3c727274a140b1af201d41292de03c552eeffd41d8d540d6e90
MD5 da193efa6428fa296bb3b45217cad55f
BLAKE2b-256 f2826eac6dd09c3ba9f0184600b0c9c1a3b4c2b7773313c7f4fa1df998d86866

See more details on using hashes here.

Provenance

The following attestation bundles were made for dcel_map_generator-0.8.0-py3-none-any.whl:

Publisher: release.yml on alonso-cancino/map-generator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page