<?xml version="1.0" encoding="UTF-8" ?><!-- generator=Zoho Sites --><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><atom:link href="https://www.quantumrecreation.com/blogs/tag/aerial-mapping-canada/feed" rel="self" type="application/rss+xml"/><title>Quantum Recreation - Blog #Aerial mapping Canada</title><description>Quantum Recreation - Blog #Aerial mapping Canada</description><link>https://www.quantumrecreation.com/blogs/tag/aerial-mapping-canada</link><lastBuildDate>Tue, 26 May 2026 13:25:38 -0700</lastBuildDate><generator>http://zoho.com/sites/</generator><item><title><![CDATA[Drone Survey in Progress: Supporting Canadian Municipal Parks, Trees, and Infrastructure ]]></title><link>https://www.quantumrecreation.com/blogs/post/drone-survey-municipal-parks-canada</link><description><![CDATA[<img align="left" hspace="5" src="https://www.quantumrecreation.com/Municipal Drone Survey in Progress Cover.png"/>A municipal drone survey is underway to assess parks, trees, sports fields, and infrastructure using aerial mapping and 3D models across Canada.]]></description><content:encoded><![CDATA[<div class="zpcontent-container blogpost-container "><div data-element-id="elm_X3JQ64TdT0qgtDFC7S2psw" data-element-type="section" class="zpsection "><style type="text/css"></style><div class="zpcontainer-fluid zpcontainer"><div data-element-id="elm_aKUiIX69S96_mVBCF1GgEg" data-element-type="row" class="zprow zprow-container zpalign-items- zpjustify-content- " data-equal-column=""><style type="text/css"></style><div data-element-id="elm_iZQzDxYyQh-SMd2BY-2Z-g" data-element-type="column" class="zpelem-col zpcol-12 zpcol-md-12 zpcol-sm-12 zpalign-self- "><style type="text/css"></style><div data-element-id="elm_Mq5cQVzHTxqe3PQ4ts_lUA" data-element-type="text" class="zpelement zpelem-text "><style></style><div class="zptext zptext-align-center zptext-align-mobile-center zptext-align-tablet-center " data-editor="true"><p></p><div><div><div><p style="text-align:left;margin-bottom:10.6667px;"><span></span></p></div></div><div><p style="text-align:left;"></p><div><h2>🚁 Drone Survey in Progress</h2><div><br/></div>
<p>If you scanned this QR code, a <strong>drone survey is currently underway in your area</strong>.</p></div>This operation is part of a municipal mapping project using high-resolution aerial imagery to support <strong>parks, sports fields, trees, and public infrastructure assessments</strong>.<p></p><p style="text-align:left;">Across Canada, municipalities are managing more assets with limited resources. Accurate, up-to-date data is essential for <strong>maintenance planning, safety, and long-term infrastructure decisions</strong>.</p><hr style="text-align:left;"/><h2 style="text-align:left;">🌐 Why Drone Surveys Are Used</h2><p style="text-align:left;">Drone mapping provides a fast, efficient way to capture large areas without disrupting public use. The data is used to create <strong>2D maps and 3D models</strong> that support:</p><ul><li style="text-align:left;"> Asset management and planning </li><li style="text-align:left;"> Maintenance prioritization </li><li style="text-align:left;"> Infrastructure condition tracking </li><li style="text-align:left;"> Long-term capital planning </li></ul><hr style="text-align:left;"/><h2 style="text-align:left;">🛡️ Safety and Privacy</h2><p style="text-align:left;">We take <strong>safety and privacy seriously</strong> during all drone operations.</p><h3 style="text-align:left;">Safety Measures</h3><ul><li style="text-align:left;"> Flights are conducted by trained operators </li><li style="text-align:left;"> Pre-planned flight zones are used at all times </li><li style="text-align:left;"> Safe distances are maintained from people and active areas </li><li style="text-align:left;"> Flights may be paused or adjusted if conditions change </li></ul><h3 style="text-align:left;">Privacy Protection</h3><ul><li style="text-align:left;"> The purpose is to document <strong>municipal assets—not individuals</strong></li><li style="text-align:left;"> Imagery focuses on parks, fields, trees, and infrastructure </li><li style="text-align:left;"> Data is used strictly for planning and asset management </li></ul><p style="text-align:left;">If you have concerns during the flight, please maintain a safe distance and contact the project representative provided by your municipality.</p><hr style="text-align:left;"/><h2 style="text-align:left;">🏞️ What We Are Assessing</h2><h3 style="text-align:left;">⚽ Sports Field Condition Mapping</h3><p style="text-align:left;">Using advanced aerial and multispectral imaging, we assess turf conditions to identify:</p><ul><li style="text-align:left;"> Stress or worn areas </li><li style="text-align:left;"> Drainage or compaction issues </li><li style="text-align:left;"> Uneven growth patterns </li><li style="text-align:left;"> Areas needing maintenance or reseeding </li></ul><hr style="text-align:left;"/><h3 style="text-align:left;">🌳 Urban Tree Inventory Support</h3><p style="text-align:left;">Drone imagery helps municipalities map and monitor street trees:</p><ul><li style="text-align:left;"> Tree counts and distribution </li><li style="text-align:left;"> Species identification (when visible) </li><li style="text-align:left;"> General health indicators </li><li style="text-align:left;"> Risk identification for pruning or removal </li></ul><hr style="text-align:left;"/><h3 style="text-align:left;">🌲 Tree Stand &amp; Natural Area Analysis</h3><p style="text-align:left;">For forested or natural areas, we generate 3D models to evaluate:</p><ul><li style="text-align:left;"> Canopy structure and density </li><li style="text-align:left;"> Tree height and coverage </li><li style="text-align:left;"> Overall stand condition </li></ul><hr style="text-align:left;"/><h3 style="text-align:left;">🏞️ Park Asset Mapping</h3><p style="text-align:left;">We document and inventory park features such as:</p><ul><li style="text-align:left;"> Trees and landscaping </li><li style="text-align:left;"> Playgrounds and sport facilities </li><li style="text-align:left;"> Benches, shelters, and amenities </li><li style="text-align:left;"> Pathways and access points </li></ul><p style="text-align:left;">This helps municipalities improve planning, upgrades, and long-term park development.</p><hr style="text-align:left;"/><h3 style="text-align:left;">🏗️ Infrastructure 3D Modeling</h3><p style="text-align:left;">Where applicable, drone imagery is used to create 3D models of municipal buildings and structures to support:</p><ul><li style="text-align:left;"> Asset documentation </li><li style="text-align:left;"> Maintenance planning </li><li style="text-align:left;"> Condition monitoring </li></ul><hr style="text-align:left;"/><h2 style="text-align:left;">📊 Why This Data Matters</h2><p style="text-align:left;">Drone surveys help municipalities:</p><ul><li style="text-align:left;"> Make faster, data-driven decisions </li><li style="text-align:left;"> Improve safety and maintenance planning </li><li style="text-align:left;"> Track asset conditions over time </li><li style="text-align:left;"> Optimize budgets and capital investments </li></ul><hr style="text-align:left;"/><h2 style="text-align:left;">📩 Questions About This Survey?</h2><p style="text-align:left;">Thank you for your cooperation while this work is being completed.</p><p></p><div style="text-align:left;">For questions, please contact:</div>
<strong><div style="text-align:left;"><strong>Drone@quantumrecreation.com</strong></div></strong><p></p></div><div><div><p style="text-align:left;margin-bottom:10.6667px;"><span></span></p></div></div></div><p></p></div>
</div><div data-element-id="elm_8tSd1m8pSNWB578O4YVsvQ" data-element-type="button" class="zpelement zpelem-button "><style></style><div class="zpbutton-container zpbutton-align-center zpbutton-align-mobile-center zpbutton-align-tablet-center"><style type="text/css"></style><a class="zpbutton-wrapper zpbutton zpbutton-type-primary zpbutton-size-md zpbutton-style-none " href="http://quantumrecreation.com/"><span class="zpbutton-content">Contact Us</span></a></div>
</div><div data-element-id="elm_1Z5ZPskk9iCRlxtSUZ0OAw" data-element-type="codeSnippet" class="zpelement zpelem-codesnippet "><div class="zpsnippet-container"><!DOCTYPE html><html lang="en"><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Smart Campground Readiness Assessment</title><link href="https://fonts.googleapis.com/css2?family=Playfair+Display:wght@400;600;700&family=Source+Sans+3:wght@300;400;600;700&display=swap" rel="stylesheet"><script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js"></script><style> *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { --forest: #1E4D2B; --moss: #4A7C59; --sage: #8FB996; --sage-lt: #D4ECD4; --cream: #F5F0E8; --bark: #5C3D1E; --gold: #C9A84C; --gold-lt: #F5E8C7; --white: #FFFFFF; --charcoal:#2D2D2D; --gray: #6B7280; --gray-lt: #E8E6E1; --teal: #2E7D6B; --danger: #B91C1C; --warn: #92400E; } body { font-family: 'Source Sans 3', 'Segoe UI', sans-serif; background: var(--cream); color: var(--charcoal); min-height: 100vh; line-height: 1.6; } /* ── TOP BAR ─────────────────────────────────────── */ .top-bar { background: var(--forest); padding: 14px 32px; display: flex; align-items: center; justify-content: space-between; } .top-bar-logo { font-family: 'Playfair Display', serif; color: var(--white); font-size: 17px; font-weight: 600; letter-spacing: 0.3px; } .top-bar-logo span { color: var(--gold); } .top-bar-tag { font-size: 11px; color: var(--sage); letter-spacing: 2px; text-transform: uppercase; } /* ── PROGRESS BAR ────────────────────────────────── */ .progress-wrap { background: var(--forest); padding: 0 32px 16px; display: none; } .progress-steps { display: flex; gap: 4px; margin-bottom: 6px; } .progress-step { flex: 1; height: 4px; background: rgba(255,255,255,0.2); border-radius: 2px; transition: background 0.4s; } .progress-step.done { background: var(--gold); } .progress-step.active{ background: var(--sage); } .progress-label { font-size: 11px; color: var(--sage); letter-spacing: 1.5px; text-transform: uppercase; } /* ── MAIN CONTAINER ──────────────────────────────── */ .container { max-width: 1280px; margin: 0 auto; padding: 0 20px 60px; } /* ── SCREENS ─────────────────────────────────────── */ .screen { display: none; animation: fadeIn 0.35s ease; } .screen.active { display: block; } @keyframes fadeIn { from { opacity:0; transform:translateY(12px); } to { opacity:1; transform:translateY(0); } } /* ── INTRO SCREEN ────────────────────────────────── */ .intro-hero { background: var(--forest); margin: 0 -20px; padding: 56px 40px 48px; text-align: center; } .intro-badge { display: inline-block; background: var(--gold); color: var(--forest); font-size: 10px; font-weight: 700; letter-spacing: 2.5px; text-transform: uppercase; padding: 5px 14px; border-radius: 20px; margin-bottom: 20px; } .intro-hero h1 { font-family: 'Playfair Display', serif; color: var(--white); font-size: clamp(28px, 5vw, 42px); font-weight: 700; line-height: 1.2; margin-bottom: 16px; } .intro-hero p { color: var(--sage); font-size: 16px; max-width: 520px; margin: 0 auto 32px; font-weight: 300; } .btn-start { background: var(--gold); color: var(--forest); border: none; padding: 14px 36px; font-size: 15px; font-weight: 700; font-family: inherit; border-radius: 6px; cursor: pointer; letter-spacing: 0.5px; transition: background 0.2s, transform 0.1s; } .btn-start:hover { background: #d4b055; transform: translateY(-1px); } .btn-start:active { transform: scale(0.98); } .intro-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-top: 32px; } .intro-card { background: var(--white); border: 1px solid var(--gray-lt); border-radius: 10px; padding: 20px 18px; text-align: center; } .intro-card-icon { font-size: 22px; margin-bottom: 10px; display: block; } .intro-card h3 { font-family: 'Playfair Display', serif; font-size: 15px; font-weight: 600; color: var(--forest); margin-bottom: 6px; } .intro-card p { font-size: 13px; color: var(--gray); line-height: 1.5; } .intro-meta { margin-top: 20px; display: flex; align-items: center; justify-content: center; gap: 24px; flex-wrap: wrap; } .intro-meta-item { display: flex; align-items: center; gap: 7px; font-size: 13px; color: var(--gray); } .intro-meta-dot { width: 6px; height: 6px; background: var(--gold); border-radius: 50%; } /* ── QUESTION SCREEN ─────────────────────────────── */ .section-header { padding: 28px 0 20px; border-bottom: 1px solid var(--gray-lt); margin-bottom: 24px; } .section-eyebrow { font-size: 11px; letter-spacing: 2px; color: var(--moss); text-transform: uppercase; font-weight: 600; margin-bottom: 6px; } .section-title { font-family: 'Playfair Display', serif; font-size: 26px; color: var(--forest); font-weight: 700; margin-bottom: 6px; } .section-desc { font-size: 14px; color: var(--gray); } .question-block { background: var(--white); border: 1px solid var(--gray-lt); border-radius: 10px; padding: 22px 24px; margin-bottom: 16px; transition: border-color 0.2s; } .question-block.answered { border-color: var(--sage); } .question-text { font-size: 15px; font-weight: 600; color: var(--charcoal); margin-bottom: 14px; line-height: 1.5; } .question-num { display: inline-block; background: var(--sage-lt); color: var(--forest); font-size: 10px; font-weight: 700; padding: 2px 8px; border-radius: 10px; margin-bottom: 8px; letter-spacing: 1px; text-transform: uppercase; } .options { display: flex; flex-direction: column; gap: 8px; } .option-label { display: flex; align-items: flex-start; gap: 11px; padding: 11px 14px; border: 1px solid var(--gray-lt); border-radius: 7px; cursor: pointer; transition: all 0.15s; font-size: 14px; color: var(--charcoal); line-height: 1.4; } .option-label:hover { border-color: var(--moss); background: var(--sage-lt); } .option-label input[type="radio"] { display: none; } .radio-dot { width: 17px; height: 17px; min-width: 17px; border: 2px solid #ccc; border-radius: 50%; margin-top: 1px; display: flex; align-items: center; justify-content: center; transition: all 0.15s; } .radio-fill { width: 8px; height: 8px; background: var(--white); border-radius: 50%; transform: scale(0); transition: transform 0.15s; } input[type="radio"]:checked + .radio-dot { border-color: var(--forest); background: var(--forest); } input[type="radio"]:checked + .radio-dot .radio-fill { transform: scale(1); } .option-label:has(input:checked) { border-color: var(--forest); background: var(--sage-lt); font-weight: 600; } /* ── NAV BUTTONS ─────────────────────────────────── */ .nav-row { display: flex; justify-content: space-between; align-items: center; margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--gray-lt); } .btn-back { background: none; border: 1px solid var(--gray-lt); color: var(--gray); padding: 10px 22px; border-radius: 6px; font-family: inherit; font-size: 14px; cursor: pointer; transition: all 0.2s; } .btn-back:hover { border-color: var(--moss); color: var(--forest); } .btn-next { background: var(--forest); color: var(--white); border: none; padding: 11px 28px; border-radius: 6px; font-family: inherit; font-size: 14px; font-weight: 600; cursor: pointer; transition: background 0.2s; } .btn-next:hover { background: var(--moss); } .btn-next:disabled { background: var(--gray-lt); color: var(--gray); cursor: not-allowed; } .btn-submit { background: var(--gold); color: var(--forest); border: none; padding: 12px 30px; border-radius: 6px; font-family: inherit; font-size: 15px; font-weight: 700; cursor: pointer; transition: background 0.2s; } .btn-submit:hover { background: #d4b055; } .validation-msg { font-size: 12px; color: var(--danger); display: none; margin-top: -8px; margin-bottom: 8px; } .validation-msg.show { display: block; } /* ── RESULTS SCREEN ──────────────────────────────── */ .results-hero { background: var(--forest); margin: 0 -20px; padding: 40px 32px 36px; text-align: center; } .results-eyebrow { font-size: 11px; letter-spacing: 2px; color: var(--sage); text-transform: uppercase; margin-bottom: 16px; } .score-ring-wrap { display: inline-flex; flex-direction: column; align-items: center; margin-bottom: 20px; } .score-number { font-family: 'Playfair Display', serif; font-size: 72px; font-weight: 700; color: var(--gold); line-height: 1; } .score-label { font-size: 14px; color: var(--sage); margin-top: 4px; } .tier-badge { display: inline-block; padding: 7px 20px; border-radius: 20px; font-size: 13px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; margin-top: 12px; } .tier-badge.trailhead { background: #6B4226; color: #F5DEB3; } .tier-badge.basecamp { background: var(--moss); color: var(--white); } .tier-badge.summit { background: var(--teal); color: var(--white); } .tier-badge.pioneer { background: var(--gold); color: var(--forest); } .tier-desc { color: var(--sage); font-size: 15px; max-width: 500px; margin: 12px auto 0; font-weight: 300; line-height: 1.6; } /* ── RESULTS BODY ────────────────────────────────── */ .results-body { padding-top: 32px; } .results-section-title { font-family: 'Playfair Display', serif; font-size: 20px; color: var(--forest); font-weight: 700; margin-bottom: 16px; margin-top: 32px; } .chart-wrap { background: var(--white); border: 1px solid var(--gray-lt); border-radius: 10px; padding: 24px; } .recs-grid { display: grid; gap: 14px; margin-top: 16px; } .rec-card { background: var(--white); border: 1px solid var(--gray-lt); border-left: 4px solid var(--moss); border-radius: 0 10px 10px 0; padding: 16px 18px; } .rec-card.priority { border-left-color: var(--gold); } .rec-section-tag { font-size: 10px; letter-spacing: 1.5px; text-transform: uppercase; color: var(--moss); font-weight: 700; margin-bottom: 5px; } .rec-card.priority .rec-section-tag { color: var(--bark); } .rec-title { font-size: 14px; font-weight: 700; color: var(--charcoal); margin-bottom: 5px; } .rec-desc { font-size: 13px; color: var(--gray); line-height: 1.55; } .score-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 12px; margin-top: 16px; } .score-card { background: var(--white); border: 1px solid var(--gray-lt); border-radius: 10px; padding: 14px 12px; text-align: center; } .score-card-label { font-size: 11px; color: var(--gray); margin-bottom: 6px; line-height: 1.3; } .score-card-value { font-family: 'Playfair Display', serif; font-size: 26px; font-weight: 700; } .score-card-bar { height: 4px; border-radius: 2px; background: var(--gray-lt); margin-top: 8px; } .score-card-fill { height: 4px; border-radius: 2px; background: var(--moss); } .cta-box { background: var(--forest); border-radius: 12px; padding: 32px 28px; text-align: center; margin-top: 32px; } .cta-box h3 { font-family: 'Playfair Display', serif; color: var(--white); font-size: 22px; margin-bottom: 10px; } .cta-box p { color: var(--sage); font-size: 14px; margin-bottom: 20px; font-weight: 300; } .cta-actions { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; } .btn-cta-primary { background: var(--gold); color: var(--forest); border: none; padding: 12px 26px; border-radius: 6px; font-family: inherit; font-size: 14px; font-weight: 700; cursor: pointer; } .btn-cta-secondary { background: transparent; color: var(--white); border: 1px solid rgba(255,255,255,0.35); padding: 12px 26px; border-radius: 6px; font-family: inherit; font-size: 14px; cursor: pointer; transition: background 0.2s; } .btn-cta-secondary:hover { background: rgba(255,255,255,0.08); } .restart-row { text-align: center; margin-top: 20px; } .btn-restart { background: none; border: none; color: var(--gray); font-size: 13px; cursor: pointer; text-decoration: underline; font-family: inherit; } @media print { .btn-start, .nav-row, .cta-box, .btn-restart { display: none !important; } body { background: white; } .top-bar { print-color-adjust: exact; } } @media (max-width: 520px) { .intro-hero { padding: 40px 20px 36px; } .results-hero { padding: 30px 20px 28px; } .score-number { font-size: 56px; } .cta-actions { flex-direction: column; align-items: center; } } </style><!-- TOP BAR --><div class="top-bar"><div class="top-bar-logo">Recreation <span>Consulting</span></div>
<div class="top-bar-tag">Campsites 2.0</div></div><!-- PROGRESS (hidden on intro/results) --><div class="progress-wrap" id="progressWrap"><div class="progress-steps" id="progressSteps"></div>
<div class="progress-label" id="progressLabel"></div></div><div class="container"><!-- ═══════════════════════════════════ INTRO ═══ --><div class="screen active" id="screen-intro"><div class="intro-hero"><div class="intro-badge">Free Assessment</div>
<h1>Smart Campground<br>Readiness Assessment</h1><p>Find out exactly where your campground stands — and what to prioritize next to modernize operations and grow revenue.</p><button class="btn-start" onclick="startAssessment()">Begin Assessment →</button></div>
<div class="intro-cards"><div class="intro-card"><span class="intro-card-icon">📋</span><h3>27 Questions</h3><p>Across 6 critical areas of campground operations and technology readiness</p></div>
<div class="intro-card"><span class="intro-card-icon">📊</span><h3>Instant Score</h3><p>Receive your readiness score, tier rating, and section-by-section breakdown</p></div>
<div class="intro-card"><span class="intro-card-icon">🎯</span><h3>Prioritized Recommendations</h3><p>Tailored next steps ranked by impact based on your specific answers</p></div>
</div><div class="intro-meta"><div class="intro-meta-item"><div class="intro-meta-dot"></div>Takes about 8 minutes</div>
<div class="intro-meta-item"><div class="intro-meta-dot"></div>No account required</div>
<div class="intro-meta-item"><div class="intro-meta-dot"></div>Immediately actionable</div>
</div></div><!-- ═══════════════════════════════ QUESTIONS ═══ --><div class="screen" id="screen-questions"><div class="section-header"><div class="section-eyebrow" id="sectionEyebrow"></div>
<div class="section-title" id="sectionTitle"></div><div class="section-desc" id="sectionDesc"></div>
</div><div id="questionsBody"></div><div class="validation-msg" id="validationMsg">Please answer all questions before continuing.</div>
<div class="nav-row"><button class="btn-back" id="btnBack" onclick="goBack()">← Back</button><button class="btn-next" id="btnNext" onclick="goNext()">Next Section →</button></div>
</div><!-- ════════════════════════════════ RESULTS ═══ --><div class="screen" id="screen-results"><div class="results-hero"><div class="results-eyebrow">Your Readiness Assessment Results</div>
<div class="score-ring-wrap"><div class="score-number" id="resultScore">--</div><div class="score-label">out of 100</div>
</div><div id="tierBadge"></div><div class="tier-desc" id="tierDesc"></div></div>
<div class="results-body"><div class="results-section-title">Score by Category</div>
<div class="score-grid" id="scoreGrid"></div><div class="results-section-title" style="margin-top:36px;">Detailed Breakdown</div>
<div class="chart-wrap"><div style="position:relative;height:280px;"><canvas id="resultsChart"></canvas></div>
</div><div class="results-section-title" style="margin-top:36px;">Priority Recommendations</div>
<p style="font-size:13px;color:var(--gray);margin-bottom:16px;">Based on your lowest-scoring areas, here are your highest-impact next steps.</p><div class="recs-grid" id="recsGrid"></div>
<div class="cta-box"><h3>Ready to move from assessment to action?</h3><p>Our team can build you a full Smart Campground Implementation Plan — with vendor selection, QR registration setup, data architecture design, and quarterly analytics reports.</p><div class="cta-actions"><button class="btn-cta-primary" onclick="alert('Contact us at info@recreationconsulting.com to schedule your discovery call.')">Schedule a Discovery Call</button><button class="btn-cta-secondary" onclick="window.print()">Download / Print Results</button></div>
</div><div class="restart-row"><button class="btn-restart" onclick="restartAssessment()">Retake the assessment</button></div>
</div></div></div><!-- /container --><script>
const SECTIONS = [
  {
    id: 'registration', title: 'Registration & Check-In',
    desc: 'How visitors currently book, arrive, and check in at your campground.',
    maxScore: 20, minScore: 5,
    recs: {
      low: {
        title: 'Deploy QR code check-in as your first digital touchpoint',
        desc: 'A QR code registration system costs under $500 to implement and immediately begins capturing structured visitor data. This single step eliminates paper, cuts check-in time by 60%, and unlocks analytics capabilities for the first time.'
      },
      mid: {
        title: 'Integrate your booking platform with on-site check-in',
        desc: 'Your booking data and check-in process are currently disconnected. Bridging them with a unified platform like Campspot or CampLife ensures visitor data flows automatically from booking to arrival — no re-entry, no errors.'
      }
    },
    questions: [
      { q: 'How do visitors currently register and check in?', opts: [
        'Entirely paper-based on arrival',
        'Phone or email bookings with paper check-in on arrival',
        'Third-party booking platform, paper check-in on arrival',
        'Online booking with digital or QR code check-in'
      ]},
      { q: 'Do you offer an online reservation system?', opts: [
        'No — walk-ins only',
        'Basic phone or email booking only',
        'Third-party platform (e.g., ReserveAmerica, Campspot)',
        'Own branded online booking system with direct booking'
      ]},
      { q: 'How do you currently process payment?', opts: [
        'Cash only on arrival',
        'Cash and card accepted on arrival',
        'Online payment at booking, plus card option on arrival',
        'Fully digital — online payment required, no cash transactions'
      ]},
      { q: 'How long does a typical check-in take per party?', opts: [
        '15 minutes or more',
        '10 to 15 minutes',
        '5 to 10 minutes',
        'Under 5 minutes or fully self-serve kiosk'
      ]},
      { q: 'What structured visitor data do you collect at check-in?', opts: [
        'None — no data captured',
        'Name and dates of stay only',
        'Basic contact info and site assignment',
        'Full profile: home ZIP, group size, vehicle type, special requests'
      ]}
    ]
  },
  {
    id: 'technology', title: 'Technology Infrastructure',
    desc: 'The digital tools, connectivity, and physical tech systems supporting your operations.',
    maxScore: 20, minScore: 5,
    recs: {
      low: {
        title: 'Start with a campground management software platform',
        desc: 'Tools like CampReservations, Newbook, or Campspot cost $100–$300/month and immediately give you digital reservations, site maps, payment processing, and basic reporting. This is the single highest-ROI technology investment for a low-tech operation.'
      },
      mid: {
        title: 'Upgrade to a full-site WiFi mesh network',
        desc: 'Campground-grade mesh networks (Meraki, Ubiquiti) run $2,000–$8,000 installed depending on acreage. Beyond guest satisfaction, the network becomes the backbone for every future IoT sensor, kiosk, and digital tool you deploy.'
      }
    },
    questions: [
      { q: 'What is your current WiFi situation on site?', opts: [
        'No WiFi available anywhere',
        'Basic router in the office or store only',
        'Partial coverage in some areas of the campground',
        'Full-site mesh network with zone-level bandwidth management'
      ]},
      { q: 'Do you use any digital signage, kiosks, or self-service stations?', opts: [
        'None — printed signage only',
        'One or two static digital screens',
        'Digital signage in key areas (entrance, bathhouse)',
        'Interactive kiosks for self-check-in, maps, or information'
      ]},
      { q: 'What devices and software does your staff use for daily operations?', opts: [
        'Paper binders, phone calls, and a landline',
        'Personal smartphones used informally',
        'Shared tablet or computer with basic software',
        'Dedicated management devices running campground management software'
      ]},
      { q: 'Do you use any IoT sensors or automated monitoring equipment?', opts: [
        'None',
        'Basic security cameras only',
        'Some utility monitoring (water meters or electric)',
        'Full IoT suite: occupancy, utilities, and environmental sensors'
      ]},
      { q: 'How is your electrical hookup infrastructure set up?', opts: [
        'No hookups offered',
        'Basic 30-amp with manual billing at check-in',
        '30/50-amp available with metered billing',
        'Smart pedestals with automated metering and EV charging capability'
      ]}
    ]
  },
  {
    id: 'data', title: 'Data Collection & Analytics',
    desc: 'How you capture, store, and use visitor and operational data to make decisions.',
    maxScore: 20, minScore: 5,
    recs: {
      low: {
        title: 'Design a minimum viable data capture framework',
        desc: 'Even without new software, you can standardize what 5 pieces of data every visitor provides: home ZIP code, group size, party type, vehicle type, and how they heard about you. This baseline, collected consistently over one season, transforms your ability to understand and serve your visitors.'
      },
      mid: {
        title: 'Build a simple occupancy and revenue tracking dashboard',
        desc: 'A well-designed Google Sheets or Airtable dashboard — linked to your booking platform exports — can give you monthly occupancy rates, revenue per site, and seasonal trends within days of setup. Our team can build this template for you.'
      }
    },
    questions: [
      { q: 'How do you currently track occupancy rates?', opts: [
        'No tracking — no records kept',
        'Mental estimates or occasional visual headcounts',
        'Manual spreadsheet updated monthly',
        'Automated system or dashboard with real-time occupancy data'
      ]},
      { q: 'How well do you know your typical visitor profile?', opts: [
        'We don\'t collect this — no idea',
        'General sense from staff observations only',
        'Some demographic data from booking platform',
        'Detailed segmentation by demographics, origin, preferences, and behavior'
      ]},
      { q: 'Do you analyze seasonal revenue and demand patterns?', opts: [
        'No financial tracking beyond annual totals',
        'Annual total revenue only',
        'Monthly revenue tracked manually in spreadsheets',
        'Site-level revenue analysis with trend forecasting'
      ]},
      { q: 'Have you ever used visitor or operational data to make a business decision?', opts: [
        'Never — we have no data to use',
        'Rarely, and mostly gut-feel based',
        'Occasionally, based on booking platform reports',
        'Regularly — data directly drives staffing, pricing, and capital investment'
      ]},
      { q: 'Do you benchmark your campground against regional peers or industry standards?', opts: [
        'No benchmarking done',
        'Informal comparisons with nearby competitors',
        'Industry reports reviewed occasionally',
        'Formal benchmarking with tracked KPIs compared against industry peers'
      ]}
    ]
  },
  {
    id: 'staff', title: 'Staff & Operations',
    desc: 'Your team\'s readiness, processes, and operational maturity for technology adoption.',
    maxScore: 16, minScore: 4,
    recs: {
      low: {
        title: 'Begin with a staff digital readiness audit',
        desc: 'Before selecting technology, assess your team\'s comfort with smartphones, tablets, and basic software. A half-day training investment paired with a "digital champion" staff role dramatically improves adoption rates for any new system.'
      },
      mid: {
        title: 'Formalize operating procedures before adding technology',
        desc: 'Technology amplifies what already exists — if processes are undocumented, new tools will be used inconsistently. Spending two weeks documenting your 10 most common operational tasks creates the foundation for successful digital transformation.'
      }
    },
    questions: [
      { q: 'How comfortable is your team with adopting new digital tools?', opts: [
        'Very uncomfortable — strong preference for paper and familiar routines',
        'Basic smartphone comfort, but resistant to new software',
        'Comfortable with apps and standard business software',
        'Tech-savvy team that adopts and champions new tools quickly'
      ]},
      { q: 'Do you have documented standard operating procedures (SOPs)?', opts: [
        'No — everything is informal and held in people\'s heads',
        'Some informal notes, but nothing formalized',
        'Written procedures for most key tasks',
        'Full SOPs with digital workflows, checklists, and onboarding materials'
      ]},
      { q: 'How do you currently track and manage maintenance requests?', opts: [
        'Word of mouth with no tracking',
        'Paper log kept in the office',
        'Shared spreadsheet or email chain',
        'Work order management system with full history and follow-up tracking'
      ]},
      { q: 'How long has your current management team operated this campground?', opts: [
        'This is our first or second season',
        '2 to 3 seasons',
        '4 to 7 seasons',
        '8 or more seasons'
      ]}
    ]
  },
  {
    id: 'visitor', title: 'Visitor Experience',
    desc: 'The digital touchpoints and services shaping how your guests interact with the campground.',
    maxScore: 16, minScore: 4,
    recs: {
      low: {
        title: 'Create a digital campground map as your first visitor-facing upgrade',
        desc: 'A simple PDF or web-based campground map emailed at booking costs almost nothing to produce and immediately improves arrival experience, reduces "where do I go?" staff questions by 30–40%, and sets the stage for future app integration.'
      },
      mid: {
        title: 'Launch a post-stay feedback survey',
        desc: 'A 5-question automated survey sent 24 hours after check-out (using free tools like Google Forms or Typeform) begins building a visitor satisfaction database. Three seasons of data will reveal patterns invisible to even the most experienced operators.'
      }
    },
    questions: [
      { q: 'How do visitors navigate the campground after arriving?', opts: [
        'Verbal directions from staff only',
        'Printed paper map handed out on arrival',
        'PDF map emailed or texted before arrival',
        'Interactive digital map, app, or QR-accessible site map'
      ]},
      { q: 'How do visitors communicate with staff while on site?', opts: [
        'Walk to the office in person only',
        'Phone calls to the main office number',
        'Text or email on an informal, ad-hoc basis',
        'Dedicated app, QR helpdesk link, or structured digital communication channel'
      ]},
      { q: 'Can visitors digitally book amenities such as pavilions, kayaks, or equipment?', opts: [
        'No — everything is walk-up, first-come basis',
        'Phone reservation for one or two amenities',
        'Online booking available for some amenities',
        'Full digital booking system for all reservable amenities'
      ]},
      { q: 'How do you collect visitor feedback and satisfaction data?', opts: [
        'We don\'t collect feedback',
        'Ask verbally at check-out occasionally',
        'Paper comment card available at the office',
        'Automated post-stay digital survey with tracked results and trend analysis'
      ]}
    ]
  },
  {
    id: 'strategic', title: 'Strategic & Financial Readiness',
    desc: 'Your organization\'s appetite, capacity, and direction for technology investment.',
    maxScore: 16, minScore: 4,
    recs: {
      low: {
        title: 'Build a 3-year Smart Campground Vision and Technology Roadmap',
        desc: 'Without a clear strategic direction, technology investments become reactive and disconnected. A one-day facilitated planning session with our team produces a prioritized, phased roadmap aligned with your revenue goals, budget constraints, and team capacity.'
      },
      mid: {
        title: 'Develop a technology business case for leadership',
        desc: 'Resistance to change is often resistance to uncertainty. A well-structured ROI analysis — showing occupancy lift, labor savings, and no-show reduction — built on your actual booking data, turns a "why would we?" into a "how soon can we start?"'
      }
    },
    questions: [
      { q: 'Is there a budget currently allocated for technology improvements?', opts: [
        'No budget and technology is not a current priority',
        'Would consider it if costs were very minimal',
        'Some budget available in the range of $1,000 to $5,000',
        'Meaningful budget committed at $5,000 or more'
      ]},
      { q: 'How would you describe leadership\'s attitude toward operational change?', opts: [
        'Resistant — strongly prefer the current way of doing things',
        'Cautious — would need considerable convincing and proof',
        'Open — willing to try things with guidance and support',
        'Eager — actively looking for ways to improve and grow'
      ]},
      { q: 'What is your primary goal for the campground over the next 3 years?', opts: [
        'Maintain current operations with minimal change',
        'Modest improvements or incremental revenue growth',
        'Significant revenue growth or occupancy increase',
        'Major expansion, rebranding, or becoming a regional destination'
      ]},
      { q: 'Have you previously worked with an outside consultant or technology vendor?', opts: [
        'No, and would be uncomfortable doing so',
        'No, but we would be open to considering it',
        'Yes, a minor or short-term engagement',
        'Yes, we have had successful ongoing consulting partnerships'
      ]}
    ]
  }
];

const TIER_CONFIG = {
  trailhead: { label: 'Trailhead', cls: 'trailhead', range: [0, 24],
    desc: 'Your campground is at the start of its smart technology journey. The good news: the foundations are straightforward to build, and even small first steps will deliver visible results quickly.' },
  basecamp: { label: 'Base Camp', cls: 'basecamp', range: [25, 49],
    desc: 'You have some digital foundations in place, but significant gaps remain. Targeted investments in registration and data collection will unlock your first real analytics capabilities.' },
  summit: { label: 'Summit Trail', cls: 'summit', range: [50, 74],
    desc: 'Your campground is modernizing well. With the right strategy, you\'re positioned to turn your existing data into a competitive advantage and meaningfully grow revenue this season.' },
  pioneer: { label: 'Pioneer', cls: 'pioneer', range: [75, 100],
    desc: 'You\'re operating at the leading edge of campground technology. Focus now on deepening your analytics, optimizing IoT data flows, and turning visitor intelligence into a revenue machine.' }
};

let currentSection = 0;
let answers = {}; // answers[sectionIdx][questionIdx] = score (1-4)
let resultsChart = null;

function startAssessment() {
  document.getElementById('screen-intro').classList.remove('active');
  document.getElementById('screen-questions').classList.add('active');
  document.getElementById('progressWrap').style.display = 'block';
  renderSection(0);
}

function renderSection(idx) {
  currentSection = idx;
  const sec = SECTIONS[idx];
  document.getElementById('sectionEyebrow').textContent = `Section ${idx + 1} of ${SECTIONS.length}`;
  document.getElementById('sectionTitle').textContent = sec.title;
  document.getElementById('sectionDesc').textContent = sec.desc;

  const body = document.getElementById('questionsBody');
  body.innerHTML = '';

  sec.questions.forEach((q, qi) => {
    const saved = answers[idx] ? answers[idx][qi] : null;
    const block = document.createElement('div');
    block.className = 'question-block' + (saved !== null ? ' answered' : '');
    block.id = `qblock-${qi}`;
    block.innerHTML = `
      <div class="question-num">Q${qi + 1}</div>
      <div class="question-text">${q.q}</div>
      <div class="options">
        ${q.opts.map((opt, oi) => `
          <label class="option-label">
            <input type="radio" name="q${qi}" value="${oi + 1}" ${saved === oi + 1 ? 'checked' : ''}>
            <div class="radio-dot"><div class="radio-fill"></div></div>
            ${opt}
          </label>
        `).join('')}
      </div>
    `;
    body.appendChild(block);
  });

  // Attach change listeners to mark answered
  sec.questions.forEach((_, qi) => {
    document.querySelectorAll(`input[name="q${qi}"]`).forEach(inp => {
      inp.addEventListener('change', () => {
        document.getElementById(`qblock-${qi}`).classList.add('answered');
        if (!answers[idx]) answers[idx] = {};
        answers[idx][qi] = parseInt(inp.value);
        document.getElementById('validationMsg').classList.remove('show');
      });
    });
  });

  updateProgress(idx);
  updateNavButtons(idx);
  window.scrollTo({ top: 0, behavior: 'smooth' });
}

function updateProgress(idx) {
  const steps = document.getElementById('progressSteps');
  steps.innerHTML = SECTIONS.map((s, i) => {
    let cls = i < idx ? 'done' : (i === idx ? 'active' : '');
    return `<div class="progress-step ${cls}" title="${s.title}"></div>`;
  }).join('');
  document.getElementById('progressLabel').textContent =
    `${SECTIONS[idx].title}  ·  ${idx + 1} of ${SECTIONS.length}`;
}

function updateNavButtons(idx) {
  const btnBack = document.getElementById('btnBack');
  const btnNext = document.getElementById('btnNext');
  btnBack.style.visibility = idx === 0 ? 'hidden' : 'visible';
  const isLast = idx === SECTIONS.length - 1;
  btnNext.textContent = isLast ? 'Submit & See Results' : 'Next Section →';
  btnNext.className = isLast ? 'btn-submit' : 'btn-next';
}

function allAnswered() {
  const sec = SECTIONS[currentSection];
  if (!answers[currentSection]) return false;
  return sec.questions.every((_, qi) => answers[currentSection][qi] !== undefined);
}

function goNext() {
  if (!allAnswered()) {
    document.getElementById('validationMsg').classList.add('show');
    const firstUnanswered = SECTIONS[currentSection].questions.findIndex((_, qi) =>
      !answers[currentSection] || answers[currentSection][qi] === undefined
    );
    if (firstUnanswered >= 0) {
      document.getElementById(`qblock-${firstUnanswered}`).scrollIntoView({ behavior: 'smooth', block: 'center' });
    }
    return;
  }
  document.getElementById('validationMsg').classList.remove('show');
  if (currentSection < SECTIONS.length - 1) {
    renderSection(currentSection + 1);
  } else {
    showResults();
  }
}

function goBack() {
  if (currentSection > 0) renderSection(currentSection - 1);
}

function calcScores() {
  return SECTIONS.map((sec, si) => {
    const raw = Object.values(answers[si] || {}).reduce((a, b) => a + b, 0);
    const pct = Math.round((raw - sec.minScore) / (sec.maxScore - sec.minScore) * 100);
    return Math.max(0, Math.min(100, pct));
  });
}

function calcOverall() {
  const totalMax = SECTIONS.reduce((a, s) => a + s.maxScore, 0);
  const totalMin = SECTIONS.reduce((a, s) => a + s.minScore, 0);
  const totalRaw = SECTIONS.reduce((a, s, si) =>
    a + Object.values(answers[si] || {}).reduce((x, y) => x + y, 0), 0);
  return Math.max(0, Math.min(100, Math.round((totalRaw - totalMin) / (totalMax - totalMin) * 100)));
}

function getTier(score) {
  for (const [key, t] of Object.entries(TIER_CONFIG)) {
    if (score >= t.range[0] && score <= t.range[1]) return { key, ...t };
  }
  return { key: 'pioneer', ...TIER_CONFIG.pioneer };
}

function getScoreColor(pct) {
  if (pct >= 75) return '#4A7C59';
  if (pct >= 50) return '#2E7D6B';
  if (pct >= 25) return '#C9A84C';
  return '#B45309';
}

function showResults() {
  document.getElementById('screen-questions').classList.remove('active');
  document.getElementById('progressWrap').style.display = 'none';
  document.getElementById('screen-results').classList.add('active');
  window.scrollTo({ top: 0, behavior: 'smooth' });

  const overall = calcOverall();
  const sectionScores = calcScores();
  const tier = getTier(overall);

  document.getElementById('resultScore').textContent = overall;
  document.getElementById('tierBadge').innerHTML =
    `<div class="tier-badge ${tier.cls}">${tier.label}</div>`;
  document.getElementById('tierDesc').textContent = tier.desc;

  // Score mini cards
  const grid = document.getElementById('scoreGrid');
  grid.innerHTML = sectionScores.map((sc, i) => `
    <div class="score-card">
      <div class="score-card-label">${SECTIONS[i].title}</div>
      <div class="score-card-value" style="color:${getScoreColor(sc)}">${sc}<span style="font-size:14px;color:var(--gray)">%</span></div>
      <div class="score-card-bar"><div class="score-card-fill" style="width:${sc}%;background:${getScoreColor(sc)}"></div></div>
    </div>
  `).join('');

  // Chart
  if (resultsChart) resultsChart.destroy();
  const ctx = document.getElementById('resultsChart').getContext('2d');
  const labels = SECTIONS.map(s => s.title);
  const colors = sectionScores.map(getScoreColor);
  resultsChart = new Chart(ctx, {
    type: 'bar',
    data: {
      labels,
      datasets: [{
        label: 'Readiness %',
        data: sectionScores,
        backgroundColor: colors.map(c => c + '33'),
        borderColor: colors,
        borderWidth: 2,
        borderRadius: 5,
      }]
    },
    options: {
      responsive: true,
      maintainAspectRatio: false,
      plugins: { legend: { display: false } },
      scales: {
        y: {
          min: 0, max: 100,
          ticks: { callback: v => v + '%', color: '#6B7280', font: { size: 11 } },
          grid: { color: '#E8E6E1' }
        },
        x: {
          ticks: { color: '#6B7280', font: { size: 11 }, maxRotation: 30 },
          grid: { display: false }
        }
      }
    }
  });

  // Recommendations — sort by lowest score, show top 4
  const sorted = sectionScores
    .map((sc, i) => ({ idx: i, score: sc }))
    .sort((a, b) => a.score - b.score);

  const recsEl = document.getElementById('recsGrid');
  recsEl.innerHTML = sorted.slice(0, 4).map(({ idx, score }, rank) => {
    const sec = SECTIONS[idx];
    const rec = score < 50 ? sec.recs.low : sec.recs.mid;
    const isPriority = rank === 0;
    return `
      <div class="rec-card ${isPriority ? 'priority' : ''}">
        <div class="rec-section-tag">${isPriority ? '🔥 Top Priority · ' : ''}${sec.title} — ${score}%</div>
        <div class="rec-title">${rec.title}</div>
        <div class="rec-desc">${rec.desc}</div>
      </div>
    `;
  }).join('');
}

function restartAssessment() {
  answers = {};
  currentSection = 0;
  document.getElementById('screen-results').classList.remove('active');
  document.getElementById('screen-intro').classList.add('active');
  window.scrollTo({ top: 0, behavior: 'smooth' });
}
</script></div>
</div></div></div></div></div></div> ]]></content:encoded><pubDate>Mon, 23 Feb 2026 21:05:52 +0000</pubDate></item></channel></rss>