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.9.0.tar.gz (442.4 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.9.0-py3-none-any.whl (32.1 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for dcel_map_generator-0.9.0.tar.gz
Algorithm Hash digest
SHA256 eb03cacb99cd39864f02e9cd4890ce94f45889f421c8797096465a9454f2f54a
MD5 234d2a18b14532bcc19606738f75505e
BLAKE2b-256 b02e874571693da58ea3952faa248dd396eb075da1cd710fbb9c6b98152abd27

See more details on using hashes here.

Provenance

The following attestation bundles were made for dcel_map_generator-0.9.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.9.0-py3-none-any.whl.

File metadata

File hashes

Hashes for dcel_map_generator-0.9.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9c8e2dc6af6accc8c3f66e52a753dd2709dd04cc22f66daff4bef22f114f75bb
MD5 c1774f92a5eafb220409186fc2bd6689
BLAKE2b-256 c90eda01311f69f96e9ebbf2e44f238c99b3df4715c3429b9a4e939e1311678d

See more details on using hashes here.

Provenance

The following attestation bundles were made for dcel_map_generator-0.9.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