handleiding_nieuw:sub_spacematrix
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| handleiding_nieuw:sub_spacematrix [2025/05/07 09:39] – support | handleiding_nieuw:sub_spacematrix [2026/01/31 10:06] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| <html lang=" | <html lang=" | ||
| < | < | ||
| + | <script src=" | ||
| + | <script src=" | ||
| + | <script src=" | ||
| <meta charset=" | <meta charset=" | ||
| - | < | + | < |
| + | | ||
| < | < | ||
| - | body { font-family: | + | /* ========== Tabs ========== */ |
| - | .tabs { display: flex; gap: 10px; margin-bottom: 15px; } | + | |
| - | .tab { padding: | + | .tabs{ |
| - | .tab.active { background: #f0f0f0; font-weight: | + | |
| - | .tabcontent { display: none; border: 1px solid #ccc; padding: 15px; border-radius: | + | |
| - | .tabcontent.active { display: block; } | + | |
| - | .inputrow { display: flex; align-items: | + | padding: 0; |
| - | .inputrow label { width: 240px; } | + | flex-wrap:wrap; |
| - | .inputrow input { width: 80px; } | + | } |
| - | table { border-collapse: | + | |
| - | th, td { border: 1px solid #ccc; padding: 5px; text-align: right; } | + | .tab{ |
| - | th { background: #f0f0f0; } | + | |
| - | td: | + | |
| - | .kaartcontainer { position: relative; max-width: 350px; margin-top: 20px; } | + | |
| - | .kaartcontainer img { width: 100%; display: block; } | + | border:1px solid #cfcfcf; |
| - | .stipje { position: absolute; width: 14px; height: 14px; background: red; border-radius: | + | border-bottom: |
| - | </ | + | |
| + | color:# | ||
| + | font-weight: | ||
| + | user-select: | ||
| + | } | ||
| + | |||
| + | .tab:hover{ background:# | ||
| + | |||
| + | .tab.active{ | ||
| + | | ||
| + | position: | ||
| + | top:1px; | ||
| + | | ||
| + | } | ||
| + | |||
| + | .tabcontent{ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .tabcontent.active{ display: | ||
| + | |||
| + | @media (max-width: 900px){ | ||
| + | .tabs{ gap:6px; } | ||
| + | } | ||
| + | |||
| + | |||
| + | body { font-family: | ||
| + | |||
| + | | ||
| + | .inputrow label { width: 240px; } | ||
| + | .inputrow input { width: 80px; } | ||
| + | |||
| + | | ||
| + | th, td { border: 1px solid #ccc; padding: 5px; text-align: right; } | ||
| + | th { background: #f0f0f0; } | ||
| + | td: | ||
| + | |||
| + | | ||
| + | .kaartcontainer img { width: 100%; display: block; } | ||
| + | .stipje { position: absolute; width: 14px; height: 14px; background: red; border-radius: | ||
| + | |||
| + | | ||
| + | |||
| + | /* ========== Header + Scenario bar ========== */ | ||
| + | .pageheader{ | ||
| + | display: | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | gap:16px; | ||
| + | margin-bottom: | ||
| + | } | ||
| + | |||
| + | .pageheader h1{ | ||
| + | margin:0; | ||
| + | line-height: | ||
| + | } | ||
| + | |||
| + | |||
| + | .scenario-bar{ | ||
| + | display: | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | gap:12px; | ||
| + | flex-wrap: | ||
| + | } | ||
| + | |||
| + | .scenario-left{ | ||
| + | display: | ||
| + | flex-direction: | ||
| + | gap:4px; | ||
| + | min-width: | ||
| + | flex:1; | ||
| + | } | ||
| + | |||
| + | .scenario-left select{ | ||
| + | height: | ||
| + | padding:0 10px; | ||
| + | border-radius: | ||
| + | border:1px solid #c9d6d6; | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .scenario-right{ | ||
| + | display: | ||
| + | align-items: | ||
| + | gap:8px; | ||
| + | flex-wrap: | ||
| + | justify-content: | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn{ | ||
| + | height: | ||
| + | padding:0 10px; | ||
| + | border-radius: | ||
| + | border:1px solid #c9d6d6; | ||
| + | background:# | ||
| + | color:# | ||
| + | font-weight: | ||
| + | cursor: | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn: | ||
| + | background:# | ||
| + | border-color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.primary{ | ||
| + | background:# | ||
| + | border-color:# | ||
| + | color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.primary: | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.danger{ | ||
| + | background:# | ||
| + | border-color:# | ||
| + | color:# | ||
| + | } | ||
| + | |||
| + | .scenario-right .btn.danger: | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | # | ||
| + | # | ||
| + | |||
| + | |||
| + | /* ====== Spacematrix legenda (onder invoervelden, | ||
| + | |||
| + | .sm-legend{ | ||
| + | margin-top: 14px; | ||
| + | border: 1px solid #c9d6d6; | ||
| + | border-radius: | ||
| + | background: #fff; | ||
| + | padding: 6px 8px; | ||
| + | max-width: 250px; | ||
| + | min-height: 118px; | ||
| + | margin-bottom: | ||
| + | } | ||
| + | |||
| + | .sm-legend-title{ | ||
| + | margin: 0 0 6px 0; | ||
| + | font-size: 0.84rem; | ||
| + | font-weight: | ||
| + | color: #113333; | ||
| + | } | ||
| + | |||
| + | .sm-legend-grid{ | ||
| + | display: grid; | ||
| + | grid-template-columns: | ||
| + | gap: 5px; | ||
| + | } | ||
| + | |||
| + | .sm-legend-item{ | ||
| + | display: grid; | ||
| + | grid-template-columns: | ||
| + | gap: 6px; | ||
| + | align-items: | ||
| + | font-size: 0.80rem; | ||
| + | line-height: | ||
| + | color: #1f3e3e; | ||
| + | } | ||
| + | |||
| + | .sm-zone-badge{ | ||
| + | width: 18px; | ||
| + | height: 18px; | ||
| + | border-radius: | ||
| + | font-size: 0.68rem; | ||
| + | font-weight: | ||
| + | background: #e9f1f1; | ||
| + | border: 1px solid #c9d6d6; | ||
| + | color: #113333; | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | } | ||
| + | |||
| + | .sm-legend-short{ | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | gap: 4px; | ||
| + | } | ||
| + | |||
| + | /* Info-icoon (klein en rustig) */ | ||
| + | .sm-legend-i{ | ||
| + | width: 16px; | ||
| + | height: 16px; | ||
| + | border-radius: | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | justify-content: | ||
| + | font-size: 0.72rem; | ||
| + | font-weight: | ||
| + | border: 1px solid #c9d6d6; | ||
| + | background: #f4f7f7; | ||
| + | color: #2b4a4a; | ||
| + | cursor: help; | ||
| + | user-select: | ||
| + | } | ||
| + | |||
| + | /* ====== Tooltip mechaniek ======*/ | ||
| + | |||
| + | .sm-tip{ | ||
| + | position: relative; | ||
| + | display: inline-flex; | ||
| + | align-items: | ||
| + | } | ||
| + | |||
| + | /* Tooltip bubble */ | ||
| + | .sm-tip:: | ||
| + | content: attr(data-tip); | ||
| + | position: absolute; | ||
| + | left: 0; | ||
| + | top: calc(100% + 8px); | ||
| + | width: 260px; | ||
| + | max-width: 70vw; | ||
| + | background: #113333; | ||
| + | color: #fff; | ||
| + | padding: 8px 10px; | ||
| + | border-radius: | ||
| + | font-size: 0.8rem; | ||
| + | line-height: | ||
| + | box-shadow: 0 8px 18px rgba(0, | ||
| + | opacity: 0; | ||
| + | transform: translateY(-4px); | ||
| + | pointer-events: | ||
| + | transition: opacity 120ms ease, transform 120ms ease; | ||
| + | z-index: 50; | ||
| + | white-space: | ||
| + | } | ||
| + | |||
| + | /* Tooltip pijltje */ | ||
| + | .sm-tip:: | ||
| + | content: ""; | ||
| + | position: absolute; | ||
| + | left: 10px; | ||
| + | top: calc(100% + 2px); | ||
| + | border: 6px solid transparent; | ||
| + | border-bottom-color: | ||
| + | opacity: 0; | ||
| + | transform: translateY(-4px); | ||
| + | pointer-events: | ||
| + | transition: opacity 120ms ease, transform 120ms ease; | ||
| + | z-index: 51; | ||
| + | } | ||
| + | |||
| + | /* Toon tooltip bij hover/focus */ | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | .sm-tip: | ||
| + | opacity: 1; | ||
| + | transform: translateY(0); | ||
| + | } | ||
| + | |||
| + | /* Toegankelijk: | ||
| + | .sm-legend-i: | ||
| + | outline: none; | ||
| + | box-shadow: 0 0 0 3px rgba(0, 116, 217, 0.18); | ||
| + | border-color: | ||
| + | } | ||
| + | |||
| + | /* Mobiel: iets breder tooltip */ | ||
| + | @media (max-width: 600px){ | ||
| + | .sm-tip:: | ||
| + | } | ||
| + | |||
| + | </style> | ||
| + | |||
| + | |||
| + | <script src=" | ||
| </ | </ | ||
| < | < | ||
| - | <h1>Spacematrix & Voorzieningen</h1> | + | |
| + | <div class=" | ||
| + | | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | <select id=" | ||
| + | <span id=" | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <span id=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <!-- RESPONSIVE VOOR MOBIELE TELEFOONS --> | ||
| + | <div class=" | ||
| + | < | ||
| + | Deze pagina bevat interactieve grafieken en tabellen die zijn ontworpen voor gebruik op een groter scherm. | ||
| + | Voor een beter overzicht kun je je telefoon liggend houden of deze pagina openen op een tablet of laptop. | ||
| + | </ | ||
| + | |||
| <div class=" | <div class=" | ||
| + | |||
| <div class=" | <div class=" | ||
| <div class=" | <div class=" | ||
| + | <div class=" | ||
| + | <div class=" | ||
| </ | </ | ||
| <div id=" | <div id=" | ||
| - | <div class=" | + | <div class=" |
| - | <label for=" | + | |
| - | <input id=" | + | <div class=" |
| - | </ | + | |
| - | <div class=" | + | <input id=" |
| - | <label for=" | + | </ |
| - | <input id=" | + | <div class=" |
| - | </ | + | <label for=" |
| - | <div class=" | + | <input id=" |
| - | <label for=" | + | </ |
| - | <input id=" | + | <div class=" |
| - | </ | + | <label for=" |
| - | <div class=" | + | <input id=" |
| - | < | + | </ |
| - | <input id="voorzieningenruimte" type="number" | + | <div class=" |
| + | < | ||
| + | <span id="voorzieningenruimte_display"> | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | <!-- legenda Spacematrix --> | ||
| + | |||
| + | <div class="sm-legend"> | ||
| + | <div class=" | ||
| + | |||
| + | <div class=" | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Low-rise spacious blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Low-rise compact blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise open blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise spacious blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise compact blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise closed blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Mid-rise super-blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | High-rise developments | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| </ | </ | ||
| + | </ | ||
| - | | + | <!-- Einde Legenda en Tooltip |
| - | < | + | |
| - | < | + | </div> |
| - | </ | + | |
| - | <tbody id=" | + | |
| - | < | + | |
| - | < | + | |
| - | </ | + | |
| - | </table> | + | |
| - | | + | |
| - | <img src="https:// | + | <div class=" |
| - | <div class=" | + | <img src="/ |
| + | <div class=" | ||
| + | | ||
| </ | </ | ||
| - | < | + | < |
| - | <div id=" | + | |
| - | < | + | |
| < | < | ||
| - | < | + | |
| - | | + | |
| - | | + | </thead> |
| - | < | + | |
| - | | + | |
| + | < | ||
| + | </tfoot> | ||
| </ | </ | ||
| + | |||
| + | <div style=" | ||
| + | < | ||
| + | Dit komt doordat het aantal woningen iteratief wordt bepaald op basis van de beschikbare ruimte, inclusief ruimte voor voorzieningen en parkeren. | ||
| + | Bij het toepassen van voorzieningen wordt eerst een schatting gemaakt op basis van een voorlopig aantal woningen. Daarna wordt het aantal woningen opnieuw berekend met de benodigde ruimte per woning. | ||
| + | Hierdoor ontstaat een klein verschil tussen het oorspronkelijk berekende totaal en de daadwerkelijk ingepaste voorzieningenruimte. | ||
| + | </ | ||
| + | |||
| + | <div id=" | ||
| + | <div id=" | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | |||
| + | < | ||
| + | <td colspan=" | ||
| + | Kengetallen | ||
| + | </td> | ||
| + | </tr> | ||
| + | |||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| </ | </ | ||
| + | | ||
| + | <div style=" | ||
| + | <button onclick=" | ||
| + | 📄 Kickstart Dump downloaden | ||
| + | </ | ||
| + | </ | ||
| + | | ||
| </ | </ | ||
| Line 89: | Line 527: | ||
| </ | </ | ||
| <div class=" | <div class=" | ||
| - | <button onclick=" | + | < |
| - | <div id=" | + | <div id=" |
| </ | </ | ||
| - | </div> | + | < |
| + | <table id=" | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | <tbody id=" | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </table> | ||
| - | < | ||
| - | const types = ["egw sociaal", | ||
| - | const voorzieningen = [ | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | { naam: " | ||
| - | ]; | ||
| - | function switchTab(tabId) { | + | <div style=" |
| - | document.querySelectorAll(' | + | |
| - | | + | |
| - | | + | |
| - | | + | </ |
| - | } | + | </ |
| - | function renderWoningtypes() { | + | <div id="parkeren" |
| - | const tbody = document.getElementById("woningtypes"); | + | |
| - | tbody.innerHTML | + | < |
| - | | + | |
| - | const row = document.createElement("tr"); | + | <input id=" |
| - | | + | </div> |
| - | <td>${type}</td> | + | |
| - | <td>< | + | <label>BVO per parkeerplaats (m²):</ |
| - | <td>< | + | |
| - | <td id="aantal_${i}"> | + | </ |
| - | <td id="totbvo_${i}"> | + | <div class=" |
| - | | + | < |
| - | tbody.appendChild(row); | + | <input id=" |
| - | | + | |
| - | } | + | <div class=" |
| + | < | ||
| + | | ||
| + | | ||
| + | <div class="inputrow"> | ||
| + | <button id="btn_parkeren" | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| - | function updateStipje(fsi, gsi) { | + | <div id=" |
| - | | + | < |
| - | const x = Math.min(100, Math.max(0, gsi * 190)); | + | < |
| - | const y = Math.max(0, Math.min(100, (3 - fsi) * 35)); | + | |
| - | | + | < |
| - | | + | <select id="stedelijkheidstype" |
| - | } | + | < |
| + | <option value=" | ||
| + | <option value=" | ||
| + | <option value=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | <p style=" | ||
| + | | ||
| + | | ||
| + | </ | ||
| - | function updateSummary(bvoTot, | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | } | ||
| - | function updateLaadvermogen() { | + | <script src="/ |
| - | const opp = parseFloat(document.getElementById("opp").value); | + | |
| - | const fsi = parseFloat(document.getElementById("fsi" | + | |
| - | const gsi = parseFloat(document.getElementById(" | + | |
| - | const bvoTot = opp * fsi; | + | |
| - | const voorzieningenruimte = parseFloat(document.getElementById(" | + | |
| - | updateStipje(fsi, | ||
| - | let gewogenBVO = 0; | ||
| - | let totalPerc = 0; | ||
| - | const details = []; | ||
| - | for (let i = 0; i < types.length; | ||
| - | const perc = parseFloat(document.getElementById(`perc_${i}`).value) || 0; | ||
| - | const bvo = parseFloat(document.getElementById(`bvo_${i}`).value) || 0; | ||
| - | gewogenBVO += (perc / 100) * bvo; | ||
| - | totalPerc += perc; | ||
| - | details.push({ i, perc, bvo }); | ||
| - | } | ||
| - | if (gewogenBVO === 0) return; | ||
| - | |||
| - | let woningen = Math.floor(bvoTot / (gewogenBVO + voorzieningenruimte)); | ||
| - | let sumWon = 0; | ||
| - | let sumBVO = 0; | ||
| - | let wonPerType = []; | ||
| - | let restant = woningen; | ||
| - | |||
| - | for (let i = 0; i < details.length; | ||
| - | const { perc } = details[i]; | ||
| - | let aant = (perc / 100) * woningen; | ||
| - | let afgerond = Math.floor(aant); | ||
| - | wonPerType.push(afgerond); | ||
| - | restant -= afgerond; | ||
| - | } | ||
| - | const decimaalSort = details.map((d, | ||
| - | .sort((a, b) => b.rest - a.rest); | ||
| - | for (let j = 0; j < restant; j++) { | ||
| - | wonPerType[decimaalSort[j].i]++; | ||
| - | } | ||
| - | for (let i = 0; i < details.length; | ||
| - | const aant = wonPerType[i]; | ||
| - | const bvoTot = aant * details[i].bvo; | ||
| - | document.getElementById(`aantal_${i}`).innerText = aant; | ||
| - | document.getElementById(`totbvo_${i}`).innerText = bvoTot.toFixed(0); | ||
| - | sumWon += aant; | ||
| - | sumBVO += bvoTot; | ||
| - | } | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | document.getElementById(" | ||
| - | |||
| - | document.getElementById(" | ||
| - | `< | ||
| - | |||
| - | const voorzieningenTot = sumWon * voorzieningenruimte; | ||
| - | const wonenRuimte = bvoTot - voorzieningenTot; | ||
| - | updateSummary(bvoTot, | ||
| - | } | ||
| - | |||
| - | function maakVoorzieningentabel() { | ||
| - | const tbody = document.getElementById(" | ||
| - | voorzieningen.forEach((v, | ||
| - | const row = document.createElement(" | ||
| - | row.innerHTML = ` | ||
| - | < | ||
| - | < | ||
| - | < | ||
| - | `; | ||
| - | tbody.appendChild(row); | ||
| - | }); | ||
| - | } | ||
| - | |||
| - | function berekenVoorzieningenruimte() { | ||
| - | const bewonersPerWoning = parseFloat(document.getElementById(" | ||
| - | const woningen = parseFloat(document.getElementById(" | ||
| - | const totaalBewoners = woningen * bewonersPerWoning; | ||
| - | |||
| - | let totaal_m2 = 0; | ||
| - | voorzieningen.forEach((v, | ||
| - | const checked = document.getElementById(`vchk_${i}`).checked; | ||
| - | if (checked) { | ||
| - | totaal_m2 += v.norm * totaalBewoners / 1000; | ||
| - | } | ||
| - | }); | ||
| - | const m2_per_woning = woningen > 0 ? totaal_m2 / woningen : 0; | ||
| - | document.getElementById(" | ||
| - | `< | ||
| - | document.getElementById(" | ||
| - | updateLaadvermogen(); | ||
| - | } | ||
| - | |||
| - | window.onload = () => { | ||
| - | renderWoningtypes(); | ||
| - | maakVoorzieningentabel(); | ||
| - | updateLaadvermogen(); | ||
| - | }; | ||
| - | </ | ||
| </ | </ | ||
| </ | </ | ||
| - | |||
handleiding_nieuw/sub_spacematrix.1746610765.txt.gz · Last modified: 2025/05/07 09:39 by support