{"name": "PlanX", "package_name": "planx", "version": "3.6.0", "experimental": false, "qgis_min": "3.22.0", "qgis_max": "4.99.0", "downloads": 53, "uploaded_by": "geo140195philo", "upload_datetime": "2026-07-09T08:41:37.759887", "changelog": "## [3.6.0] - 2026-07-09\r\n\r\nThe Batch Plan Auditor closes the loop (50 algorithms, 15 groups).\r\n\r\n### Added\r\n- **Batch Plan Auditor** (Reporting group) \u2014 the whole standard battery in one run: network + demand + amenities + land use + facilities + greens in, and it chains the 15-minute access score, walkability audit, land-use balance, facility adequacy, green-space access and access equity; every score lands in one scenario snapshot JSON (ready for Scenario Compare A/B) plus an optional one-file Plan Performance Report. Each part optional; fully headless and model-designer friendly.\r\n- **Plan Dashboard**: Plan Performance Index **history sparkline** (grows with every saved snapshot) and an **Audit\u2026** button opening the Batch Plan Auditor.\r\n- Scenario metric registry gains the auditor keys (walkability mean, low-walk share, weakest green coverage, access Gini) \u2014 direction-aware in comparisons.\r\n- `docs/METHODS.md` \u2014 the method, formula and primary source of every tool group.\r\n\r\n### Testing\r\n- Engine unit checks grown to **350**; end-to-end assertions to **274**; dashboard harness to **24 checks** \u2014 on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [3.5.0] - 2026-07-09\r\n\r\nUrban Growth: change accounting, growth simulation and the sprawl scorecard (49 algorithms).\r\n\r\n### Added\r\n- **NEW GROUP: Urban Growth.**\r\n- **Land-Cover Change Analysis** \u2014 the transition matrix of two class rasters: from/to pairs with cells + hectares, per-class gains/losses/persistence/net, optional class labels; the largest conversion named in the log.\r\n- **Urban Growth Simulation (CA)** \u2014 constrained cellular automaton (SLEUTH tradition): score = suitability \u00d7 (base + weight \u00d7 urban neighbourhood share); top scorers convert per step until the land demand is met; never-build constraints; deterministic for a given seed **across processes** (unit-tested). Output: year-of-conversion raster.\r\n- **Urban Sprawl Metrics** \u2014 SDG 11.3.1 LCRPGR (land consumption vs population growth) + patch count, largest-patch share, edge density.\r\n- Engine: pure-NumPy `engine/growth.py`; three new group-coloured tool icons.\r\n\r\n### Testing\r\n- Engine unit checks grown to **345** (hand-counted transition matrices, gradient-following CA, constraint masks, cross-process determinism, hand-computed LCRPGR and edge lengths); end-to-end assertions to **266** on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [3.4.0] - 2026-07-09\r\n\r\nEnvironment Screening: road noise and green infrastructure (46 algorithms).\r\n\r\n### Added\r\n- **Road Noise Screening** (Microclimate group) \u2014 screening-quality dB(A) grid: RLS-90-style emission from traffic volumes (hourly factor for AADT) and heavy shares; roads as line-calibrated point sources; energetic sum with 20 lg r spreading; fixed insertion loss behind buildings. Optional receivers report levels + a population exposure table (5 dB bands). Documented as screening, not compliance.\r\n- **NEW GROUP: Green Infrastructure.**\r\n- **Green Space Access** \u2014 the park-hierarchy standard (`min_ha=max_dist` ladder) on real network distances: per-demand pass/fail per class, classes met, per-class covered population, citywide m\u00b2/capita.\r\n- **Urban Green Connectivity** \u2014 crossable-gap patch graph: components, binary Probability-of-Connectivity index, per-patch dPC importance (the stepping-stone argument, quantified).\r\n- Engine: pure-NumPy `engine/noise.py` (the infinite-line calibration is a unit test) and `engine/green.py`; three new group-coloured tool icons.\r\n\r\n### Testing\r\n- Engine unit checks grown to **331**; end-to-end assertions to **256** on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [3.3.0] - 2026-07-09\r\n\r\nPopulation & Housing: the demographic backbone of plan-making (43 algorithms).\r\n\r\n### Added\r\n- **NEW GROUP: Population and Housing.**\r\n- **Population Projection (Cohort-Component)** \u2014 a Leslie-matrix projection from a plain age-group table: per-step survival, fertility and optional net migration as fields, any number of steps. Outputs step \u00d7 age-group rows and per-step totals. Single-sex screening form; rates constant over the horizon.\r\n- **Housing Needs Assessment** \u2014 the standard needs identity, batchable: future households, vacancy allowance, replacement losses, backlog; every intermediate in a metric/value table. Negative need = surplus.\r\n- **Residential Capacity** \u2014 per-parcel buildable floorspace from FAR \u2212 existing floorspace \u2192 whole dwelling units (unit size, net-to-gross efficiency), with a district roll-up. The reality check against the housing need; feeds the Land-Use Allocation Optimizer.\r\n- Engine: pure-NumPy `engine/population.py` (`leslie_matrix`, `cohort_projection`, `housing_needs`, `residential_capacity`); `report.svg_pyramid` age-structure chart; three new group-coloured tool icons.\r\n\r\n### Testing\r\n- Engine unit checks grown to **316** (hand-computed two-step Leslie projection, migration floors, needs identity, capacity clamps); end-to-end assertions to **242** on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [3.2.0] - 2026-07-09\r\n\r\nVisibility: viewsheds, isovists and landmark exposure (40 algorithms).\r\n\r\n### Added\r\n- **NEW GROUP: Visibility.**\r\n- **Viewshed (DSM)** \u2014 line-of-sight sweep from observer points: observer/target heights, view radius, direction count; visibility-count raster output. Radial sweep with a running horizon angle, rays capped at the raster diagonal.\r\n- **Isovist Field** \u2014 Benedikt's 2-D visibility measures sampled on a point grid between buildings: visible area/perimeter, min/max/mean radial, circularity, occlusivity. The VGA companion to the space-syntax tools.\r\n- **Visual Exposure of Landmarks** \u2014 the inverse viewshed: outline samples (optional extra height for spires), per-cell count of visible outline points; difference before/after DSMs for skyline & heritage impact.\r\n- Engine: pure-NumPy `engine/visibility.py`; three new group-coloured tool icons.\r\n\r\n### Testing\r\n- Engine unit checks grown to **304** (wall shadows, tall-target pokes, radius caps, corridor vs plaza isovists); end-to-end assertions to **233** on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [3.1.0] - 2026-07-09\r\n\r\nTransit: GTFS feeds become first-class citizens (37 algorithms).\r\n\r\n### Added\r\n- **NEW GROUP: Transit.**\r\n- **GTFS Import and Service Stats** \u2014 loads a GTFS zip into QGIS with validation on the way in (named errors for missing files / malformed times). Stops as WGS84 points with daily departures + route counts; a route summary table (mode, trips, service span, longest stop sequence). Service day defaults to the feed's first active day.\r\n- **Transit Frequency Map** \u2014 departures per stop within a time window: departures/hour, mean headway minutes, distinct routes (the frequent-network map), plus per-route trips in the window.\r\n- **Transit Travel-Time Access** \u2014 door-to-door with public transport: walk to a stop on the street network, ride a RAPTOR-style timetable with up to N transfers, walk to each destination. Reports walk-only vs transit minutes, winning mode and minutes saved per destination. Overtaking trips treated FIFO (screening simplification, documented).\r\n- Engine: pure-stdlib+NumPy `engine/transit.py` \u2014 GTFS zip reader (utf-8-sig, past-midnight times as plain seconds, never datetimes), `calendar`/`calendar_dates` service resolution, `stop_frequencies`, RAPTOR `compile_day` (pattern grouping by route + stop sequence) and `earliest_arrival`; `paths.multi_source_offset` (egress Dijkstra whose sources start at their own arrival offsets); three new group-coloured tool icons.\r\n\r\n### Testing\r\n- Engine unit checks grown to **287** (synthetic in-code GTFS: transfer chains, no-transfer cutoffs, late boarding, cancelled service days); end-to-end assertions to **221** on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [3.0.0] - 2026-07-09\r\n\r\nScenarios & Walkability: the plan-evaluation loop closes and a tenth tool\r\ngroup opens (34 algorithms).\r\n\r\n### Added\r\n- **Scenario Snapshot** (Reporting group) \u2014 captures the plan score metrics of the current project into a snapshot JSON.\r\n  - PlanX output layers auto-detected by field signatures (access score, balance table, facility adequacy, demand coverage, density grid) or pinned explicitly.\r\n  - Model-designer friendly: run the tools for alternative A, snapshot, rerun for B, snapshot, feed both files to Scenario Compare (A/B).\r\n- **NEW GROUP: Walkability.**\r\n- **Walkability Audit** \u2014 scores every street segment 0\u2013100 from the classic walkability-index ingredients (Frank et al. 2010): intersection density, land-use mix entropy, destination counts, block length, slope. Editable weights and breakpoints; sub-scores + raw ingredients on every segment; missing inputs renormalised away.\r\n- **Pedestrian Route Quality** \u2014 routes over quality-weighted streets (weight = length \u00d7 (1 + penalty \u00d7 (100 \u2212 score)/100)); reports detour ratio vs the plain shortest path, length-weighted mean walk score and the share of the route on low-scoring segments. Nearest-destination or all-pairs.\r\n- Engine: pure-NumPy `engine/walkability.py`; `paths.shortest_path_tree` / `reconstruct_path` (predecessor Dijkstra that names the parallel edge taken); shared collector `planx/collect.py` feeding both the dashboard dock and the snapshot algorithm; three new group-coloured tool icons.\r\n\r\n### Testing\r\n- Engine unit checks grown to **265**; end-to-end assertions to **205** on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [2.13.0] - 2026-07-08\r\n\r\nEquity Cross-Tabs & Scenario Compare: who holds the low values, and which\r\nplan alternative wins (31 algorithms).\r\n\r\n### Added\r\n- **Demographic Equity Cross-Tabs** (Equity group) \u2014 cross-tabulates any per-unit value by population subgroup.\r\n  - Population-weighted quantile classes (quintiles by default) or fixed breaks.\r\n  - Representation ratio per group \u00d7 class cell (1 = proportional; over-representation in the lowest class flags a disadvantaged group).\r\n  - Per-group population/value shares, weighted mean/P10/median/P90, internal Gini, and the Duncan & Duncan dissimilarity index vs the rest.\r\n  - Optional second group field crosses two demographics; the input comes back annotated with its value class and cell representation ratio for mapping.\r\n- **Scenario Compare (A/B)** (Reporting group) \u2014 the A/B view of the Plan Dashboard.\r\n  - The dashboard dock gains **Save A / Save B** scenario snapshots (score metrics to JSON next to the project) and an in-dock comparison panel with direction-aware winners and coloured deltas.\r\n  - Headless too: `planx:scenariocompare` diffs two snapshot JSON files into a comparison table and an optional one-file HTML comparison report.\r\n- Engine: pure-NumPy `equity.crosstab` / `equity.value_classes`; new pure-stdlib `engine/scenario.py` (snapshot / compare / verdict, direction registry); `report.compare_section` / `build_compare_html`; two new group-coloured tool icons.\r\n\r\n### Testing\r\n- Engine unit checks grown to **250**; end-to-end assertions to **188** on QGIS 3.44 LTR and QGIS 4.0.2.\r\n\r\n## [2.12.0] - 2026-07-08\r\n\r\nSiting & Contiguity: Capacitated Facility Siting and Contiguous Land-Use Allocation (29 algorithms).\r\n\r\n### Added\r\n- **Capacitated Facility Siting** (Optimization group) \u2014 chooses where to build p new facilities respecting per-site capacity constraints and travel limits.\r\n  - First, a greedy construction phase selects sites that maximize newly served demand under a capacity-respecting allocation.\r\n  - Then, a Teitz-Bart vertex substitution phase optimizes the locations by swapping sites to maximize total served demand (with total travel cost as a tiebreaker).\r\n  - Existing facilities enter as fixed-open.\r\n  - Outputs selected sites (with rank, load, utilization, marginal demand gain), allocation lines (demand to site connection with cost), and uncovered demand.\r\n- **Contiguous Land-Use Allocation** (Optimization group) \u2014 optional Hard Contiguity mode on the Land-Use Allocation algorithm to assign parcels to uses forming a single connected component per use.\r\n  - Seed-based concurrent region-growing followed by boundary-swap local search preserving subgraph connectivity of affected uses.\r\n  - Default is Soft (existing behaviour unchanged).\r\n- `engine/optimize.capacitated_siting` and `engine/allocate.allocate_contiguous` \u2014 pure NumPy.\r\n- A new group-coloured tool icon for Capacitated Facility Siting.\r\n\r\n### Testing\r\n- Engine unit checks grown to **225**; end-to-end assertions to **174** on QGIS 3.44 LTR and QGIS 4.0.2.", "external_deps": null, "download_url": "https://plugins.qgis.org/plugins/planx/version/3.6.0/download/"}