| name | zonewise-site-analysis |
| description | Performs comprehensive site analysis for development feasibility in Florida. Calculates buildable area considering setbacks, FAR, lot coverage, and height limits. Identifies constraints including flood zones, wetlands, and easements. Determines approval pathway (by-right vs variance). Generates professional site analysis reports. Triggers on: site analysis, buildable area, FAR calculation, development feasibility, setback analysis, lot coverage, site constraints. |
ZoneWise Site Analysis
Overview
Comprehensive development feasibility analysis combining zoning regulations, parcel geometry, and environmental constraints.
Quick Start
from scripts.analyze_site import analyze_site
result = analyze_site(
parcel_id="12345678",
proposed_use="single_family",
jurisdiction="melbourne"
)
Analysis Components
1. Parcel Geometry
from scripts.get_parcel_geometry import get_parcel
parcel = get_parcel(parcel_id="12345678")
2. Setback Calculation
from scripts.calculate_setbacks import calculate_buildable_envelope
envelope = calculate_buildable_envelope(
lot_width=80,
lot_depth=125,
setbacks={
"front": 25,
"rear": 20,
"side": 7.5
},
corner_lot=False
)
3. FAR & Coverage Analysis
from scripts.calculate_density import calculate_max_building
max_building = calculate_max_building(
lot_area_sf=10000,
far=0.5,
lot_coverage_pct=40,
max_height_ft=35
)
4. Density Calculation
from scripts.calculate_density import calculate_max_units
units = calculate_max_units(
lot_area_sf=43560,
max_units_per_acre=12,
min_lot_area_per_unit=3500
)
5. Constraint Detection
from scripts.detect_constraints import check_constraints
constraints = check_constraints(parcel_id="12345678")
Full Site Analysis
def analyze_site(
parcel_id: str,
proposed_use: str,
jurisdiction: str,
proposed_units: int = None
) -> dict:
"""
Complete site feasibility analysis.
Returns comprehensive analysis including:
- Zoning compliance
- Buildable envelope
- Maximum development potential
- Constraints and limitations
- Approval pathway recommendation
"""
parcel = get_parcel(parcel_id)
district = lookup_district(jurisdiction, parcel["zoning"])
use_status = check_use_allowed(district, proposed_use)
envelope = calculate_buildable_envelope(
parcel["lot_width"],
parcel["lot_depth"],
district["setbacks"],
parcel["corner_lot"]
)
max_building = calculate_max_building(
parcel["lot_area_sf"],
district["far"],
district["lot_coverage_pct"],
district["max_height_ft"]
)
constraints = check_constraints(parcel_id)
adjusted = apply_constraint_adjustments(
envelope, max_building, constraints
)
pathway = determine_approval_pathway(
use_status, proposed_units, district, constraints
)
return {
"parcel_id": parcel_id,
"jurisdiction": jurisdiction,
"district": parcel["zoning"],
"proposed_use": proposed_use,
"use_status": use_status,
"parcel": parcel,
"buildable_envelope": envelope,
"max_development": adjusted,
"constraints": constraints,
"approval_pathway": pathway,
"feasibility_score": calculate_feasibility_score(...)
}
Approval Pathway Logic
def determine_approval_pathway(
use_status: str,
proposed_units: int,
district: dict,
constraints: dict
) -> dict:
"""Determine required approval process."""
if use_status == "prohibited":
return {
"pathway": "not_feasible",
"reason": "Use not permitted in this district",
"alternative": "Rezone or find different site"
}
if use_status == "by_right":
if not constraints_require_review(constraints):
return {
"pathway": "by_right",
"process": "Building permit only",
"timeline_days": 30,
"risk": "low"
}
if use_status == "conditional":
return {
"pathway": "special_exception",
"process": "Planning board hearing required",
"timeline_days": 90,
"risk": "medium",
"requirements": get_special_exception_requirements(district)
}
return {
"pathway": "variance",
"process": "Board of Adjustment hearing",
"timeline_days": 120,
"risk": "high",
"hardship_required": True
}
Feasibility Score
def calculate_feasibility_score(analysis: dict) -> dict:
"""Calculate 0-100 feasibility score."""
score = 100
factors = []
if analysis["use_status"] == "prohibited":
return {"score": 0, "factors": ["Use not permitted"]}
elif analysis["use_status"] == "conditional":
score -= 20
factors.append("Conditional use requires approval (-20)")
if analysis["constraints"]["flood_zone"]["zone"] in ["AE", "VE"]:
score -= 15
factors.append("High-risk flood zone (-15)")
if analysis["constraints"]["wetlands"]["present"]:
score -= 25
factors.append("Wetlands present (-25)")
buildable_ratio = (
analysis["buildable_envelope"]["buildable_area_sf"] /
analysis["parcel"]["lot_area_sf"]
)
if buildable_ratio < 0.3:
score -= 20
factors.append("Limited buildable area (-20)")
return {
"score": max(0, score),
"rating": get_rating(score),
"factors": factors
}
def get_rating(score: int) -> str:
if score >= 80: return "Excellent"
if score >= 60: return "Good"
if score >= 40: return "Fair"
if score >= 20: return "Poor"
return "Not Feasible"
Report Generation
from scripts.generate_site_report import generate_report
report_path = generate_report(
analysis=site_analysis,
output_format="docx",
include_maps=True
)
Report Sections
- Executive Summary
- Property Information
- Zoning Analysis
- Development Potential
- Constraints Map
- Approval Pathway
- Recommendations
- Appendix (Municode references)
Data Sources
| Data | Source |
|---|
| Parcel geometry | BCPAO GIS |
| Zoning district | ZoneWise DB |
| Flood zones | FEMA NFHL |
| Wetlands | NWI / SJRWMD |
| Easements | BCPAO recorded plats |
Integration
- District Lookup: Get zoning regulations
- MCP Server: Expose via
zonewise_site_analysis tool
- BidDeed.AI: Evaluate foreclosure properties for development
Limitations
- Analysis based on available data; site survey recommended
- Does not account for pending ordinance changes
- PUD districts require individual agreement review
- Coastal construction requires additional review