Regulation explorer
Browse seeded DAP tables — plot FAR, all 68 density blocks, incentives, land use, and amendments. The Data & methodology tab documents sources, verification, Bidhimala 2025 rules, and how the calculator computes each output.
Overview
PlanBD's regulatory data and FAR calculator are built from the DAP 2022–2035 framework as amended by SRO 466/2025 (gazetted 14 December 2025). This page documents how we collected tables, how we verified them, and exactly how the calculator computes Plot FAR, Area FAR, incentives, and dwelling units.
Current regulatory version: DAP Amendment 2 + Bidhimala 2025 (SRO 466/2025 + SRO 469-Law/2025) (gazetted 12/14/2025). Calculations always use the version where isCurrent = true. Beyond FAR caps, the engine applies Bidhimala 2025 Table 3 (ground coverage bands) and Table 1 (setbacks by storey count), then builds a 14-section development report with audit trail.
Live data snapshot
Counts below are loaded from PostgreSQL for the current version and match what you see in the explorer tabs above.
Plot FAR tiers
806
Appendix 3.5 / Table-5
Density blocks
68
Appendix 3.6 (target: 68)
Building categories
51
Bidhimala Table 5 + sub-types
Incentive rules
6
SRO 466/2025 schedule
Land-use rules
49
17 zoning types
Amendments
1
SRO log in DB
How we collected the data
1. Official & mirror sources
RAJUK's own PDFs on rajuk.gov.bd often return HTTP 403 to automated download. We therefore used Shellmark Limited's Dec 2025 publication — which reproduces the gazetted Appendix 3.5 and 3.6 tables and provides worked FAR examples — as the primary transcription source. These were cross-checked against news/industry reporting and saved locally under docs/.
- Plot FAR (Appendix 3.5 / Sarani 3.5): Downloaded Plot-FAR-Chart-for-All-Occupancies.pdf (6 scanned pages). Text extraction failed (image-only PDF). Tables were transcribed manually from rendered PNG pages and Shellmark's web table into
prisma/data/plot-far-appendix-35.ts. Includes A1–A6 × 3 location contexts, B1–K3 sub-types, and legacy B–K aliases. - Area FAR (Appendix 3.6 / Sarani 3.6): Downloaded Area-FAR-Table-scaled.webp. All 68 merged density blocks (SRO 466/2025 replaces 275 ward-based blocks) are transcribed in
prisma/data/density-blocks-appendix-36.tsand seeded intodensity_blocks,area_far_rules, andareas_in_block. Blocks 29 and 42 merge sub-rows 29A+29B and 42A+42B from the official table. - Building categories: From Dhaka Imarat Nirman Bidhimala 2025 Table 5 — A1–A6 residential sub-types plus B–M major groups, plus Table-5 sub-types B1–K3 seeded for calculator compatibility.
- GIS context: Probed RAJUK Masterplan ArcGIS — public WMTS tiles for land use, overlays (TOD, heritage), transport, RS Mauza. Documented in
docs/dataset-inventory.md. Vector query/export requires a token (rajuk_db). - Bidhimala 2025 — Table 3 (ground coverage): Min/max mandatory ground coverage (MGC) by plot area band and location context, implemented in
src/lib/bidhimala-table3.ts(not flat DB rows). Drives min / mid / max coverage scenarios in the calculator. - Bidhimala 2025 — Table 1 (setbacks): Front, rear, side, and building-to-building gaps by total storey count, in
src/lib/bidhimala-setbacks.ts. Matched to recommended G+N height from floor scenarios. - Incentive schedule: Shellmark's six bonus types (Dec 2025) seeded in
prisma/seed.ts. Dynamic amounts (plot unification by katha, wide-road bonus) computed insrc/lib/incentive-far.ts, not stored as flat DB values.
2. Seed pipeline
npm run db:seed → clearRegulatoryData() → regulatory versions (DAP 2022, SRO 271/2023, SRO 466/2025 current) → building categories + sub-types → PLOT_FAR_RULE_SETS → plot_far_rules (806 rows loaded in explorer) → DENSITY_BLOCKS_APPENDIX_36 → density_blocks + area_far_rules + areas_in_block → incentive_far_rules (6 rules) → ground coverage, setbacks, height, land use, special zones, articles
3. Road-width bands (Table-5 columns)
Nine metre-based columns from gazette Table-5 — stored as discrete tiers in the DB, then interpolated at calculation time:
| Band | Min (m) | Max (m) | ≈ feet (min) |
|---|---|---|---|
| 1 | 1.8 | 2.499 | 5.9 ft |
| 2 | 2.5 | 3.659 | 8.2 ft |
| 3 | 3.66 | 4.879 | 12.0 ft |
| 4 | 4.88 | 5.999 | 16.0 ft |
| 5 | 6 | 8.999 | 19.7 ft |
| 6 | 9 | 11.999 | 29.5 ft |
| 7 | 12 | 17.999 | 39.4 ft |
| 8 | 18 | 23.999 | 59.1 ft |
| 9 | 24 | ∞ | 78.7 ft |
How we verified
Automated cross-checks
- Full
db:seedcompletes with expected counts: 68 blocks, 806 plot FAR tiers, 6 incentives, 51 building categories. - Spot checks after reseed: DB-03 Bashundhara Area FAR = 4.1; DB-54 Purbachal = 4.5; A3 central @ 6–9 m band = 3.25 (before interpolation).
- Shellmark worked examples run through
runFarEngine()— Ex-01 and Ex-02 match within ±0.02 FAR (interpolation rounding).
Shellmark Example-01 (Purbachal)
| 5 katha, 75 ft road, A3, block 54 | |
| Plot FAR (interpolated) | 4.65 → engine 4.66 |
| Area FAR | 4.50 ✓ |
| Base FAR | 4.50 ✓ |
| Bonus (plot unification) | +0.20 ✓ |
| Total FAR | 4.65 ✓ (capped at max = Plot FAR) |
| DU | 11 ✓ (9.5 + 10% → ceil) |
Shellmark Example-02 (Bashundhara + TOD)
| 4 katha, 25 ft road, A3, block 3, TOD on | |
| Plot FAR (interpolated) | 3.38 → engine 3.39 |
| Area FAR | 4.10 ✓ |
| Base FAR | 3.38 ✓ |
| Bonus (0.2 unification + 0.5 TOD) | +0.70 ✓ |
| Total FAR | 4.08 → engine 4.09 |
| DU | 9 ✓ |
Third-party formula confirmation
The Financial Express (Nov 2025) quotes a major developer: the lowest of Plot FAR and Area FAR is Base FAR; the highest is Maximum FAR; bonus is added to Base but cannot exceed Maximum. This matches Shellmark's worked examples and our engine.
FAR calculation formulas
The calculator implements the Dec 2025 DAP arithmetic in this order:
// 1. Plot FAR — from Appendix 3.5 (interpolated) PlotFAR = interpolate(category, locationContext, roadWidthM, plotAreaM2) // 2. Area FAR — from density block (Appendix 3.6) AreaFAR = densityBlock.maxAreaFar // 3. Base & ceiling BaseFAR = min(PlotFAR, AreaFAR) MaximumFAR = max(PlotFAR, AreaFAR) // 4. Incentive FAR (automatic + user-selected) IncentiveFAR = plotUnification(katha) + Σ eligible bonuses // 5. Total usable FAR TotalFAR = min(BaseFAR + IncentiveFAR, MaximumFAR) // 6. Gross floor area MaxBuildableArea = TotalFAR × PlotAreaM²
Important: Total FAR is not capped at min(PlotFAR, AreaFAR). Bonuses can raise usable FAR up to max(PlotFAR, AreaFAR) — e.g. when Area FAR exceeds Plot FAR, TOD + unification can lift total above the plot-limited base.
Plot FAR lookup (Appendix 3.5)
Inputs: building category code, location context (CENTRAL_DHAKA, OUTSIDE_CENTRAL, OTHER_CITY_AREA), adjacent road width in metres, plot area in m².
// Load all plot_far_rules for (category, context) // Sort bands by minRoadWidthM // For road width R between band lows L₁ and L₂: PlotFAR = FAR₁ + (R - L₁) / (L₂ - L₁) × (FAR₂ - FAR₁) // Example: A3 central, 25 ft = 7.62 m between 6 m (3.25) and 9 m (3.50) // → 3.25 + (7.62-6)/(9-6) × 0.25 = 3.385 ≈ 3.38
Implementation: src/lib/plot-far-interpolate.ts → called from runFarEngine(). A warning is added to results when interpolation is used. Values marked null in the source table mean "not permitted" at that road width.
Purbachal, Jhilmil, and central Dhaka residential rows share the CENTRAL_DHAKA context per Table-5 notes.
Incentive / Bonus FAR
Per Shellmark / SRO 466/2025 schedule. Plot unification is automatic; others are user-toggled in the calculator.
| Code | Bonus | How applied |
|---|---|---|
| PLOT_UNIFICATION | 0.2 – 0.75 | Auto by katha: ≤5→0.2, ≤10→0.35, ≤15→0.5, ≤20→0.65, >20→0.75 |
| GREEN_BUILDING | +0.50 | Toggle — green building certification |
| CIVIC_OPEN_SPACE | +0.50 | Toggle — public/civic open space (new provision) |
| LOW_COST_HOUSING | +0.50 / +0.75 | Toggle — A6, ≥5 units; ≥10 katha→0.5, ≥20→0.75 |
| TOD_TRANSIT | +0.50 | Toggle — within TOD overlay (~200 m per Shellmark Ex-02) |
| WIDE_ROAD_BONUS | +0.02/ft | Toggle — (roadFt − 30) × 0.02, max +1.0 |
Live rules in DB match the explorer Incentives tab (6 rows). Dynamic codes store bonusFar = 0 in DB; actual amount computed at runtime in computeIncentiveFar().
Dwelling unit estimate
katha = plotAreaM² / 66.89 // 720 sq ft per katha PermittedDU = ceil(desirableDensity × katha) // Appendix 3.6 density × katha A3 bonus = ceil(PermittedDU × 0.10) // DAP §3.6.4.1(d) discretionary +10% MaximumDU = PermittedDU + A3 bonus // A3 only; others use PermittedDU FAR-basedDU = floor(maxBuildableAreaM² / avgUnitSqM) // reference only
desirableDensity is DU per katha from the selected density block. The report shows permitted, maximum (A3 +10%), and FAR-based unit counts. If no block is assigned, density-method estimates are omitted.
Ground coverage — Bidhimala Table 3
Bidhimala 2025 §45(1) Table 3 sets a min–max mandatory ground coverage (MGC) band by plot area (m²) and location context (CENTRAL_DHAKA vs OUTSIDE_CENTRAL / OTHER_CITY_AREA).
row = resolveBidhimalaTable3(plotAreaM², locationContext) minCoverage% = row.minCoveragePercent maxCoverage% = row.maxCoveragePercent midCoverage% = (min + max) / 2 openSpace% = row.mandatoryOpenSpacePercent minFootprint = plotArea × minCoverage% maxFootprint = plotArea × maxCoverage%
Implementation: src/lib/bidhimala-table3.ts. The engine uses max coverage for the primary footprint cap; min and mid drive the three floor scenarios. Seeded ground_coverage_rules in the DB are a fallback when Table 3 does not match.
Setbacks — Bidhimala Table 1
After floor scenarios estimate total storeys (G+N), setbacks are resolved from Bidhimala 2025 §41 Table 1 by storey band:
storeys = recommended scenario totalStoreys // e.g. G+7 → 8 storeys row = resolveBidhimalaSetbacks(storeys) front ≥ row.frontM m (from plot boundary; §41(1) road-centre rule noted in report) rear ≥ row.rearM m side ≥ row.sideM m (each side) gap ≥ row.interBuildingM m
Implementation: src/lib/bidhimala-setbacks.ts. Four storey bands (up to G+6, G+7–G+9, G+10–G+13, G+14+). Corner plots may require different side treatment — flagged as a warning in results.
Floor scenarios (G+N)
footprintM² = (coverage% / 100) × plotAreaM² upperFloors = ceil(maxBuildableAreaM² / footprintM²) totalStoreys = upperFloors + 1 // ground floor excluded from FAR area storeyLabel = "G+" + upperFloors heightM ≈ totalStoreys × 3.2 m
Three scenarios are built at min, mid, and max Table-3 coverage. Ground floor is treated as parking / lobby (FAR-excluded); upper floors carry the buildable area. Implementation: src/lib/floor-scenarios.ts → build-result-analysis.ts for the report cards and bar charts.
Not yet modelled (Shellmark steps 18–25): GF lift/lobby deduction, per-floor net area split, balcony allowance (30% front / 2.5% floor), planter boxes (2.5% green). These are design-stage refinements beyond the FAR cap.
Development report pipeline
fetch-and-run.ts loads rules from PostgreSQL, runs runFarEngine(), then buildFarResultAnalysis() assembles 14 sections: executive summary, site info, FAR waterfall, development potential, ground coverage, setbacks, unit analysis, development score, floor & coverage scenarios, incentives, compliance checklist, land use, regulatory citations, and audit trail. PDF export mirrors the web layout via src/lib/pdf/report-document.tsx.
- Engine output → typed
FarResultAnalysis - Shared FAR waterfall steps in
src/lib/report/far-waterfall.ts - Compliance items derived from engine warnings + zoning rules
- Each formula step logged in audit trail with regulation citation
Calculator workflow (step by step)
- Resolve building category → load plot FAR rules for location context.
- Interpolate Plot FAR from road width (ft/m input converted to metres).
- Resolve density block → Area FAR + desirable density.
- Compute Base FAR and Maximum FAR.
- Apply automatic plot-unification bonus from katha.
- Add user-selected incentives (TOD, green building, etc.).
- Cap at Maximum FAR → Total FAR → max buildable GFA.
- Resolve Bidhimala Table 3 → min / mid / max coverage band.
- Build three G+N floor scenarios; pick recommended storey count.
- Resolve Bidhimala Table 1 setbacks from total storeys.
- Estimate permitted / maximum dwelling units (A3 +10%).
- Apply zoning / land-use prohibitions (AG, FF, etc.) if zone data present.
- Assemble 14-section report + audit trail; optional PDF export.
Known limitations & gaps
- RAJUK gazette PDFs are not machine-readable in our pipeline; Shellmark mirror is the transcription source until official tables are available as text/CSV.
- No public GeoJSON for density block boundaries — block centroids on the map are approximate (
src/lib/map/block-coords.ts). - TOD eligibility is a user toggle; we do not yet auto-detect distance to metro stations from GIS.
- Wide-road bonus (+0.02/ft) may double-count road width already reflected in Plot FAR — Shellmark examples omit it when Plot FAR already encodes road width.
- Land-use matrix (49 rules seeded) and parking rules cover common cases but not the full 306-row gazette matrix — see
docs/dataset-inventory.md. - Committee-determined FAR rows (L, M sub-types in gazette) are not in the calculator.
- Design-stage area deductions (lobby, balconies, planters) are documented but not applied to net sellable area.
External references
Local copies: docs/Plot-FAR-Chart-for-All-Occupancies.pdf, docs/Area-FAR-Table-scaled.png, docs/plot-far-pdf-page-*.png, docs/_shellmark-page.html
Code & documentation map
| Path | Role |
|---|---|
| prisma/data/plot-far-appendix-35.ts | Appendix 3.5 Table-5 — plot FAR tiers (all occupancies) |
| prisma/data/density-blocks-appendix-36.ts | Appendix 3.6 — all 68 density blocks + area FAR |
| prisma/seed.ts | Database seed: versions, categories, plot/area FAR, incentives, land use |
| src/lib/plot-far-interpolate.ts | Linear Plot FAR interpolation between road bands |
| src/lib/incentive-far.ts | Bonus FAR tiers, dwelling units (permitted / max A3 +10%) |
| src/lib/bidhimala-table3.ts | Bidhimala §45 Table 3 — min/max ground coverage by plot size |
| src/lib/bidhimala-setbacks.ts | Bidhimala §41 Table 1 — setbacks by storey count |
| src/lib/floor-scenarios.ts | G+N floor scenarios at min / mid / max coverage |
| src/lib/far-engine.ts | Pure calculation engine (no DB) |
| src/lib/calculate/build-result-analysis.ts | 14-section report: score, compliance, scenarios, audit trail |
| src/lib/calculate/fetch-and-run.ts | Loads rules from DB → runs engine → analysis |
| src/lib/pdf/report-document.tsx | PDF export aligned with web report |
| docs/dataset-inventory.md | GIS probing, download constraints, gap analysis |
| docs/RAJUK-DAP-DATABASE.md | Schema + regulatory logic reference |