't Hooge Holt
Plattegrond laden...
var stage = document.getElementById("hhStage"); var viewportEl = document.getElementById("hhViewport"); var canvas = document.getElementById("hhCanvas"); var markers = document.getElementById("hhMarkers"); var loader = document.getElementById("hhLoader"); var search = document.getElementById("hhSearch"); var suggestions = document.getElementById("hhSuggestions"); var reset = document.getElementById("hhReset"); var zoomIn = document.getElementById("hhZoomIn"); var zoomOut = document.getElementById("hhZoomOut"); var baseWidth = 0; var baseHeight = 0; var zoom = 1; var panX = 0; var panY = 0; var minZoom = 1; var raf = 0; var pointers = {}; var isDragging = false; var startX = 0; var startY = 0; var startPanX = 0; var startPanY = 0; var pinchStartDistance = 0; var pinchStartZoom = 1; function clamp(value, min, max) { return Math.min(max, Math.max(min, value)); } function applyTransform() { if (!baseWidth || !baseHeight) return; var scaledWidth = baseWidth * zoom; var scaledHeight = baseHeight * zoom; var minX = Math.min(0, stage.clientWidth - scaledWidth); var minY = Math.min(0, stage.clientHeight - scaledHeight); panX = clamp(panX, minX, 0); panY = clamp(panY, minY, 0); viewportEl.style.transform = "translate3d(" + panX + "px," + panY + "px,0) scale(" + zoom + ")"; } function scheduleTransform() { if (raf) return; raf = requestAnimationFrame(function () { raf = 0; applyTransform(); }); } function resetView() { if (!baseWidth || !baseHeight) return; minZoom = Math.min(stage.clientWidth / baseWidth, stage.clientHeight / baseHeight); zoom = Math.max(minZoom, window.matchMedia("(max-width: 700px)").matches ? minZoom * 1.65 : minZoom); panX = (stage.clientWidth - baseWidth * zoom) / 2; panY = (stage.clientHeight - baseHeight * zoom) / 2; applyTransform(); } function zoomAt(nextZoom, clientX, clientY) { if (!baseWidth || !baseHeight) return; var oldZoom = zoom; nextZoom = clamp(nextZoom, minZoom, minZoom * 5); var rect = stage.getBoundingClientRect(); var originX = typeof clientX === "number" ? clientX - rect.left : rect.width / 2; var originY = typeof clientY === "number" ? clientY - rect.top : rect.height / 2; var mapX = (originX - panX) / oldZoom; var mapY = (originY - panY) / oldZoom; zoom = nextZoom; panX = originX - mapX * zoom; panY = originY - mapY * zoom; scheduleTransform(); } function renderMarkers() { markers.innerHTML = ""; OBJECTS.forEach(function (object) { var link = document.createElement("a"); link.className = "hh-map__marker"; link.href = object.url; link.target = "_blank"; link.rel = "noopener noreferrer"; link.textContent = object.number; link.title = "Object " + object.number; link.dataset.number = String(object.number); link.style.left = object.x + "%"; link.style.top = object.y + "%"; markers.appendChild(link); }); } function filterMarkers() { var value = search.value.trim(); document.querySelectorAll(".hh-map__marker").forEach(function (marker) { var match = !value || marker.dataset.number.indexOf(value) !== -1; marker.classList.toggle("is-hidden", !match); marker.classList.toggle("is-active", Boolean(value && marker.dataset.number === value)); }); renderSuggestions(); } function renderSuggestions() { var value = search.value.trim(); if (!value) { suggestions.hidden = true; suggestions.innerHTML = ""; return; } var matches = OBJECTS.filter(function (object) { return String(object.number).indexOf(value) !== -1; }).slice(0, 10); suggestions.innerHTML = matches.length ? matches.map(function (object) { return ''; }).join("") : '
Geen object gevonden
'; suggestions.hidden = false; } async function renderPdf() { if (!window.pdfjsLib) throw new Error("PDF.js niet geladen"); pdfjsLib.GlobalWorkerOptions.workerSrc = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js"; var pdf = await pdfjsLib.getDocument(PDF_URL).promise; var page = await pdf.getPage(1); var viewportBase = page.getViewport({ scale: 1 }); var renderWidth = Math.min(1600, Math.max(1000, stage.clientWidth * 1.6)); var scale = renderWidth / viewportBase.width; var viewport = page.getViewport({ scale: scale }); var dpr = Math.min(window.devicePixelRatio || 1, 2); baseWidth = Math.round(viewport.width); baseHeight = Math.round(viewport.height); canvas.width = Math.round(baseWidth * dpr); canvas.height = Math.round(baseHeight * dpr); canvas.style.width = baseWidth + "px"; canvas.style.height = baseHeight + "px"; viewportEl.style.width = baseWidth + "px"; viewportEl.style.height = baseHeight + "px"; markers.style.width = baseWidth + "px"; markers.style.height = baseHeight + "px"; var ctx = canvas.getContext("2d", { alpha: false }); ctx.setTransform(dpr, 0, 0, dpr, 0, 0); await page.render({ canvasContext: ctx, viewport: viewport }).promise; loader.style.display = "none"; resetView(); } search.addEventListener("input", filterMarkers); reset.addEventListener("click", function () { search.value = ""; suggestions.hidden = true; filterMarkers(); resetView(); }); suggestions.addEventListener("click", function (event) { var button = event.target.closest(".hh-map__suggestion[data-number]"); if (!button) return; search.value = button.dataset.number; suggestions.hidden = true; filterMarkers(); }); if (zoomIn) zoomIn.addEventListener("click", function () { zoomAt(zoom * 1.25); }); if (zoomOut) zoomOut.addEventListener("click", function () { zoomAt(zoom / 1.25); }); stage.addEventListener("wheel", function (event) { event.preventDefault(); zoomAt(zoom * (event.deltaY > 0 ? 0.9 : 1.1), event.clientX, event.clientY); }, { passive: false }); stage.addEventListener("pointerdown", function (event) { if (event.target.closest(".hh-map__marker")) return; pointers[event.pointerId] = { x: event.clientX, y: event.clientY }; stage.setPointerCapture(event.pointerId); var ids = Object.keys(pointers); if (ids.length === 1) { isDragging = true; stage.classList.add("is-dragging"); startX = event.clientX; startY = event.clientY; startPanX = panX; startPanY = panY; } if (ids.length === 2) { var a = pointers[ids[0]]; var b = pointers[ids[1]]; pinchStartDistance = Math.hypot(a.x - b.x, a.y - b.y); pinchStartZoom = zoom; } }); stage.addEventListener("pointermove", function (event) { if (!pointers[event.pointerId]) return; pointers[event.pointerId] = { x: event.clientX, y: event.clientY }; var ids = Object.keys(pointers); if (ids.length === 2) { var a = pointers[ids[0]]; var b = pointers[ids[1]]; var dist = Math.hypot(a.x - b.x, a.y - b.y); var centerX = (a.x + b.x) / 2; var centerY = (a.y + b.y) / 2; if (pinchStartDistance) zoomAt(pinchStartZoom * (dist / pinchStartDistance), centerX, centerY); return; } if (isDragging && ids.length === 1) { panX = startPanX + event.clientX - startX; panY = startPanY + event.clientY - startY; scheduleTransform(); } }); function endPointer(event) { delete pointers[event.pointerId]; if (Object.keys(pointers).length === 0) { isDragging = false; stage.classList.remove("is-dragging"); } } stage.addEventListener("pointerup", endPointer); stage.addEventListener("pointercancel", endPointer); window.addEventListener("resize", function () { clearTimeout(window.hhMapResizeTimer); window.hhMapResizeTimer = setTimeout(resetView, 150); }); renderMarkers(); renderPdf().catch(function (error) { console.error(error); loader.textContent = "Plattegrond kon niet worden geladen."; }); })();
Plattegrond laden...