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:35] – support | handleiding_nieuw:sub_spacematrix [2026/01/31 10:06] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | <div id="summary"> | + | <html> |
| - | <h3>Samenvatting</h3> | + | <html lang="nl"> |
| - | <table> | + | <head> |
| - | <tr>< | + | <script src=" |
| - | <tr><td>Voorzieningenruimte totaal | + | <script src=" |
| - | <tr><td>Voorzieningenruimte per woning | + | <script src=" |
| - | <tr><td>Woonruimte | + | <meta charset=" |
| - | <tr><td>Totaal aantal woningen</td><td id="summary_woningen"> | + | < |
| - | </table> | + | |
| + | < | ||
| + | /* ========== Tabs ========== */ | ||
| + | |||
| + | .tabs{ | ||
| + | display: | ||
| + | gap:6px; | ||
| + | margin: 12px 0 0 0; | ||
| + | padding: 0; | ||
| + | flex-wrap: | ||
| + | } | ||
| + | |||
| + | .tab{ | ||
| + | padding:8px 12px; | ||
| + | background:# | ||
| + | cursor: | ||
| + | border:1px solid #cfcfcf; | ||
| + | border-bottom: | ||
| + | border-radius: | ||
| + | color:# | ||
| + | font-weight: | ||
| + | user-select: | ||
| + | } | ||
| + | |||
| + | .tab:hover{ background:# | ||
| + | |||
| + | .tab.active{ | ||
| + | background:# | ||
| + | position: | ||
| + | top:1px; | ||
| + | font-weight: | ||
| + | } | ||
| + | |||
| + | .tabcontent{ | ||
| + | display: | ||
| + | border:1px solid #cfcfcf; | ||
| + | padding: | ||
| + | border-radius: | ||
| + | background:# | ||
| + | } | ||
| + | |||
| + | .tabcontent.active{ display: | ||
| + | |||
| + | @media (max-width: 900px){ | ||
| + | .tabs{ gap:6px; } | ||
| + | } | ||
| + | |||
| + | |||
| + | body { font-family: | ||
| + | |||
| + | .inputrow { display: flex; align-items: | ||
| + | .inputrow label { width: 240px; } | ||
| + | .inputrow input { width: 80px; } | ||
| + | |||
| + | table { border-collapse: | ||
| + | th, td { border: 1px solid #ccc; padding: 5px; text-align: right; } | ||
| + | th { background: #f0f0f0; } | ||
| + | td: | ||
| + | |||
| + | .kaartcontainer { position: relative; max-width: 350px; margin-top: 20px; } | ||
| + | .kaartcontainer img { width: 100%; display: block; } | ||
| + | .stipje { position: absolute; width: 14px; height: 14px; background: red; border-radius: | ||
| + | |||
| + | .perc-warning{ color: #b00020; font-weight: | ||
| + | |||
| + | /* ========== 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=" | ||
| + | </ | ||
| + | < | ||
| + | |||
| + | |||
| + | <div class=" | ||
| + | < | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | <select id=" | ||
| + | | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <!-- 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> | ||
| + | |||
| + | |||
| + | <div class=" | ||
| + | |||
| + | | ||
| + | <div class=" | ||
| + | | ||
| + | <div class=" | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | <div class=" | ||
| + | <div class=" | ||
| + | <div class=" | ||
| + | <label for=" | ||
| + | <input id=" | ||
| + | | ||
| + | <div class=" | ||
| + | | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | <label for=" | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | | ||
| + | <input type=" | ||
| + | | ||
| + | |||
| + | <!-- legenda Spacematrix --> | ||
| + | |||
| + | <div class=" | ||
| + | <div class=" | ||
| + | |||
| + | | ||
| + | |||
| + | <div class=" | ||
| + | <span class=" | ||
| + | <div class=" | ||
| + | Low-rise spacious blocks | ||
| + | <span class=" | ||
| + | <span class=" | ||
| + | </span> | ||
| + | </div> | ||
| </ | </ | ||
| + | |||
| + | <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 class=" | + | |
| - | < | + | </div> |
| - | <input id="bewoners_per_woning" | + | |
| + | |||
| + | <div class=" | ||
| + | <img src="/ | ||
| + | <div class="stipje" | ||
| </ | </ | ||
| + | </ | ||
| + | |||
| + | <div class=" | ||
| < | < | ||
| - | | + | |
| - | < | + | < |
| - | </ | + | </ |
| - | <tbody id="voorzieningentabel"></ | + | <tbody id="woningtypes"></ |
| + | < | ||
| + | < | ||
| + | </tfoot> | ||
| </ | </ | ||
| - | | + | |
| - | <button onclick="berekenVoorzieningenruimte()"> | + | |
| - | <div id="voorziening_resultaat"></ | + | < |
| + | 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=" | ||
| + | < | ||
| + | <table> | ||
| + | <tr>< | ||
| + | < | ||
| + | <tr>< | ||
| + | < | ||
| + | |||
| + | < | ||
| + | <td colspan=" | ||
| + | Kengetallen | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </table> | ||
| </ | </ | ||
| + | </ | ||
| + | | ||
| + | <div style=" | ||
| + | <button onclick=" | ||
| + | 📄 Kickstart Dump downloaden | ||
| + | </ | ||
| + | </ | ||
| + | | ||
| </ | </ | ||
| - | <script> | + | <div id=" |
| - | function updateStipje(fsi, | + | < |
| - | const stip = document.getElementById("stipje"); | + | |
| - | | + | <input id=" |
| - | | + | </ |
| - | | + | < |
| - | | + | |
| - | } | + | < |
| - | document.addEventListener("DOMContentLoaded", () => { | + | |
| - | | + | |
| - | document.getElementById("summary_bvo").innerText | + | </ |
| - | | + | < |
| - | | + | |
| - | | + | < |
| - | | + | </ |
| - | }; | + | < |
| + | <table id="voorzieningen_totaal"> | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | <tbody id="voorziening_summary_tabel"></ | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| - | window.updateLaadvermogen = function() { | ||
| - | const opp = parseFloat(document.getElementById(" | ||
| - | const fsi = parseFloat(document.getElementById(" | ||
| - | const gsi = parseFloat(document.getElementById(" | ||
| - | const bvoTot = opp * fsi; | ||
| - | const voorzieningenruimte = parseFloat(document.getElementById(" | ||
| - | updateStipje(fsi, | + | <div style=" |
| + | < | ||
| + | Nadat dit oppervlak per woning is berekend, wordt het aantal woningen in het rekenblok opnieuw doorgerekend. Hierdoor kan het werkelijke totaal afwijken. | ||
| + | Deze iteratieve aanpak is nodig omdat de benodigde ruimte per woning invloed heeft op hoeveel woningen uiteindelijk in het plan passen. | ||
| + | </ | ||
| + | </ | ||
| - | let gewogenBVO | + | <div id=" |
| - | let totalPerc | + | < |
| - | const details = []; | + | < |
| - | for (let i = 0; i < 10; i++) { | + | |
| - | const perc = parseFloat(document.getElementById(`perc_${i}`).value) || 0; | + | < |
| - | const bvo = parseFloat(document.getElementById(`bvo_${i}`).value) || 0; | + | </ |
| - | | + | <div class=" |
| - | | + | < |
| - | | + | <input id=" |
| - | } | + | </ |
| - | | + | <div class=" |
| + | < | ||
| + | < | ||
| + | </ | ||
| + | <div class=" | ||
| + | < | ||
| + | <input id=" | ||
| + | </ | ||
| + | <div class=" | ||
| + | <button id=" | ||
| + | <div id=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| - | let woningen | + | <div id=" |
| - | | + | < |
| - | | + | < |
| - | let wonPerType | + | < |
| - | let restant | + | < |
| + | <select id=" | ||
| + | <option value=" | ||
| + | <option value=" | ||
| + | <option value=" | ||
| + | <option value=" | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | <p style=" | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| - | 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("output" | + | <script src="/wiki/tools/ |
| - | `< | + | |
| - | const voorzieningenTot = sumWon * voorzieningenruimte; | ||
| - | const wonenRuimte = bvoTot - voorzieningenTot; | ||
| - | updateSummary(bvoTot, | ||
| - | }; | ||
| - | }); | ||
| - | </ | ||
| </ | </ | ||
| </ | </ | ||
| - | |||
handleiding_nieuw/sub_spacematrix.1746610552.txt.gz · Last modified: 2025/05/07 09:35 by support