{"id":2601,"date":"2026-10-02T17:23:45","date_gmt":"2026-10-02T15:23:45","guid":{"rendered":"https:\/\/cad-kompass.de\/?p=2601"},"modified":"2026-10-03T09:42:18","modified_gmt":"2026-10-03T07:42:18","slug":"projektmassstab-rechner","status":"publish","type":"post","link":"https:\/\/cad-kompass.de\/?p=2601","title":{"rendered":"Projektma\u00dfstab-Rechner"},"content":{"rendered":"\n<style data-pmr-stil>\n    .pmr-box {\n        --pmr-primary: #3f5f75;\n        --pmr-primary-dark: #2c4a5e;\n        --pmr-primary-deep: #1e3548;\n        --pmr-error: #dc2626;\n        --pmr-good: #059669;\n        --pmr-good-deep: #15803d;\n        --pmr-accent: #e8913a;\n        --pmr-warn: #d97706;\n        --pmr-ink: #1e293b;\n        --pmr-text: #334155;\n        --pmr-muted: #64748b;\n        --pmr-faint: #94a3b8;\n        --pmr-border: #c8d6e0;\n        --pmr-line: #e2e8f0;\n        --pmr-surface: #f7f9fb;\n        --pmr-fill: #eef4f8;\n        \/* Schriftfarbe in den gelben Hinweiszeilen, ein Ton fuer Text und Auszeichnung. *\/\n        --pmr-warn-text: #92700c;\n        \/* Werkzeugspezifisch: das Quadrat vor einer Hinweiszeile. Bewusst EIN neutraler Blaugrau-Ton\n           fuer alle Zeilen. Der Rechner nennt einen Befund, er bewertet den Standort nicht. *\/\n        --pmr-quadrat: #7d93a4;\n        background: var(--pmr-surface);\n        border: 3px solid var(--pmr-primary);\n        border-radius: 8px;\n        margin: 28px 0;\n        overflow: hidden;\n        position: relative;\n        font-family: inherit;\n        color: var(--pmr-text);\n        line-height: 1.6;\n    }\n    .pmr-box *, .pmr-box *::before, .pmr-box *::after { box-sizing: border-box; }\n\n    .pmr-header {\n        background: linear-gradient(135deg, var(--pmr-primary-deep) 0%, var(--pmr-primary-dark) 100%);\n        padding: 20px 28px 18px;\n        position: relative;\n        overflow: hidden;\n    }\n    .pmr-header::after {\n        content: '';\n        position: absolute;\n        bottom: 0; left: 0; right: 0;\n        height: 3px;\n        background: repeating-linear-gradient(90deg, #3f5f75 0px, #3f5f75 8px, transparent 8px, transparent 12px);\n    }\n    .pmr-header-top { display: flex; align-items: center; gap: 12px; }\n    .pmr-header-icon { width: 36px; height: 36px; flex-shrink: 0; opacity: 0.9; }\n    .pmr-box .pmr-box-title {\n        font-size: 1.15rem; font-weight: 700; color: #fff;\n        margin: 0; padding: 0; letter-spacing: 0.01em; display: block;\n    }\n    .pmr-box .pmr-box-desc {\n        font-size: 0.85rem; color: rgba(255,255,255,0.66);\n        margin: 4px 0 0; padding: 0; line-height: 1.5; display: block;\n    }\n\n    .pmr-body { padding: 22px 28px 24px; }\n\n    .pmr-privacy {\n        background: #f0fdf4;\n        border: 1px solid #bbf7d0;\n        border-radius: 3px;\n        padding: 9px 14px;\n        margin-bottom: 14px;\n        font-size: 0.8rem;\n        color: #15803d;\n        line-height: 1.5;\n        display: flex; align-items: flex-start; gap: 8px;\n    }\n    .pmr-privacy::before { content: '\\1F512'; flex-shrink: 0; font-size: 0.9rem; line-height: 1.5; }\n\n    .pmr-intro {\n        background: var(--pmr-fill);\n        border-left: 3px solid var(--pmr-primary);\n        border-radius: 0 4px 4px 0;\n        padding: 12px 16px;\n        margin-bottom: 16px;\n        font-size: 0.84rem;\n        color: var(--pmr-text);\n    }\n    .pmr-intro p { margin: 0 0 8px; }\n    .pmr-intro p:last-child { margin-bottom: 0; }\n    .pmr-intro strong { color: var(--pmr-ink); }\n\n    .pmr-panel {\n        background: #fff;\n        border: 1px solid var(--pmr-border);\n        border-radius: 4px;\n        padding: 14px 16px 16px;\n        margin-bottom: 14px;\n    }\n    .pmr-panel-title {\n        font-size: 0.75rem;\n        font-weight: 700;\n        color: var(--pmr-muted);\n        text-transform: uppercase;\n        letter-spacing: 0.06em;\n        margin: 0 0 10px;\n    }\n\n    .pmr-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px 14px; }\n    .pmr-grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 14px; }\n    .pmr-field { margin: 0; min-width: 0; }\n    .pmr-field-wide { grid-column: 1 \/ -1; }\n    .pmr-label {\n        font-size: 0.74rem;\n        font-weight: 700;\n        color: var(--pmr-muted);\n        letter-spacing: 0.03em;\n        margin-bottom: 4px;\n        display: block;\n    }\n    .pmr-hint-inline { font-size: 0.72rem; color: var(--pmr-faint); margin-top: 3px; line-height: 1.45; }\n\n    .pmr-box .pmr-input {\n        width: 100%;\n        padding: 8px 11px !important;\n        font-family: inherit !important;\n        font-size: 0.86rem !important;\n        line-height: 1.4 !important;\n        border: 1px solid var(--pmr-border) !important;\n        border-radius: 3px !important;\n        color: var(--pmr-ink) !important;\n        background: #fff !important;\n        box-shadow: none !important;\n        -webkit-appearance: none !important;\n        appearance: none !important;\n        transition: border-color 0.15s, box-shadow 0.15s;\n    }\n    .pmr-box .pmr-input:focus {\n        outline: none !important;\n        border-color: var(--pmr-primary) !important;\n        box-shadow: 0 0 0 2px rgba(63,95,117,0.12) !important;\n    }\n    .pmr-box .pmr-input::placeholder { color: var(--pmr-faint); }\n    .pmr-box .pmr-input:disabled {\n        background: #f1f5f9 !important;\n        color: var(--pmr-faint) !important;\n        border-color: var(--pmr-line) !important;\n        cursor: not-allowed !important;\n    }\n    .pmr-box .pmr-input-num { max-width: 130px; text-align: right; font-variant-numeric: tabular-nums; }\n\n    \/* Schieberegler: box-gescopt, durchgaengig !important, Elementhintergrund als Spurfarbe und\n       transparente Spur-Pseudoelemente. Ohne das zeigt manches WP-Theme eine Doppellinie. *\/\n    .pmr-box .pmr-range {\n        -webkit-appearance: none !important;\n        -moz-appearance: none !important;\n        appearance: none !important;\n        width: 100% !important;\n        height: 6px !important;\n        padding: 0 !important;\n        margin: 10px 0 6px !important;\n        background: #dbe4ec !important;\n        border: 0 !important;\n        border-radius: 3px !important;\n        outline: none !important;\n        box-shadow: none !important;\n        box-sizing: border-box !important;\n        display: block !important;\n        cursor: pointer !important;\n    }\n    .pmr-box .pmr-range::-webkit-slider-runnable-track {\n        -webkit-appearance: none !important;\n        appearance: none !important;\n        height: 6px !important;\n        background: transparent !important;\n        border: 0 !important;\n        box-shadow: none !important;\n    }\n    .pmr-box .pmr-range::-webkit-slider-thumb {\n        -webkit-appearance: none !important;\n        appearance: none !important;\n        width: 18px !important;\n        height: 18px !important;\n        border-radius: 50% !important;\n        background: #3f5f75 !important;\n        border: 2px solid #fff !important;\n        box-shadow: 0 1px 3px rgba(0,0,0,0.22) !important;\n        margin-top: -6px !important;\n        cursor: pointer !important;\n    }\n    .pmr-box .pmr-range::-moz-range-track {\n        height: 6px !important;\n        background: transparent !important;\n        border: 0 !important;\n        box-shadow: none !important;\n    }\n    .pmr-box .pmr-range::-moz-range-thumb {\n        -moz-appearance: none !important;\n        appearance: none !important;\n        width: 18px !important;\n        height: 18px !important;\n        border-radius: 50% !important;\n        background: #3f5f75 !important;\n        border: 2px solid #fff !important;\n        box-shadow: 0 1px 3px rgba(0,0,0,0.22) !important;\n        cursor: pointer !important;\n    }\n    .pmr-box .pmr-range::-moz-focus-outer { border: 0 !important; }\n    .pmr-box .pmr-range:focus-visible { box-shadow: 0 0 0 2px rgba(63,95,117,0.28) !important; }\n    .pmr-box .pmr-range:disabled { opacity: 0.4 !important; cursor: not-allowed !important; }\n    .pmr-box .pmr-range:disabled::-webkit-slider-thumb { background: #94a3b8 !important; cursor: not-allowed !important; }\n    .pmr-box .pmr-range:disabled::-moz-range-thumb { background: #94a3b8 !important; cursor: not-allowed !important; }\n\n    .pmr-range-row { display: flex; align-items: baseline; gap: 8px; }\n    .pmr-range-row .pmr-range { flex: 1; min-width: 0; }\n    .pmr-range-val {\n        flex: 0 0 auto;\n        font-size: 0.86rem; font-weight: 800; color: var(--pmr-primary);\n        font-variant-numeric: tabular-nums; white-space: nowrap;\n    }\n    .pmr-range-bounds {\n        display: flex; justify-content: space-between;\n        font-size: 0.68rem; color: var(--pmr-faint);\n        font-variant-numeric: tabular-nums;\n    }\n\n    .pmr-box .pmr-btn {\n        -webkit-appearance: none !important;\n        appearance: none !important;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        min-height: 36px !important;\n        padding: 7px 14px !important;\n        font: inherit !important;\n        font-size: 0.82rem !important;\n        font-weight: 700 !important;\n        line-height: 1.3 !important;\n        border: 1px solid var(--pmr-primary) !important;\n        border-radius: 3px !important;\n        background: #fff !important;\n        color: var(--pmr-primary) !important;\n        cursor: pointer !important;\n        box-shadow: none !important;\n        text-transform: none !important;\n        letter-spacing: normal !important;\n        transition: background 0.15s, color 0.15s, border-color 0.15s;\n    }\n    .pmr-box .pmr-btn:hover { background: var(--pmr-primary) !important; color: #fff !important; border-color: var(--pmr-primary) !important; }\n    .pmr-box .pmr-btn:active { background: var(--pmr-primary-dark) !important; color: #fff !important; border-color: var(--pmr-primary-dark) !important; }\n    .pmr-box .pmr-btn:focus-visible { outline: 2px solid var(--pmr-primary) !important; outline-offset: 2px !important; }\n    .pmr-box .pmr-btn:disabled { opacity: 0.45 !important; cursor: not-allowed !important; background: #f1f5f9 !important; color: var(--pmr-faint) !important; border-color: var(--pmr-border) !important; }\n    .pmr-box .pmr-btn.is-active { background: var(--pmr-primary) !important; color: #fff !important; border-color: var(--pmr-primary) !important; }\n    .pmr-box .pmr-btn-ghost { border-color: var(--pmr-border) !important; color: var(--pmr-muted) !important; font-weight: 600 !important; }\n    .pmr-box .pmr-btn-ghost:hover { background: var(--pmr-fill) !important; color: var(--pmr-ink) !important; border-color: var(--pmr-primary) !important; }\n    .pmr-box .pmr-btn-ghost:active { background: #e2eaf1 !important; color: var(--pmr-primary-deep) !important; border-color: var(--pmr-primary-dark) !important; }\n\n    .pmr-box .pmr-segbtn {\n        -webkit-appearance: none !important;\n        appearance: none !important;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        min-height: 34px !important;\n        padding: 5px 14px !important;\n        font: inherit !important;\n        font-size: 0.81rem !important;\n        font-weight: 600 !important;\n        line-height: 1.3 !important;\n        border: 1px solid var(--pmr-border) !important;\n        border-radius: 3px !important;\n        background: #fff !important;\n        color: var(--pmr-muted) !important;\n        cursor: pointer !important;\n        box-shadow: none !important;\n        text-transform: none !important;\n        letter-spacing: normal !important;\n        transition: background 0.15s, color 0.15s, border-color 0.15s;\n    }\n    .pmr-box .pmr-segbtn:hover { border-color: var(--pmr-primary) !important; color: var(--pmr-ink) !important; }\n    .pmr-box .pmr-segbtn:active { background: #e2eaf1 !important; color: var(--pmr-primary-deep) !important; }\n    .pmr-box .pmr-segbtn:focus-visible { outline: 2px solid var(--pmr-primary) !important; outline-offset: 2px !important; }\n    .pmr-box .pmr-segbtn:disabled { opacity: 0.45 !important; cursor: not-allowed !important; }\n    .pmr-box .pmr-segbtn.is-active {\n        background: var(--pmr-primary) !important;\n        color: #fff !important;\n        border-color: var(--pmr-primary) !important;\n        font-weight: 700 !important;\n    }\n\n    .pmr-seg { display: flex; gap: 7px; flex-wrap: wrap; margin-bottom: 12px; }\n    .pmr-seg-label { font-size: 0.74rem; font-weight: 700; color: var(--pmr-muted); letter-spacing: 0.03em; align-self: center; margin-right: 4px; }\n\n    .pmr-presets { display: flex; gap: 7px; flex-wrap: wrap; margin-bottom: 16px; }\n    .pmr-presets-label { font-size: 0.74rem; font-weight: 700; color: var(--pmr-muted); letter-spacing: 0.03em; align-self: center; margin-right: 4px; }\n\n    .pmr-group { transition: opacity 0.15s; }\n    .pmr-group.is-off { opacity: 0.5; }\n\n    \/* Ergebnis *\/\n    .pmr-result {\n        background: #fff;\n        border: 1px solid var(--pmr-border);\n        border-left: 3px solid var(--pmr-primary);\n        border-radius: 0 4px 4px 0;\n        padding: 14px 18px;\n        margin-bottom: 12px;\n        display: flex;\n        flex-wrap: wrap;\n        align-items: baseline;\n        gap: 6px 18px;\n    }\n    .pmr-result-key { font-size: 0.75rem; font-weight: 700; color: var(--pmr-muted); text-transform: uppercase; letter-spacing: 0.06em; }\n    .pmr-result-val {\n        font-family: 'SF Mono', 'Fira Code', Consolas, 'Liberation Mono', monospace;\n        font-size: 1.9rem;\n        font-weight: 700;\n        color: var(--pmr-primary-deep);\n        line-height: 1.15;\n        font-variant-numeric: tabular-nums;\n    }\n    .pmr-result-note { font-size: 0.78rem; color: var(--pmr-muted); flex: 1 1 220px; }\n\n    .pmr-split { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; margin-bottom: 12px; }\n    .pmr-cell { background: #fff; border: 1px solid var(--pmr-border); border-radius: 4px; padding: 9px 12px; min-width: 0; }\n    .pmr-cell-key { font-size: 0.68rem; font-weight: 800; color: var(--pmr-muted); text-transform: uppercase; letter-spacing: 0.05em; }\n    .pmr-cell-val {\n        font-family: 'SF Mono', 'Fira Code', Consolas, 'Liberation Mono', monospace;\n        font-size: 0.95rem; font-weight: 700; color: var(--pmr-ink);\n        font-variant-numeric: tabular-nums; margin-top: 2px;\n    }\n    .pmr-cell-sub { font-size: 0.72rem; color: var(--pmr-faint); margin-top: 1px; line-height: 1.4; }\n\n    .pmr-note {\n        background: var(--pmr-fill);\n        border: 1px solid #dbe6ee;\n        border-radius: 4px;\n        padding: 10px 14px;\n        font-size: 0.8rem;\n        color: var(--pmr-text);\n        margin-bottom: 14px;\n        line-height: 1.6;\n    }\n    .pmr-note strong { color: var(--pmr-ink); }\n\n    .pmr-fig { margin: 0 0 14px; }\n    .pmr-fig-title {\n        font-size: 0.75rem; font-weight: 700; color: var(--pmr-muted);\n        text-transform: uppercase; letter-spacing: 0.06em; margin: 0 0 6px;\n    }\n    .pmr-fig-frame { background: #fff; border: 1px solid var(--pmr-border); border-radius: 4px; padding: 8px 10px; }\n    .pmr-fig svg { width: 100%; height: auto; display: block; }\n    .pmr-fig-cap { font-size: 0.74rem; color: var(--pmr-muted); margin: 6px 2px 0; line-height: 1.5; }\n\n    .pmr-tab { width: 100%; border-collapse: collapse; font-size: 0.82rem; background: #fff; }\n    .pmr-tab th, .pmr-tab td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--pmr-line); vertical-align: top; }\n    .pmr-tab th { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--pmr-muted); font-weight: 800; }\n    .pmr-tab tr:last-child td { border-bottom: 0; }\n    .pmr-tab .pmr-tab-num {\n        font-family: 'SF Mono', 'Fira Code', Consolas, 'Liberation Mono', monospace;\n        font-variant-numeric: tabular-nums; white-space: nowrap; font-weight: 700; color: var(--pmr-ink);\n    }\n    .pmr-tab-wrap { border: 1px solid var(--pmr-border); border-radius: 4px; overflow: hidden; margin-bottom: 6px; }\n    .pmr-quelle { font-size: 0.72rem; color: var(--pmr-muted); margin: 0 2px 14px; line-height: 1.5; }\n\n    .pmr-befund {\n        background: #fff;\n        border: 1px solid var(--pmr-border);\n        border-left: 3px solid var(--pmr-primary);\n        border-radius: 0 4px 4px 0;\n        padding: 12px 16px;\n        margin-bottom: 14px;\n        font-size: 0.88rem;\n        color: var(--pmr-ink);\n        line-height: 1.65;\n    }\n    .pmr-befund p { margin: 0 0 6px; }\n    .pmr-befund p:last-child { margin-bottom: 0; }\n\n    .pmr-hinweise { margin-bottom: 14px; }\n    .pmr-hinweis {\n        display: flex; gap: 9px; align-items: flex-start;\n        background: #fffbeb;\n        border: 1px solid #fde68a;\n        border-radius: 4px;\n        padding: 8px 12px;\n        font-size: 0.79rem;\n        color: var(--pmr-warn-text);\n        line-height: 1.55;\n        margin-bottom: 6px;\n    }\n    .pmr-hinweis::before {\n        content: '';\n        flex: 0 0 auto;\n        width: 8px; height: 8px;\n        margin-top: 6px;\n        border-radius: 1px;\n        background: var(--pmr-quadrat);\n    }\n\n    .pmr-todo { font-size: 0.84rem; color: var(--pmr-text); margin-bottom: 14px; }\n    .pmr-todo ol { margin: 6px 0 0; padding-left: 20px; }\n    .pmr-todo li { margin-bottom: 5px; }\n\n    .pmr-herkunft {\n        background: #fff;\n        border: 1px solid var(--pmr-border);\n        border-radius: 4px;\n        padding: 14px 16px;\n        font-size: 0.79rem;\n        color: var(--pmr-text);\n        line-height: 1.65;\n        margin-bottom: 14px;\n    }\n    .pmr-herkunft h4 {\n        font-size: 0.75rem; font-weight: 800; color: var(--pmr-muted);\n        text-transform: uppercase; letter-spacing: 0.05em; margin: 0 0 8px;\n    }\n    .pmr-herkunft h5 { font-size: 0.79rem; font-weight: 700; color: var(--pmr-ink); margin: 12px 0 4px; }\n    .pmr-herkunft p { margin: 0 0 7px; }\n    .pmr-herkunft ul { margin: 0 0 7px; padding-left: 18px; }\n    .pmr-herkunft li { margin-bottom: 4px; }\n    .pmr-formel {\n        font-family: 'SF Mono', 'Fira Code', Consolas, 'Liberation Mono', monospace;\n        font-size: 0.78rem;\n        background: var(--pmr-surface);\n        border: 1px solid var(--pmr-line);\n        border-radius: 3px;\n        padding: 9px 12px;\n        margin: 0 0 8px;\n        color: var(--pmr-ink);\n        line-height: 1.9;\n        overflow-x: auto;\n        white-space: pre-wrap;\n    }\n\n    .pmr-toolbar { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }\n\n    .pmr-foot {\n        margin-top: 18px;\n        padding-top: 13px;\n        border-top: 1px solid var(--pmr-border);\n        font-size: 0.75rem;\n        color: var(--pmr-muted);\n        line-height: 1.6;\n    }\n    .pmr-foot p { margin: 0 0 6px; }\n    .pmr-foot p:last-child { margin-bottom: 0; }\n    .pmr-foot strong { color: var(--pmr-primary-dark); }\n\n    \/* Druckblatt: auf dem Bildschirm unsichtbar, im Druck die Hauptdarstellung. *\/\n    .pmr-blatt { display: none; }\n\n    @media (max-width: 860px) {\n        .pmr-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n        .pmr-split { grid-template-columns: 1fr; }\n    }\n    @media (max-width: 620px) {\n        .pmr-header { padding: 16px 18px 15px; }\n        .pmr-body { padding: 18px 18px 20px; }\n        .pmr-grid, .pmr-grid-2 { grid-template-columns: 1fr; }\n        .pmr-result-val { font-size: 1.5rem; }\n        \/* 16px ist die Untergrenze, unter der iOS-Safari beim Antippen eines Feldes hineinzoomt. *\/\n        .pmr-box .pmr-input { font-size: 16px !important; }\n    }\n    @media (pointer: coarse) {\n        .pmr-box .pmr-input { font-size: 16px !important; }\n    }\n    @media (prefers-reduced-motion: reduce) {\n        .pmr-box .pmr-input,\n        .pmr-box .pmr-btn,\n        .pmr-box .pmr-segbtn { transition: none !important; }\n    }\n\n    @media print {\n        @page { size: A4 portrait; margin: 14mm 13mm 18mm; }\n\n        .pmr-box {\n            background: #fff !important;\n            border: 0 !important;\n            border-radius: 0 !important;\n            margin: 0 !important;\n            overflow: visible !important;\n            color: #1e293b !important;\n            line-height: 1.45 !important;\n        }\n        .pmr-body { padding: 0 !important; }\n        .pmr-header,\n        .pmr-privacy,\n        .pmr-intro,\n        .pmr-panel,\n        .pmr-seg,\n        .pmr-presets,\n        .pmr-fig,\n        .pmr-toolbar,\n        .pmr-foot,\n        .pmr-split,\n        .pmr-result,\n        .pmr-note,\n        .pmr-tab-wrap,\n        .pmr-quelle,\n        .pmr-befund,\n        .pmr-hinweise,\n        .pmr-todo,\n        .pmr-herkunft { display: none !important; }\n\n        .pmr-blatt { display: block !important; font-size: 10pt; }\n        .pmr-blatt-kopf { border-bottom: 1pt solid #3f5f75; padding-bottom: 5px; margin-bottom: 10px; page-break-after: avoid; }\n        .pmr-blatt-marke { font-size: 8pt; letter-spacing: 0.08em; text-transform: uppercase; color: #64748b; }\n        .pmr-blatt-title { font-size: 13pt; font-weight: 700; color: #1e3548; margin: 2px 0 3px; }\n        .pmr-blatt-zeile { font-size: 8.4pt; color: #64748b; }\n        .pmr-blatt-blk { margin-top: 11px; page-break-inside: avoid; }\n        .pmr-blatt-blk-title {\n            font-size: 8pt; font-weight: 800; text-transform: uppercase; letter-spacing: 0.06em;\n            color: #64748b; border-bottom: 0.5pt solid #c8d6e0; padding-bottom: 2px; margin-bottom: 4px;\n            page-break-after: avoid;\n        }\n        .pmr-blatt-row { display: flex; gap: 8px; font-size: 9pt; padding: 1.5px 0; page-break-inside: avoid; }\n        .pmr-blatt-key { flex: 0 0 205px; color: #475569; }\n        .pmr-blatt-val { flex: 1; font-weight: 700; color: #1e293b; }\n        .pmr-blatt-gross { font-size: 12pt; font-weight: 700; }\n        .pmr-blatt-text { font-size: 8.6pt; line-height: 1.5; margin: 3px 0 0; color: #334155; }\n        .pmr-blatt-formel {\n            font-family: 'SF Mono', Consolas, monospace;\n            font-size: 7.8pt; line-height: 1.7; white-space: pre-wrap; color: #1e293b; margin: 2px 0 0;\n        }\n        .pmr-blatt-fuss {\n            margin-top: 10px; padding-top: 4px; border-top: 0.5pt solid #c8d6e0;\n            font-size: 7.4pt; line-height: 1.45; color: #64748b; page-break-inside: avoid;\n        }\n    }\n<\/style>\n\n<div class=\"pmr-box\" data-pmr-root>\n    <div class=\"pmr-header\">\n        <div class=\"pmr-header-top\">\n            <svg class=\"pmr-header-icon\" viewBox=\"0 0 36 36\" fill=\"none\" aria-hidden=\"true\">\n                <path d=\"M3 24 Q 18 9, 33 24\" stroke=\"rgba(255,255,255,0.9)\" stroke-width=\"1.8\" fill=\"none\" stroke-linecap=\"round\"\/>\n                <line x1=\"3\" y1=\"20\" x2=\"33\" y2=\"20\" stroke=\"rgba(255,255,255,0.55)\" stroke-width=\"1.6\" stroke-linecap=\"round\"\/>\n                <circle cx=\"10.2\" cy=\"20\" r=\"1.7\" fill=\"rgba(255,255,255,0.9)\"\/>\n                <circle cx=\"25.8\" cy=\"20\" r=\"1.7\" fill=\"rgba(255,255,255,0.9)\"\/>\n                <line x1=\"18\" y1=\"13.5\" x2=\"18\" y2=\"20\" stroke=\"#e8913a\" stroke-width=\"2.2\" stroke-linecap=\"round\"\/>\n                <rect x=\"15.4\" y=\"10.4\" width=\"5.2\" height=\"3.4\" rx=\"1\" fill=\"rgba(255,255,255,0.92)\"\/>\n            <\/svg>\n            <div>\n                <h2 class=\"pmr-box-title\">Projektma\u00dfstab-Rechner<\/h2>\n                <div class=\"pmr-box-desc\">Wie weit laufen Modellma\u00df und Naturma\u00df auf deiner Strecke auseinander, und ab welcher L\u00e4nge ist das zu viel? Lage und H\u00f6he hinein, Ma\u00dfstab, Abweichung und Grenzl\u00e4nge heraus.<\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"pmr-body\">\n        <div class=\"pmr-privacy\">L\u00e4uft komplett im Browser. Keine Daten verlassen deinen Rechner. Es wird nichts hochgeladen, kein Dienst aufgerufen und keine Koordinate an einen Server geschickt. Deine Eingaben bleiben auf diesem Ger\u00e4t und lassen sich jederzeit l\u00f6schen.<\/div>\n\n        <div class=\"pmr-intro\">\n            <p><strong>Wozu das gut ist:<\/strong> Ein Projekt in ETRS89\/UTM liegt nicht ma\u00dfstabsgetreu im Landesnetz. Zwei Anteile ziehen daran: die Abbildung der UTM-Zone und die H\u00f6he \u00fcber dem Ellipsoid. Zusammen ergeben sie den Projektma\u00dfstab. Der Rechner zeigt, wie viele Zentimeter das auf deiner Strecke ausmacht und nach wie vielen Metern die Grenzabweichung erreicht ist, auf die sich das deutsche Regelwerk beruft.<\/p>\n            <p><strong>Zur Einordnung:<\/strong> F\u00fcr eine Rechnung, die du einem Auftraggeber vorlegen kannst, gibt es ein amtliches Online-Formular, \u201eETRS89\/UTM-Projektma\u00dfstab und Planungskoordinatensystem&#8220; aus den Baufachlichen Richtlinien Vermessung, betreut vom Landesamt GeoInformation Bremen, Seitenstand 2025, frei zug\u00e4nglich und ohne Anmeldung. Es rechnet dieselbe Beziehung und liefert zus\u00e4tzlich Transformationsparameter.<\/p>\n            <p>Dieser Rechner hier ist die didaktische Vorstufe des Online-Formulars: Er verlangt f\u00fcr den Einstieg keine Vermessungskoordinaten, er zeigt, warum der Ma\u00dfstab an Lage und H\u00f6he h\u00e4ngt, und er legt jede Zahl offen. Die Zahl f\u00fcr den Auftraggeber holst du dir beim amtlichen Formular.<\/p>\n        <\/div>\n\n        <div class=\"pmr-panel\">\n            <p class=\"pmr-panel-title\">Kopfdaten f\u00fcr das Druckblatt<\/p>\n            <div class=\"pmr-grid\">\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrKopfProjekt\">Projekt<\/label>\n                    <input type=\"text\" class=\"pmr-input\" id=\"pmrKopfProjekt\" placeholder=\"Gemeindestra\u00dfe Musterstadt\" autocomplete=\"off\">\n                <\/div>\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrKopfBearbeiter\">Bearbeiter<\/label>\n                    <input type=\"text\" class=\"pmr-input\" id=\"pmrKopfBearbeiter\" placeholder=\"Name\" autocomplete=\"off\">\n                <\/div>\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrKopfDatum\">Datum<\/label>\n                    <input type=\"text\" class=\"pmr-input\" id=\"pmrKopfDatum\" placeholder=\"TT.MM.JJJJ\" autocomplete=\"off\">\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"pmr-panel\">\n            <p class=\"pmr-panel-title\">Wo liegt das Projekt?<\/p>\n\n            <div class=\"pmr-seg\" role=\"group\" aria-label=\"Eingabeart\">\n                <span class=\"pmr-seg-label\">Eingabeart<\/span>\n                <button type=\"button\" class=\"pmr-segbtn is-active\" id=\"pmrModusGrob\" data-modus=\"grob\">ungef\u00e4hr<\/button>\n                <button type=\"button\" class=\"pmr-segbtn\" id=\"pmrModusKoord\" data-modus=\"koord\">aus Koordinaten<\/button>\n            <\/div>\n\n            <div class=\"pmr-grid-2 pmr-group\" id=\"pmrGruppeGrob\">\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrY\">Abstand vom Mittelmeridian<\/label>\n                    <div class=\"pmr-range-row\">\n                        <input type=\"range\" class=\"pmr-range\" id=\"pmrY\" min=\"0\" max=\"300\" step=\"1\" value=\"0\">\n                        <span class=\"pmr-range-val\" id=\"pmrYVal\">0 km<\/span>\n                    <\/div>\n                    <div class=\"pmr-range-bounds\"><span>0 km, Mittelmeridian<\/span><span>300 km<\/span><\/div>\n                    <p class=\"pmr-hint-inline\" id=\"pmrYHint\">Der Mittelmeridian liegt bei 9 Grad Ost (Zone 32) und bei 15 Grad Ost (Zone 33). 100 km Abstand sind rund 1,4 Grad L\u00e4ngenunterschied.<\/p>\n                <\/div>\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrBreite\">Geografische Breite<\/label>\n                    <div class=\"pmr-range-row\">\n                        <input type=\"range\" class=\"pmr-range\" id=\"pmrBreite\" min=\"47\" max=\"55\" step=\"0.5\" value=\"51\">\n                        <span class=\"pmr-range-val\" id=\"pmrBreiteVal\">51,0 Grad<\/span>\n                    <\/div>\n                    <div class=\"pmr-range-bounds\"><span>47,0 (Alpenrand)<\/span><span>55,0 (K\u00fcste)<\/span><\/div>\n                    <p class=\"pmr-hint-inline\">Die Breite steuert den Erdradius und wie weit die Zone in Metern reicht. Auf den Ma\u00dfstab wirkt sie schwach, auf die Zonengrenze deutlich.<\/p>\n                <\/div>\n            <\/div>\n\n            <div class=\"pmr-grid-2 pmr-group is-off\" id=\"pmrGruppeKoord\" style=\"margin-top: 10px;\">\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrOst\">Ostwert (Rechtswert)<\/label>\n                    <input type=\"text\" class=\"pmr-input pmr-input-num\" id=\"pmrOst\" placeholder=\"642828,551\" inputmode=\"decimal\" autocomplete=\"off\" disabled>\n                    <p class=\"pmr-hint-inline\">Mit oder ohne Zonenkennziffer. Acht Vorkommastellen hei\u00dft mit, sechs hei\u00dft ohne.<\/p>\n                <\/div>\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrHoch\">Hochwert<\/label>\n                    <input type=\"text\" class=\"pmr-input pmr-input-num\" id=\"pmrHoch\" placeholder=\"5652000\" inputmode=\"decimal\" autocomplete=\"off\" disabled>\n                    <p class=\"pmr-hint-inline\">Dient nur der ungef\u00e4hren Ableitung der Breite. Bleibt das Feld leer, wird mit dem Schieberegler oben gerechnet.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"pmr-panel\">\n            <p class=\"pmr-panel-title\">Wie hoch und wie lang?<\/p>\n            <div class=\"pmr-grid\">\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrHoehe\">Mittlere Gel\u00e4ndeh\u00f6he \u00fcber NHN<\/label>\n                    <div class=\"pmr-range-row\">\n                        <input type=\"range\" class=\"pmr-range\" id=\"pmrHoehe\" min=\"-10\" max=\"1000\" step=\"10\" value=\"100\">\n                        <span class=\"pmr-range-val\" id=\"pmrHoeheVal\">100 m<\/span>\n                    <\/div>\n                    <p class=\"pmr-hint-inline\">Eine Genauigkeit von 10 m gen\u00fcgt, solange das Gebiet kleiner als 10 mal 10 km ist.<\/p>\n                <\/div>\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrStrecke\">L\u00e4ngste Strecke im Projekt<\/label>\n                    <div class=\"pmr-range-row\">\n                        <input type=\"range\" class=\"pmr-range\" id=\"pmrStrecke\" min=\"20\" max=\"5000\" step=\"10\" value=\"800\">\n                        <span class=\"pmr-range-val\" id=\"pmrStreckeVal\">800 m<\/span>\n                    <\/div>\n                    <p class=\"pmr-hint-inline\">Nimm die l\u00e4ngste durchgehende Ma\u00dfkette deines Projekts. 800 m ist ein Beispielwert.<\/p>\n                <\/div>\n                <div class=\"pmr-field\">\n                    <label class=\"pmr-label\" for=\"pmrTol\">Eigene Grenzabweichung<\/label>\n                    <input type=\"text\" class=\"pmr-input pmr-input-num\" id=\"pmrTol\" value=\"3,0\" inputmode=\"decimal\" autocomplete=\"off\">\n                    <p class=\"pmr-hint-inline\">In Zentimetern. Voreingestellt 3,0 cm. Steht in deinem Vertrag ein anderer Wert, trag ihn hier ein.<\/p>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"pmr-presets\" role=\"group\" aria-label=\"Beispiele\">\n            <span class=\"pmr-presets-label\">Beispiele<\/span>\n            <button type=\"button\" class=\"pmr-btn pmr-btn-ghost\" data-preset=\"odf\">Beispiel Gemeinde am Mittelmeridian<\/button>\n            <button type=\"button\" class=\"pmr-btn pmr-btn-ghost\" data-preset=\"laengentreu\">Lage ohne Verzerrung<\/button>\n            <button type=\"button\" class=\"pmr-btn pmr-btn-ghost\" data-preset=\"rand\">Nahe am Zonenrand<\/button>\n            <button type=\"button\" class=\"pmr-btn pmr-btn-ghost\" data-preset=\"berg\">Mittelgebirge, 600 m<\/button>\n            <button type=\"button\" class=\"pmr-btn pmr-btn-ghost\" data-preset=\"kurz\">Kurze Strecke, 50 m<\/button>\n            <button type=\"button\" class=\"pmr-btn pmr-btn-ghost\" data-preset=\"koord\">Ostwert mit Zonenkennziffer<\/button>\n        <\/div>\n\n        <div class=\"pmr-hinweise\" id=\"pmrHinweise\"><\/div>\n\n        <div class=\"pmr-result\" role=\"status\" aria-live=\"polite\">\n            <div>\n                <div class=\"pmr-result-key\">Projektma\u00dfstab<\/div>\n                <div class=\"pmr-result-val\" id=\"pmrMassstab\">0,99958<\/div>\n            <\/div>\n            <div class=\"pmr-result-note\" id=\"pmrMassstabNote\">F\u00fcnf Nachkommastellen: so viele empfiehlt die Handreichung Georeferenzierung mindestens.<\/div>\n        <\/div>\n\n        <div class=\"pmr-split\">\n            <div class=\"pmr-cell\">\n                <div class=\"pmr-cell-key\">Abbildungsma\u00dfstab<\/div>\n                <div class=\"pmr-cell-val\" id=\"pmrMP\">0,99960000<\/div>\n                <div class=\"pmr-cell-sub\" id=\"pmrMPSub\">aus der Lage in der Zone<\/div>\n            <\/div>\n            <div class=\"pmr-cell\">\n                <div class=\"pmr-cell-key\">H\u00f6henma\u00dfstab<\/div>\n                <div class=\"pmr-cell-val\" id=\"pmrMH\">0,99998433<\/div>\n                <div class=\"pmr-cell-sub\" id=\"pmrMHSub\">aus der mittleren H\u00f6he<\/div>\n            <\/div>\n            <div class=\"pmr-cell\">\n                <div class=\"pmr-cell-key\">Wer \u00fcberwiegt<\/div>\n                <div class=\"pmr-cell-val\" id=\"pmrAnteil\">Lage<\/div>\n                <div class=\"pmr-cell-sub\" id=\"pmrAnteilSub\">96 Prozent aus der Abbildung<\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"pmr-note\">\n            <strong>Wichtig f\u00fcr die H\u00f6he:<\/strong> Eine Ma\u00dfstabs\u00e4nderung aus der L\u00e4ngenverzerrung wirkt nur auf die Lage, also auf Ostwert und Hochwert. Die H\u00f6hen werden davon nicht ber\u00fchrt und d\u00fcrfen nicht mit umgerechnet werden. So steht es in der Handreichung Georeferenzierung von BIM-Modellen, Version 1.0, Stand 16.07.2025.\n        <\/div>\n\n        <figure class=\"pmr-fig\">\n            <figcaption class=\"pmr-fig-title\">Warum der Ma\u00dfstab an Lage und H\u00f6he h\u00e4ngt<\/figcaption>\n            <div class=\"pmr-fig-frame\">\n                <svg id=\"pmrSvgA\" viewBox=\"0 0 720 300\" fill=\"none\" role=\"img\" aria-label=\"Querschnitt durch die UTM-Zone mit Erdoberfl\u00e4che, Abbildungsebene und der Lage des Projekts\">\n                    <text x=\"10\" y=\"18\" font-family=\"sans-serif\" font-size=\"12\" font-weight=\"700\" fill=\"#1e3548\">Querschnitt durch die Zone, H\u00f6hen stark \u00fcberh\u00f6ht<\/text>\n\n                    <rect x=\"10\" y=\"30\" width=\"10\" height=\"10\" rx=\"1\" fill=\"#eaf1f6\" stroke=\"#3f5f75\" stroke-width=\"1\"\/>\n                    <text x=\"27\" y=\"39\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#2c4a5e\">zwischen den Marken: Modellma\u00df k\u00fcrzer<\/text>\n                    <rect x=\"10\" y=\"48\" width=\"10\" height=\"10\" rx=\"1\" fill=\"#fbf1e3\" stroke=\"#c98a3c\" stroke-width=\"1\"\/>\n                    <text x=\"27\" y=\"57\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#a1642a\">au\u00dferhalb der Marken: Modellma\u00df l\u00e4nger<\/text>\n                    <line x1=\"15\" y1=\"66\" x2=\"15\" y2=\"76\" stroke=\"#059669\" stroke-width=\"2\"\/>\n                    <text id=\"pmrCrossLabel\" x=\"27\" y=\"75\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#15803d\">l\u00e4ngentreu bei 184 km<\/text>\n\n                    <text id=\"pmrDLabel\" x=\"710\" y=\"39\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"700\" fill=\"#1e3548\" text-anchor=\"end\">d = 2.653 m \u00fcber der Ebene<\/text>\n                    <text id=\"pmrDLabel2\" x=\"710\" y=\"57\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"end\">Abbildung +2.553 m, H\u00f6he +100 m<\/text>\n                    <text x=\"710\" y=\"75\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"end\">senkrechter Strich in der Grafik<\/text>\n\n                    <path id=\"pmrFillAussen\" d=\"\" fill=\"#fbf1e3\"\/>\n                    <path id=\"pmrFillInnen\" d=\"\" fill=\"#eaf1f6\"\/>\n                    <line id=\"pmrPlane\" x1=\"56\" y1=\"152\" x2=\"696\" y2=\"152\" stroke=\"#2c4a5e\" stroke-width=\"2\"\/>\n                    <path id=\"pmrArc\" d=\"\" stroke=\"#3f5f75\" stroke-width=\"2.5\" fill=\"none\"\/>\n\n                    <line id=\"pmrCrossL\" x1=\"0\" y1=\"144\" x2=\"0\" y2=\"160\" stroke=\"#059669\" stroke-width=\"2\"\/>\n                    <line id=\"pmrCrossR\" x1=\"0\" y1=\"144\" x2=\"0\" y2=\"160\" stroke=\"#059669\" stroke-width=\"2\"\/>\n\n                    <text x=\"60\" y=\"146\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#2c4a5e\" text-anchor=\"start\">Abbildungsebene<\/text>\n                    <text id=\"pmrLabelErde\" x=\"215\" y=\"110\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#3f5f75\" text-anchor=\"middle\">Erdoberfl\u00e4che (Ellipsoid)<\/text>\n\n                    <line id=\"pmrDProj\" x1=\"376\" y1=\"110\" x2=\"376\" y2=\"152\" stroke=\"#3f5f75\" stroke-width=\"3\"\/>\n                    <line id=\"pmrDHoehe\" x1=\"376\" y1=\"108\" x2=\"376\" y2=\"110\" stroke=\"#e8913a\" stroke-width=\"3\"\/>\n                    <rect id=\"pmrMarker\" x=\"370\" y=\"102\" width=\"12\" height=\"6\" rx=\"1\" fill=\"#1e3548\"\/>\n\n                    <line x1=\"56\" y1=\"240\" x2=\"696\" y2=\"240\" stroke=\"#d0d0d0\" stroke-width=\"1\"\/>\n                    <text x=\"56\" y=\"256\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">300<\/text>\n                    <text x=\"163\" y=\"256\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">200<\/text>\n                    <text x=\"270\" y=\"256\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">100<\/text>\n                    <text x=\"376\" y=\"256\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">0<\/text>\n                    <text x=\"483\" y=\"256\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">100<\/text>\n                    <text x=\"590\" y=\"256\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">200<\/text>\n                    <text x=\"696\" y=\"256\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">300<\/text>\n                    <text x=\"376\" y=\"272\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"middle\">Abstand vom Mittelmeridian in km<\/text>\n                    <text x=\"10\" y=\"292\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\">N\u00e4herung: Ma\u00dfstab minus 1 entspricht ungef\u00e4hr minus d geteilt durch den Erdradius. Die Zahlen im Ergebnis nutzen die Reihenformel.<\/text>\n                <\/svg>\n            <\/div>\n            <p class=\"pmr-fig-cap\">Der Abstand d zur Abbildungsebene ist die ganze Geschichte. Am Mittelmeridian liegt die Ebene rund 2&#8239;550 m unter dem Ellipsoid, deshalb schrumpfen dort die L\u00e4ngen. Die Gel\u00e4ndeh\u00f6he legt sich obendrauf und wirkt in dieselbe Richtung. Weiter drau\u00dfen kippt das Vorzeichen, weil die Fl\u00e4che dann unter der Ebene liegt.<\/p>\n        <\/figure>\n\n        <div class=\"pmr-split\">\n            <div class=\"pmr-cell\">\n                <div class=\"pmr-cell-key\">Je 100 m<\/div>\n                <div class=\"pmr-cell-val\" id=\"pmrAbw100\">\u22124,2 cm<\/div>\n                <div class=\"pmr-cell-sub\">Abweichung Modell gegen Natur<\/div>\n            <\/div>\n            <div class=\"pmr-cell\">\n                <div class=\"pmr-cell-key\">Je Kilometer<\/div>\n                <div class=\"pmr-cell-val\" id=\"pmrAbwKm\">\u221241,6 cm<\/div>\n                <div class=\"pmr-cell-sub\">die Faustzahl f\u00fcr dein Gebiet<\/div>\n            <\/div>\n            <div class=\"pmr-cell\">\n                <div class=\"pmr-cell-key\">Auf deiner Strecke<\/div>\n                <div class=\"pmr-cell-val\" id=\"pmrAbwL\">\u221233,3 cm<\/div>\n                <div class=\"pmr-cell-sub\" id=\"pmrAbwLSub\">bei 800 m L\u00e4nge<\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"pmr-note\" id=\"pmrSatzC\">Die Strecke ist im Landesnetz um 33,3 cm k\u00fcrzer als in der Natur.<\/div>\n\n        <figure class=\"pmr-fig\">\n            <figcaption class=\"pmr-fig-title\">Ab wann ist das zu viel?<\/figcaption>\n            <div class=\"pmr-fig-frame\">\n                <svg id=\"pmrSvgB\" viewBox=\"0 0 720 164\" fill=\"none\" role=\"img\" aria-label=\"Die Ma\u00dfkette des Projekts mit den Stellen, an denen die Grenzabweichungen erreicht sind\">\n                    <text id=\"pmrBEnde\" x=\"700\" y=\"24\" font-family=\"sans-serif\" font-size=\"11\" font-weight=\"700\" fill=\"#1e3548\" text-anchor=\"end\">am Ende der Kette: 33,3 cm<\/text>\n                    <text x=\"40\" y=\"46\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"start\">0 m<\/text>\n                    <text id=\"pmrBLang\" x=\"700\" y=\"46\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#7f8c8d\" text-anchor=\"end\">deine Ma\u00dfkette: 800 m<\/text>\n\n                    <line id=\"pmrBRest\" x1=\"700\" y1=\"70\" x2=\"700\" y2=\"70\" stroke=\"#d0d0d0\" stroke-width=\"1\" stroke-dasharray=\"3 3\"\/>\n                    <rect id=\"pmrBBar\" x=\"40\" y=\"54\" width=\"660\" height=\"32\" rx=\"2\" fill=\"#ffffff\" stroke=\"#3f5f75\" stroke-width=\"1.5\"\/>\n                    <rect id=\"pmrBBarUnter\" x=\"41\" y=\"55\" width=\"60\" height=\"30\" fill=\"#eaf1f6\"\/>\n\n                    <line id=\"pmrTickA\" x1=\"100\" y1=\"46\" x2=\"100\" y2=\"94\" stroke=\"#e8913a\" stroke-width=\"2\"\/>\n                    <line id=\"pmrTickB\" x1=\"70\" y1=\"46\" x2=\"70\" y2=\"94\" stroke=\"#7f8c8d\" stroke-width=\"2\"\/>\n                    <line id=\"pmrTickE\" x1=\"100\" y1=\"46\" x2=\"100\" y2=\"94\" stroke=\"#2c4a5e\" stroke-width=\"2\" stroke-dasharray=\"3 2\"\/>\n\n                    <rect x=\"40\" y=\"104\" width=\"9\" height=\"9\" rx=\"1\" fill=\"#e8913a\"\/>\n                    <text id=\"pmrTickALabel\" x=\"56\" y=\"112\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#1e293b\">3,0 cm (DIN 18202) nach rund 72 m<\/text>\n                    <rect x=\"40\" y=\"124\" width=\"9\" height=\"9\" rx=\"1\" fill=\"#7f8c8d\"\/>\n                    <text id=\"pmrTickBLabel\" x=\"56\" y=\"132\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#1e293b\">1,32 cm (Ansatz DIN 18710-1) nach rund 32 m<\/text>\n                    <rect id=\"pmrTickESwatch\" x=\"40\" y=\"144\" width=\"9\" height=\"9\" rx=\"1\" fill=\"#2c4a5e\"\/>\n                    <text id=\"pmrTickELabel\" x=\"56\" y=\"152\" font-family=\"sans-serif\" font-size=\"11\" fill=\"#1e293b\">eigener Wert<\/text>\n\n                <\/svg>\n            <\/div>\n            <p class=\"pmr-fig-cap\">Der Balken ist deine l\u00e4ngste Ma\u00dfkette. Die senkrechten Striche sitzen dort, wo die jeweilige Grenzabweichung aufgebraucht ist. Liegt ein Strich rechts vom Balkenende, wird die Grenze auf deiner Strecke nicht erreicht. Der helle Abschnitt am Anfang ist das St\u00fcck, das unter 3,0 cm bleibt.<\/p>\n        <\/figure>\n\n        <div class=\"pmr-tab-wrap\">\n            <table class=\"pmr-tab\">\n                <thead>\n                    <tr><th>Grenzabweichung<\/th><th>bleibt eingehalten bis<\/th><th>auf deiner Strecke<\/th><\/tr>\n                <\/thead>\n                <tbody>\n                    <tr>\n                        <td>3,0 cm, DIN 18202 bei Nennma\u00dfen \u00fcber 30 m<\/td>\n                        <td class=\"pmr-tab-num\" id=\"pmrGrenzA\">72 m<\/td>\n                        <td id=\"pmrGrenzAText\">nach 72 m \u00fcberschritten<\/td>\n                    <\/tr>\n                    <tr>\n                        <td>1,32 cm, Ansatz nach DIN 18710-1<\/td>\n                        <td class=\"pmr-tab-num\" id=\"pmrGrenzB\">32 m<\/td>\n                        <td id=\"pmrGrenzBText\">nach 32 m \u00fcberschritten<\/td>\n                    <\/tr>\n                    <tr>\n                        <td id=\"pmrGrenzEKey\">Eigener Wert, 3,0 cm<\/td>\n                        <td class=\"pmr-tab-num\" id=\"pmrGrenzE\">72 m<\/td>\n                        <td id=\"pmrGrenzEText\">nach 72 m \u00fcberschritten<\/td>\n                    <\/tr>\n                <\/tbody>\n            <\/table>\n        <\/div>\n        <p class=\"pmr-quelle\">Beide Zahlen stammen aus der frei zug\u00e4nglichen Handreichung \u201eETRS89\/UTM bei Planungsaufgaben, Modul 2\u201c, Baufachliche Richtlinien Vermessung, Version 1.1, Stand 06.06.2021, nicht aus dem Normtext. Modul 2 nennt f\u00fcr DIN 18202 bei Nennma\u00dfen \u00fcber 30 m eine Grenzabweichung von 3,0 cm und setzt f\u00fcr DIN 18710-1 das 0,44-fache davon an, bei einem angenommenen Anteilsfaktor von 10 Prozent an der Gesamttoleranz. 0,44 mal 3,0 cm ergibt 1,32 cm.<\/p>\n\n        <div class=\"pmr-befund\" id=\"pmrBefund\">\n            <p>Auf 800 m laufen Modellma\u00df und Naturma\u00df um 33,3 cm auseinander.<\/p>\n        <\/div>\n\n        <div class=\"pmr-todo\">\n            <strong>Was jetzt zu tun ist<\/strong>\n            <ol>\n                <li>Trag den Wert in den BIM-Abwicklungsplan ein, mit mindestens f\u00fcnf Nachkommastellen oder mit dem ausdr\u00fccklichen Vermerk \u201eohne Ma\u00dfstabs\u00e4nderung&#8220;. Die Handreichung Georeferenzierung verlangt, eine Ma\u00dfstabs\u00e4nderung im Abwicklungsplan zu dokumentieren, und empfiehlt daf\u00fcr mindestens f\u00fcnf Nachkommastellen.<\/li>\n                <li>Leg die Zahl der Vermessung vor. Ob transformiert wird und mit welchem Ansatz, entscheidet die Vermessung.<\/li>\n                <li>Pr\u00fcf, ob Absteckma\u00dfe und Modellma\u00dfe aus derselben Welt kommen. Wie das schiefgeht, steht auf der Seite \u201eWo das Modell liegt\u201c dieses Themenfelds.<\/li>\n            <\/ol>\n        <\/div>\n\n        <div class=\"pmr-toolbar\">\n            <button type=\"button\" class=\"pmr-btn\" id=\"pmrDruck\">Blatt drucken<\/button>\n            <button type=\"button\" class=\"pmr-btn pmr-btn-ghost\" id=\"pmrLoeschen\">Eingaben l\u00f6schen<\/button>\n        <\/div>\n\n        <div class=\"pmr-herkunft\">\n            <h4>Herkunft jeder Zahl<\/h4>\n\n            <h5>Der Rechenweg, offen<\/h5>\n            <p class=\"pmr-formel\" id=\"pmrFormelBlock\">Erdradius    R = Wurzel(M \u00b7 N), GRS80, a = 6.378.137 m, 1\/f = 298,257222101\nAbbildung    m(P) = 0,9996 \u00b7 (1 + t\u00b2 \/ 2 + t\u2074 \/ 24), t = y \/ (0,9996 \u00b7 R)\nH\u00f6he         m(H) = R \/ (R + H)\nProjekt      m    = m(P) \u00b7 m(H)\nAbweichung   Delta = (m \u2212 1) \u00b7 L\nGrenzl\u00e4nge   L(max) = Z \/ Betrag(m \u2212 1)<\/p>\n            <p id=\"pmrFormelWerte\">Mit deinen Werten: y = 0 m, Breite 51,0 Grad, H = 100 m, L = 800 m.<\/p>\n\n            <h5>Woher die Beziehung kommt<\/h5>\n            <ul>\n                <li>Handreichung \u201eETRS89\/UTM bei Planungsaufgaben, Modul 2: Erstellung planungskonformer CAD-Daten&#8220;, Baufachliche Richtlinien Vermessung, Version 1.1, Stand 06.06.2021. Dort steht die Beziehung Projektma\u00dfstab gleich H\u00f6henma\u00dfstab mal Projektionsma\u00dfstab, dort stehen auch die beiden Grenzabweichungen und der Hinweis, dass eine Genauigkeit der Schwerpunktkoordinaten von bis zu 100 m f\u00fcr die Absch\u00e4tzung gen\u00fcgt.<\/li>\n                <li>Handreichung \u201eGeoreferenzierung von BIM-Modellen&#8220;, Bundesministerium der Verteidigung und Bundesanstalt f\u00fcr Immobilienaufgaben, Text der Leitstelle BFR Vermessung, Version 1.0, Stand 16.07.2025. Von dort kommen die f\u00fcnf Nachkommastellen und der Satz, dass die Ma\u00dfstabs\u00e4nderung nur auf die Lage wirkt.<\/li>\n                <li>Verfahrensbeschreibung ETRS89\/UTM, Baufachliche Richtlinien Vermessung, Version 1.2, Stand 11.08.2021. Ihre Tabelle 3 nennt f\u00fcr die reine Projektion die L\u00e4ngentreue bei rund 180 km Abstand vom Mittelmeridian, ohne Gel\u00e4ndeh\u00f6he. Der Rechner zeigt den kombinierten Wert, also Projektion mal H\u00f6henma\u00dfstab; bei den voreingestellten 100 m mittlerer H\u00f6he liegt er bei rund 184 km. Die beiden Zahlen beantworten verschiedene Fragen. Die \u00e4ltere Fassung 1.1 vom 05.04.2020 f\u00fchrt an dieser Stelle \u00fcberholte Werte.<\/li>\n                <li>Aus den Normen selbst ist kein Satz eingebettet. Genannt sind nur Nummer und Titel: DIN 18202 (Toleranzen im Hochbau) und DIN 18710-1 (Ingenieurvermessung).<\/li>\n            <\/ul>\n\n            <h5>Was diese Zahlen nicht sind<\/h5>\n            <p>Der Rechner rechnet die Beziehung aus Modul 2 auf dem Ellipsoid GRS80 selbst nach. Das ist eine eigene Rechnung und kein amtlicher Wert. Die Faustzahl dieser Seiten, rund 42 Zentimeter je Kilometer am Mittelmeridian bei 100 m mittlerer H\u00f6he, ist auf demselben Weg entstanden, gerechnet nach der Beziehung aus Modul 2, Ellipsoid GRS80, Breite 51 Grad.<\/p>\n            <p>F\u00fcr die Zahl, die du einem Auftraggeber vorlegst, ist das amtliche Online-Formular der Baufachlichen Richtlinien Vermessung die bessere Adresse, betreut vom Landesamt GeoInformation Bremen, Seitenstand 2025.<\/p>\n\n            <p>Eine N\u00e4herung steckt au\u00dferdem in der H\u00f6he. Streng geh\u00f6rt in die Formel die ellipsoidische H\u00f6he, das Eingabefeld nimmt aber die H\u00f6he \u00fcber NHN und rechnet die H\u00f6henanomalie nicht hinzu, denn die ellipsoidische H\u00f6he ist die Normalh\u00f6he plus die H\u00f6henanomalie.<\/p>\n            <p>Bei den 34 bis 50 m, die in Deutschland vorkommen, verschiebt das die Abweichung um rund 0,5 bis 0,8 Zentimeter je Kilometer und am Mittelmeridian die Grenzl\u00e4nge um ein bis zwei Prozent; nahe der l\u00e4ngentreuen Stelle wirkt sie auf die Grenzl\u00e4nge viel st\u00e4rker. An der Faustzahl von rund 42 Zentimetern \u00e4ndert das nichts; wer die ellipsoidische H\u00f6he kennt, tr\u00e4gt sie ein.<\/p>\n\n            <h5>Was der Rechner nicht tut<\/h5>\n            <ul>\n                <li>Er rechnet keine Koordinaten um. Keine Transformation zwischen Bezugssystemen, keine H\u00f6henanomalie, keine Umrechnung von ellipsoidischer H\u00f6he auf NHN.<\/li>\n                <li>Er entscheidet nicht, ob transformiert wird. Diese Abw\u00e4gung weist die Handreichung ausdr\u00fccklich der Vermessung zu.<\/li>\n                <li>Er vergibt keine Punkte, keine Ampel, keine Stufe. Der Befund steht als Satz.<\/li>\n                <li>Er erkl\u00e4rt keine Bedienung einer Autorensoftware.<\/li>\n            <\/ul>\n        <\/div>\n\n        <div class=\"pmr-blatt\" id=\"pmrBlatt\" aria-hidden=\"true\"><\/div>\n\n        <div class=\"pmr-foot\">\n            <p><strong>Stand 09\/2026.<\/strong> Pr\u00fcftag der Quellen 05.08.2026, Rechenweg und Quellen gegengepr\u00fcft am 14.09.2026. Gespeichert wird ein Stand im Browser dieses Ger\u00e4ts, nichts davon verl\u00e4sst den Rechner.<\/p>\n            <p>Das ersetzt keine Vermessungsleistung. Ob dein Projekt eine Ma\u00dfstabskorrektur braucht und welche, h\u00e4ngt vom Einzelfall ab und geh\u00f6rt in die Hand der Vermessung.<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n(function () {\n    'use strict';\n\n    var root = document.querySelector('[data-pmr-root]');\n    if (!root) { return; }\n\n    var KEY = 'cadk_pmr_v1';\n\n    \/* ---------- Konstanten ---------- *\/\n\n    var GRS80_A = 6378137.0;\n    var GRS80_FINV = 298.257222101;\n    var GRS80_F = 1 \/ GRS80_FINV;\n    var GRS80_E2 = 2 * GRS80_F - GRS80_F * GRS80_F;\n    var K0 = 0.9996;\n    var Z_18202 = 0.030;\n    var Z_18710 = 0.0132;\n\n    \/* Zeichenflaeche der oberen Grafik. YMAX_KM ist die halbe Breite der Darstellung. *\/\n    var A_XL = 56, A_XR = 696, A_XC = 376;\n    var A_YMAX_KM = 300;\n    var A_PX_KM = (A_XR - A_XL) \/ (2 * A_YMAX_KM);\n    var A_PLANE = 152;\n    var A_SV = 0.0165;\n\n    \/* Zeichenflaeche der unteren Grafik. *\/\n    var B_XL = 40, B_XR = 700;\n\n    \/* ---------- kleine Helfer ---------- *\/\n\n    function el(id) { return document.getElementById(id); }\n\n    function fmt(v, n) {\n        if (isFinite(v) !== true) { return '\u2013'; }\n        return v.toFixed(n).replace('.', ',');\n    }\n\n    function fmtTausend(v) {\n        if (isFinite(v) !== true) { return '\u2013'; }\n        var neg = v < 0;\n        var s = Math.round(Math.abs(v)).toString();\n        s = s.replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, '.');\n        if (neg) { return '\u2212' + s; }\n        return s;\n    }\n\n    function mitVorzeichen(v, n) {\n        if (isFinite(v) !== true) { return '\u2013'; }\n        var betrag = Math.abs(v).toFixed(n);\n        \/* Ein Wert, der auf null rundet, bekommt kein Vorzeichen. \u201e\u22120,0 cm\" liest sich wie ein Fehler. *\/\n        if (parseFloat(betrag) === 0) { return betrag.replace('.', ','); }\n        var z = v < 0 ? '\u2212' : '+';\n        return z + betrag.replace('.', ',');\n    }\n\n    \/* Ab zehn Kilometern liest sich die Zahl in Kilometern besser. *\/\n    function meterLesbar(v) {\n        if (isFinite(v) !== true) { return '\u2013'; }\n        if (Math.abs(v) >= 10000) { return fmt(v \/ 1000, 1) + ' km'; }\n        return fmtTausend(v) + ' m';\n    }\n\n    function vorzeichenTausend(v) {\n        var betrag = Math.round(Math.abs(v));\n        if (betrag === 0) { return '0'; }\n        return (v < 0 ? '\u2212' : '+') + fmtTausend(betrag);\n    }\n\n    function zahlAus(txt) {\n        var t = String(txt === null ? '' : txt).replace(\/\\s\/g, '');\n        if (t === '') { return NaN; }\n        var hatKomma = t.indexOf(',') >= 0;\n        if (hatKomma) {\n            if (t.indexOf('.') >= 0) { t = t.replace(\/\\.\/g, ''); }\n            t = t.replace(\/,\/g, '.');\n        }\n        var v = parseFloat(t);\n        if (isFinite(v) !== true) { return NaN; }\n        return v;\n    }\n\n    function setText(id, txt) {\n        var n = el(id);\n        if (!n) { return; }\n        n.textContent = txt;\n    }\n\n    function setAttr(id, name, wert) {\n        var n = el(id);\n        if (!n) { return; }\n        n.setAttribute(name, String(wert));\n    }\n\n    function sichtbar(id, ja) {\n        var n = el(id);\n        if (!n) { return; }\n        n.setAttribute('visibility', ja ? 'visible' : 'hidden');\n    }\n\n    \/* ---------- Geodaesie ---------- *\/\n\n    function radiusGauss(breiteGrad) {\n        var s = Math.sin(breiteGrad * Math.PI \/ 180);\n        var w = Math.sqrt(1 - GRS80_E2 * s * s);\n        var nQuer = GRS80_A \/ w;\n        var mQuer = GRS80_A * (1 - GRS80_E2) \/ (w * w * w);\n        return Math.sqrt(mQuer * nQuer);\n    }\n\n    function massstabProjektion(y, r) {\n        var t = y \/ (K0 * r);\n        return K0 * (1 + (t * t) \/ 2 + (t * t * t * t) \/ 24);\n    }\n\n    function massstabHoehe(h, r) {\n        return r \/ (r + h);\n    }\n\n    \/* Abstand vom Mittelmeridian, an dem sich Abbildung und Hoehenreduktion aufheben. *\/\n    function nullAbstand(h, breiteGrad) {\n        var r = radiusGauss(breiteGrad);\n        var ziel = (1 \/ massstabHoehe(h, r)) \/ K0 - 1;\n        if (ziel <= 0) { return 0; }\n        var y = K0 * r * Math.sqrt(2 * ziel);\n        var i;\n        for (i = 0; i < 4; i++) {\n            var korr = 2 * (ziel - Math.pow(y \/ (K0 * r), 4) \/ 24);\n            if (korr <= 0) { return 0; }\n            y = K0 * r * Math.sqrt(korr);\n        }\n        return y;\n    }\n\n    \/* Reichweite von 3 Grad Laengenunterschied auf dem Breitenkreis. *\/\n    function zonenReichweite(breiteGrad) {\n        var b = breiteGrad * Math.PI \/ 180;\n        var s = Math.sin(b);\n        var w = Math.sqrt(1 - GRS80_E2 * s * s);\n        return (3 * Math.PI \/ 180) * (GRS80_A \/ w) * Math.cos(b);\n    }\n\n    \/* Fusspunktbreite aus dem Hochwert, Standardreihe. *\/\n    function breiteAusHochwert(nordwert) {\n        var e2 = GRS80_E2;\n        var mu = (nordwert \/ K0) \/ (GRS80_A * (1 - e2 \/ 4 - 3 * e2 * e2 \/ 64 - 5 * e2 * e2 * e2 \/ 256));\n        var e1 = (1 - Math.sqrt(1 - e2)) \/ (1 + Math.sqrt(1 - e2));\n        var p = mu\n            + (3 * e1 \/ 2 - 27 * Math.pow(e1, 3) \/ 32) * Math.sin(2 * mu)\n            + (21 * e1 * e1 \/ 16 - 55 * Math.pow(e1, 4) \/ 32) * Math.sin(4 * mu)\n            + (151 * Math.pow(e1, 3) \/ 96) * Math.sin(6 * mu)\n            + (1097 * Math.pow(e1, 4) \/ 512) * Math.sin(8 * mu);\n        return p * 180 \/ Math.PI;\n    }\n\n    function ostwertZerlegen(v) {\n        var ganz = Math.floor(Math.abs(v));\n        var stellen = String(ganz).length;\n        \/* Mehr als acht Vorkommastellen ist kein Ostwert, auch nicht mit Zonenkennziffer. *\/\n        if (stellen > 8) { return { zone: 0, ost: v, hatZone: false, ungueltig: true }; }\n        if (stellen === 8) {\n            var zone = Math.floor(v \/ 1000000);\n            return { zone: zone, ost: v - zone * 1000000, hatZone: true, ungueltig: false };\n        }\n        return { zone: 0, ost: v, hatZone: false, ungueltig: false };\n    }\n\n    \/* ---------- Eingaben einsammeln ---------- *\/\n\n    var modus = 'grob';\n\n    function ausSchieber(id, ersatz) {\n        var n = el(id);\n        if (!n) { return ersatz; }\n        var v = parseFloat(n.value);\n        if (isFinite(v) !== true) { return ersatz; }\n        return v;\n    }\n\n    function eingabenLesen() {\n        var e = {\n            modus: modus,\n            yKm: ausSchieber('pmrY', 0),\n            breite: ausSchieber('pmrBreite', 51),\n            hoehe: ausSchieber('pmrHoehe', 100),\n            strecke: ausSchieber('pmrStrecke', 800),\n            tol: zahlAus(el('pmrTol').value),\n            ostRoh: el('pmrOst').value,\n            hochRoh: el('pmrHoch').value,\n            hinweise: [],\n            ok: true,\n            grund: ''\n        };\n        if (isFinite(e.tol) !== true) { e.tol = 3.0; }\n        if (e.tol <= 0) { e.tol = 3.0; }\n        if (e.tol > 100) { e.tol = 3.0; }\n\n        e.y = e.yKm * 1000;\n        e.zone = 0;\n        e.hatZone = false;\n        e.seite = '';\n\n        if (modus === 'koord') {\n            var ost = zahlAus(e.ostRoh);\n            if (isFinite(ost) !== true) {\n                e.ok = false;\n                e.grund = 'Trag einen Ostwert ein, dann rechnet der Rechner weiter.';\n                return e;\n            }\n            if (ost <= 0) {\n                e.ok = false;\n                e.grund = 'Ein Ostwert ist immer positiv. Wert pr\u00fcfen.';\n                return e;\n            }\n            var z = ostwertZerlegen(ost);\n            e.zone = z.zone;\n            e.hatZone = z.hatZone;\n            if (z.ungueltig) {\n                e.ok = false;\n                e.grund = 'Der Ostwert hat mehr als acht Vorkommastellen. Sechs Stellen hei\u00dft ohne Zonenkennziffer, acht Stellen hei\u00dft mit. Wert pr\u00fcfen.';\n                return e;\n            }\n            if (z.ost <= 0) {\n                e.ok = false;\n                e.grund = 'Der Ostwert liegt nach dem Abtrennen der Zonenkennziffer au\u00dferhalb von 0 bis 1.000.000. Wert pr\u00fcfen.';\n                return e;\n            }\n            if (z.ost > 1000000) {\n                e.ok = false;\n                e.grund = 'Der Ostwert liegt nach dem Abtrennen der Zonenkennziffer au\u00dferhalb von 0 bis 1.000.000. Wert pr\u00fcfen.';\n                return e;\n            }\n            var yRoh = z.ost - 500000;\n            e.y = Math.abs(yRoh);\n            e.yKm = e.y \/ 1000;\n            e.seite = yRoh < 0 ? 'westlich' : '\u00f6stlich';\n            if (z.hatZone) {\n                e.hinweise.push('Der Ostwert enthielt die Zonenkennziffer ' + z.zone + '. Gerechnet wurde mit ' + fmt(z.ost, 3) + ' m, das sind ' + fmtTausend(e.y) + ' m ' + e.seite + ' vom Mittelmeridian.');\n            }\n            var hoch = zahlAus(e.hochRoh);\n            if (isFinite(hoch) === true) {\n                if (hoch > 0) {\n                    var b = breiteAusHochwert(hoch);\n                    if (b > 40) {\n                        if (b < 60) {\n                            e.breite = b;\n                            e.hinweise.push('Aus dem Hochwert gen\u00e4hert: Breite rund ' + fmt(b, 1) + ' Grad. Der Hochwert dient nur dazu.');\n                        } else {\n                            e.hinweise.push('Der Hochwert liegt au\u00dferhalb des Bereichs, der f\u00fcr Deutschland zu erwarten ist. Gerechnet wurde mit der Breite vom Schieberegler.');\n                        }\n                    } else {\n                        e.hinweise.push('Der Hochwert liegt au\u00dferhalb des Bereichs, der f\u00fcr Deutschland zu erwarten ist. Gerechnet wurde mit der Breite vom Schieberegler.');\n                    }\n                }\n            }\n        }\n        return e;\n    }\n\n    \/* ---------- Rechnen ---------- *\/\n\n    function rechnen(e) {\n        var r = radiusGauss(e.breite);\n        var mP = massstabProjektion(e.y, r);\n        var mH = massstabHoehe(e.hoehe, r);\n        var m = mP * mH;\n        var d = m - 1;\n        var erg = {\n            r: r, mP: mP, mH: mH, m: m, d: d,\n            abw100: d * 100 * 100,\n            abwKm: d * 1000 * 100,\n            abwL: d * e.strecke * 100,\n            nullY: nullAbstand(e.hoehe, e.breite),\n            reichweite: zonenReichweite(e.breite),\n            \/* Abstand der Erdoberflaeche ueber der Abbildungsebene, die anschauliche Groesse der Grafik. *\/\n            dProj: hoeheUeberEbene(e.y, r),\n            dGesamt: 0,\n            fast: Math.abs(d) < 1e-6,\n            praktischNull: Math.abs(d) < 1e-7\n        };\n        erg.dGesamt = erg.dProj + e.hoehe;\n        erg.grenzA = d === 0 ? Infinity : Z_18202 \/ Math.abs(d);\n        erg.grenzB = d === 0 ? Infinity : Z_18710 \/ Math.abs(d);\n        erg.grenzE = d === 0 ? Infinity : (e.tol \/ 100) \/ Math.abs(d);\n        var anteilP = Math.abs(mP - 1);\n        var anteilH = Math.abs(mH - 1);\n        var summe = anteilP + anteilH;\n        erg.anteilP = summe > 0 ? (anteilP \/ summe) * 100 : 0;\n        return erg;\n    }\n\n    \/* ---------- Grafik A ---------- *\/\n\n    function aX(km) { return A_XC + km * A_PX_KM; }\n\n    function hoeheUeberEbene(yMeter, r) {\n        return (1 - K0) * r - (yMeter * yMeter) \/ (2 * r);\n    }\n\n    function aY(hMeter) { return A_PLANE - hMeter * A_SV; }\n\n    function zeichneA(e, erg) {\n        var r = erg.r;\n        var i, km, h, d;\n\n        d = '';\n        for (i = 0; i <= 60; i++) {\n            km = -A_YMAX_KM + (2 * A_YMAX_KM) * i \/ 60;\n            h = hoeheUeberEbene(Math.abs(km) * 1000, r);\n            d += (i === 0 ? 'M' : 'L') + aX(km).toFixed(1) + ' ' + aY(h).toFixed(1) + ' ';\n        }\n        setAttr('pmrArc', 'd', d);\n\n        var nullKm = erg.nullY \/ 1000;\n        var von = Math.min(nullKm, A_YMAX_KM);\n\n        \/* Flaeche zwischen den beiden laengentreuen Marken: dort liegt die Ebene unter dem Ellipsoid. *\/\n        var f = '';\n        if (von > 2) {\n            f = 'M' + aX(-von).toFixed(1) + ' ' + A_PLANE + ' ';\n            for (i = 0; i <= 40; i++) {\n                km = -von + (2 * von) * i \/ 40;\n                h = hoeheUeberEbene(Math.abs(km) * 1000, r);\n                f += 'L' + aX(km).toFixed(1) + ' ' + aY(h).toFixed(1) + ' ';\n            }\n            f += 'L' + aX(von).toFixed(1) + ' ' + A_PLANE + ' Z';\n        }\n        setAttr('pmrFillInnen', 'd', f);\n\n        \/* Die beiden aeusseren Keile, dort liegt die Ebene ueber dem Ellipsoid. *\/\n        var g = '';\n        if (von < A_YMAX_KM) {\n            var seite;\n            for (seite = -1; seite <= 1; seite += 2) {\n                g += 'M' + aX(seite * von).toFixed(1) + ' ' + A_PLANE + ' ';\n                for (i = 0; i <= 20; i++) {\n                    km = seite * (von + (A_YMAX_KM - von) * i \/ 20);\n                    h = hoeheUeberEbene(Math.abs(km) * 1000, r);\n                    g += 'L' + aX(km).toFixed(1) + ' ' + aY(h).toFixed(1) + ' ';\n                }\n                g += 'L' + aX(seite * A_YMAX_KM).toFixed(1) + ' ' + A_PLANE + ' Z ';\n            }\n        }\n        setAttr('pmrFillAussen', 'd', g);\n\n        var zeigeKreuz = nullKm > 4;\n        if (nullKm > A_YMAX_KM) { zeigeKreuz = false; }\n        sichtbar('pmrCrossL', zeigeKreuz);\n        sichtbar('pmrCrossR', zeigeKreuz);\n        if (zeigeKreuz) {\n            setAttr('pmrCrossL', 'x1', aX(-nullKm).toFixed(1));\n            setAttr('pmrCrossL', 'x2', aX(-nullKm).toFixed(1));\n            setAttr('pmrCrossR', 'x1', aX(nullKm).toFixed(1));\n            setAttr('pmrCrossR', 'x2', aX(nullKm).toFixed(1));\n            setText('pmrCrossLabel', 'l\u00e4ngentreu bei ' + fmt(nullKm, 0) + ' km');\n        } else {\n            setText('pmrCrossLabel', 'in dieser Zone nirgends l\u00e4ngentreu');\n        }\n\n        var xm = aX(e.yKm);\n        var hArc = hoeheUeberEbene(e.y, r);\n        var yArc = aY(hArc);\n        var yTerr = aY(hArc + e.hoehe);\n        setAttr('pmrDProj', 'x1', xm.toFixed(1));\n        setAttr('pmrDProj', 'x2', xm.toFixed(1));\n        setAttr('pmrDProj', 'y1', yArc.toFixed(1));\n        setAttr('pmrDProj', 'y2', A_PLANE);\n        setAttr('pmrDHoehe', 'x1', xm.toFixed(1));\n        setAttr('pmrDHoehe', 'x2', xm.toFixed(1));\n        setAttr('pmrDHoehe', 'y1', yTerr.toFixed(1));\n        setAttr('pmrDHoehe', 'y2', yArc.toFixed(1));\n        setAttr('pmrMarker', 'x', (xm - 6).toFixed(1));\n        setAttr('pmrMarker', 'y', (yTerr - 7).toFixed(1));\n\n        var lage = erg.dGesamt >= 0 ? ' m \u00fcber der Ebene' : ' m unter der Ebene';\n        setText('pmrDLabel', 'd = ' + fmtTausend(Math.abs(erg.dGesamt)) + lage);\n        setText('pmrDLabel2', 'Abbildung ' + vorzeichenTausend(erg.dProj) + ' m, H\u00f6he ' + vorzeichenTausend(e.hoehe) + ' m');\n\n        \/* Die Beschriftung der Erdoberflaeche sitzt links vom Scheitel, dort ist immer Platz:\n           die Marke des Projekts liegt nie links der Mitte. *\/\n        setAttr('pmrLabelErde', 'y', (aY(hoeheUeberEbene(90000, r)) - 12).toFixed(1));\n    }\n\n    \/* ---------- Grafik B ---------- *\/\n\n    function zeichneB(e, erg) {\n        var strecke = e.strecke > 0 ? e.strecke : 1;\n\n        \/* Die Skala zeigt die Ma\u00dfkette und, falls sie nicht zu weit drau\u00dfen liegt, auch die\n           Stelle der Grenzabweichung. Weiter als das Vierfache der Kette wird nicht gezoomt,\n           sonst schrumpft der Balken zur Nadel. *\/\n        var sichtbarMax = strecke;\n        function vielleichtWeiten(grenzM) {\n            if (isFinite(grenzM) !== true) { return; }\n            if (grenzM > strecke * 4) { return; }\n            if (grenzM > sichtbarMax) { sichtbarMax = grenzM; }\n        }\n        vielleichtWeiten(erg.grenzA);\n        vielleichtWeiten(erg.grenzB);\n        vielleichtWeiten(erg.grenzE);\n        var xMax = sichtbarMax * 1.04;\n\n        function bX(meter) { return B_XL + (meter \/ xMax) * (B_XR - B_XL); }\n\n        var xEnde = bX(strecke);\n        setAttr('pmrBBar', 'width', (xEnde - B_XL).toFixed(1));\n        setAttr('pmrBLang', 'x', xEnde.toFixed(1));\n        setAttr('pmrBEnde', 'x', xEnde.toFixed(1));\n        setText('pmrBLang', 'deine Ma\u00dfkette: ' + fmtTausend(e.strecke) + ' m');\n        setText('pmrBEnde', 'am Ende der Kette: ' + mitVorzeichen(erg.abwL, 1) + ' cm');\n\n        \/* Reststrich nach rechts, wo die Skala \u00fcber die Kette hinausl\u00e4uft. *\/\n        var zeigeRest = xEnde < B_XR - 2;\n        sichtbar('pmrBRest', zeigeRest);\n        setAttr('pmrBRest', 'x1', xEnde.toFixed(1));\n        setAttr('pmrBRest', 'x2', B_XR);\n\n        \/* Heller Abschnitt am Anfang: so weit bleibt die Abweichung unter 3,0 cm. *\/\n        var unterBreite = 0;\n        if (isFinite(erg.grenzA) === true) { unterBreite = Math.min(erg.grenzA, strecke); }\n        else { unterBreite = strecke; }\n        setAttr('pmrBBarUnter', 'width', Math.max(0, bX(unterBreite) - B_XL - 2).toFixed(1));\n\n        function marke(idLinie, idLabel, grenzM, text, textFern) {\n            var drin = isFinite(grenzM) === true;\n            if (drin) { if (grenzM > xMax) { drin = false; } }\n            sichtbar(idLinie, drin);\n            if (drin) {\n                var xx = bX(grenzM).toFixed(1);\n                setAttr(idLinie, 'x1', xx);\n                setAttr(idLinie, 'x2', xx);\n                setText(idLabel, text);\n            } else {\n                setText(idLabel, textFern);\n            }\n        }\n\n        marke('pmrTickA', 'pmrTickALabel', erg.grenzA,\n            '3,0 cm (DIN 18202) nach rund ' + meterLesbar(erg.grenzA) + ' ',\n            '3,0 cm (DIN 18202): ' + (isFinite(erg.grenzA) === true ? 'erst nach rund ' + meterLesbar(erg.grenzA) + ', weit jenseits der Kette' : 'auf keiner L\u00e4nge erreicht'));\n        marke('pmrTickB', 'pmrTickBLabel', erg.grenzB,\n            '1,32 cm (Ansatz DIN 18710-1) nach rund ' + meterLesbar(erg.grenzB) + ' ',\n            '1,32 cm (Ansatz DIN 18710-1): ' + (isFinite(erg.grenzB) === true ? 'erst nach rund ' + meterLesbar(erg.grenzB) + ', weit jenseits der Kette' : 'auf keiner L\u00e4nge erreicht'));\n\n        var eigenZeigen = Math.abs(e.tol - 3.0) > 0.001;\n        sichtbar('pmrTickESwatch', eigenZeigen);\n        sichtbar('pmrTickELabel', eigenZeigen);\n        if (eigenZeigen) {\n            marke('pmrTickE', 'pmrTickELabel', erg.grenzE,\n                'eigener Wert ' + fmt(e.tol, 2) + ' cm nach rund ' + meterLesbar(erg.grenzE) + ' ',\n                'eigener Wert ' + fmt(e.tol, 2) + ' cm: ' + (isFinite(erg.grenzE) === true ? 'erst nach rund ' + meterLesbar(erg.grenzE) + ', weit jenseits der Kette' : 'auf keiner L\u00e4nge erreicht'));\n        } else {\n            sichtbar('pmrTickE', false);\n        }\n    }\n\n    \/* ---------- Ausgabe ---------- *\/\n\n    function grenzText(grenzM, strecke) {\n        if (isFinite(grenzM) !== true) { return 'auf jeder L\u00e4nge eingehalten'; }\n        if (grenzM >= strecke) { return 'auf deiner Strecke eingehalten'; }\n        return 'nach rund ' + meterLesbar(grenzM) + ' \u00fcberschritten';\n    }\n\n    function grenzZahl(grenzM) {\n        if (isFinite(grenzM) !== true) { return 'ohne Grenze'; }\n        return meterLesbar(grenzM);\n    }\n\n    function hinweiseZeigen(liste) {\n        var box = el('pmrHinweise');\n        while (box.firstChild) { box.removeChild(box.firstChild); }\n        var i;\n        for (i = 0; i < liste.length; i++) {\n            var p = document.createElement('div');\n            p.className = 'pmr-hinweis';\n            p.appendChild(document.createTextNode(liste[i]));\n            box.appendChild(p);\n        }\n    }\n\n    function leerAusgeben(grund) {\n        setText('pmrMassstab', '\u2013');\n        setText('pmrMP', '\u2013');\n        setText('pmrMH', '\u2013');\n        setText('pmrAnteil', '\u2013');\n        setText('pmrAnteilSub', '');\n        setText('pmrAbw100', '\u2013');\n        setText('pmrAbwKm', '\u2013');\n        setText('pmrAbwL', '\u2013');\n        setText('pmrSatzC', grund);\n        setText('pmrGrenzA', '\u2013');\n        setText('pmrGrenzB', '\u2013');\n        setText('pmrGrenzE', '\u2013');\n        setText('pmrGrenzAText', '\u2013');\n        setText('pmrGrenzBText', '\u2013');\n        setText('pmrGrenzEText', '\u2013');\n        var b = el('pmrBefund');\n        while (b.firstChild) { b.removeChild(b.firstChild); }\n        var p = document.createElement('p');\n        p.appendChild(document.createTextNode(grund));\n        b.appendChild(p);\n    }\n\n    function befundSetzen(e, erg) {\n        var b = el('pmrBefund');\n        while (b.firstChild) { b.removeChild(b.firstChild); }\n        var saetze = [];\n        var betrag = Math.abs(erg.abwL);\n        var richtung = erg.d < 0 ? 'k\u00fcrzer' : 'l\u00e4nger';\n\n        if (erg.fast) {\n            saetze.push('Abbildung und H\u00f6henreduktion heben sich hier praktisch auf. Der Projektma\u00dfstab liegt so dicht an 1, dass Modellma\u00df und Naturma\u00df auf deiner Strecke von ' + fmtTausend(e.strecke) + ' m nur um ' + fmt(betrag, 2) + ' cm auseinanderliegen.');\n            saetze.push('F\u00fcr den Abwicklungsplan gilt trotzdem: Die Angabe geh\u00f6rt hinein, nach der Handreichung mit mindestens f\u00fcnf Nachkommastellen, oder der ausdr\u00fcckliche Vermerk, dass ohne Ma\u00dfstabs\u00e4nderung gearbeitet wird.');\n        } else {\n            if (e.strecke > 0) {\n                saetze.push('Auf ' + fmtTausend(e.strecke) + ' m laufen Modellma\u00df und Naturma\u00df um ' + fmt(betrag, 1) + ' cm auseinander. Die Strecke ist im Landesnetz um diesen Betrag ' + richtung + ' als in der Natur.');\n            }\n            if (isFinite(erg.grenzA) === true) {\n                if (erg.grenzA < e.strecke) {\n                    saetze.push('Die Grenzabweichung von 3,0 cm nach DIN 18202 ist schon nach rund ' + meterLesbar(erg.grenzA) + ' erreicht, die von 1,32 cm nach dem Ansatz aus DIN 18710-1 nach rund ' + meterLesbar(erg.grenzB) + '. Beides liegt innerhalb deiner Strecke.');\n                } else {\n                    if (erg.grenzB < e.strecke) {\n                        saetze.push('Die 3,0 cm nach DIN 18202 werden auf deiner Strecke nicht erreicht, sie k\u00e4men erst nach rund ' + meterLesbar(erg.grenzA) + '. Der sch\u00e4rfere Ansatz aus DIN 18710-1 mit 1,32 cm ist dagegen schon nach rund ' + meterLesbar(erg.grenzB) + ' ausgesch\u00f6pft.');\n                    } else {\n                        saetze.push('Beide Grenzabweichungen bleiben auf deiner Strecke eingehalten. Die 3,0 cm nach DIN 18202 k\u00e4men erst nach rund ' + meterLesbar(erg.grenzA) + ', die 1,32 cm nach dem Ansatz aus DIN 18710-1 nach rund ' + meterLesbar(erg.grenzB) + '.');\n                    }\n                }\n            }\n        }\n\n        if (Math.abs(e.tol - 3.0) > 0.001) {\n            if (isFinite(erg.grenzE) === true) {\n                if (erg.grenzE < e.strecke) {\n                    saetze.push('Mit deiner eigenen Grenzabweichung von ' + fmt(e.tol, 2) + ' cm ist bei rund ' + meterLesbar(erg.grenzE) + ' Schluss.');\n                } else {\n                    saetze.push('Deine eigene Grenzabweichung von ' + fmt(e.tol, 2) + ' cm wird auf dieser Strecke nicht ausgesch\u00f6pft, sie k\u00e4me erst nach rund ' + meterLesbar(erg.grenzE) + '.');\n                }\n            }\n        }\n\n        var i;\n        for (i = 0; i < saetze.length; i++) {\n            var p = document.createElement('p');\n            p.appendChild(document.createTextNode(saetze[i]));\n            b.appendChild(p);\n        }\n    }\n\n    function ausgeben(e, erg) {\n        setText('pmrMassstab', fmt(erg.m, 5));\n        setText('pmrMP', fmt(erg.mP, 8));\n        setText('pmrMH', fmt(erg.mH, 8));\n\n        var wer = erg.anteilP >= 50 ? 'Lage' : 'H\u00f6he';\n        setText('pmrAnteil', wer);\n        setText('pmrAnteilSub', fmt(erg.anteilP, 0) + ' Prozent des Ausschlags kommen aus der Abbildung, ' + fmt(100 - erg.anteilP, 0) + ' Prozent aus der H\u00f6he.');\n        setText('pmrMPSub', 'aus ' + fmtTausend(e.y) + ' m Abstand vom Mittelmeridian');\n        setText('pmrMHSub', 'aus ' + fmtTausend(e.hoehe) + ' m mittlerer H\u00f6he');\n\n        setText('pmrAbw100', mitVorzeichen(erg.abw100, 1) + ' cm');\n        setText('pmrAbwKm', mitVorzeichen(erg.abwKm, 1) + ' cm');\n        setText('pmrAbwL', mitVorzeichen(erg.abwL, 1) + ' cm');\n        setText('pmrAbwLSub', 'bei ' + fmtTausend(e.strecke) + ' m L\u00e4nge');\n\n        var richtung = erg.d < 0 ? 'k\u00fcrzer' : 'l\u00e4nger';\n        setText('pmrSatzC', 'Die Strecke ist im Landesnetz um ' + fmt(Math.abs(erg.abwL), 1) + ' cm ' + richtung + ' als in der Natur. Modellma\u00df und Naturma\u00df laufen gleichm\u00e4\u00dfig auseinander, je 1.000 m sind es ' + fmt(Math.abs(erg.abwKm), 1) + ' cm.');\n\n        setText('pmrGrenzA', grenzZahl(erg.grenzA));\n        setText('pmrGrenzB', grenzZahl(erg.grenzB));\n        setText('pmrGrenzE', grenzZahl(erg.grenzE));\n        setText('pmrGrenzAText', grenzText(erg.grenzA, e.strecke));\n        setText('pmrGrenzBText', grenzText(erg.grenzB, e.strecke));\n        setText('pmrGrenzEText', grenzText(erg.grenzE, e.strecke));\n        setText('pmrGrenzEKey', 'Eigener Wert, ' + fmt(e.tol, 2) + ' cm');\n\n        setText('pmrFormelWerte', 'Mit deinen Werten: y = ' + fmtTausend(e.y) + ' m, Breite ' + fmt(e.breite, 1) + ' Grad, R = ' + fmtTausend(erg.r) + ' m, H = ' + fmtTausend(e.hoehe) + ' m, L = ' + fmtTausend(e.strecke) + ' m.');\n\n        befundSetzen(e, erg);\n    }\n\n    \/* ---------- Grenzfaelle als Hinweiszeilen ---------- *\/\n\n    function hinweiseSammeln(e, erg) {\n        var liste = e.hinweise.slice(0);\n\n        if (e.y > erg.reichweite) {\n            liste.push('Bei ' + fmt(e.breite, 1) + ' Grad Breite reichen die 3 Grad L\u00e4ngenunterschied einer Zone rund ' + fmtTausend(erg.reichweite) + ' m weit. Dein Wert liegt dar\u00fcber. Das Projekt liegt vermutlich in der Nachbarzone, oder es arbeitet im erweiterten Zonenbereich. Gerechnet wird weiter.');\n        }\n\n        if (e.strecke <= 0) {\n            liste.push('Ohne Streckenl\u00e4nge bleiben Abweichung und Grenzl\u00e4nge leer. Ma\u00dfstab und Zerlegung stimmen trotzdem.');\n        }\n\n        if (erg.praktischNull) {\n            liste.push('Abbildungs- und H\u00f6henreduktion heben sich hier praktisch auf, die Grenzl\u00e4ngen liegen entsprechend weit drau\u00dfen.');\n        }\n\n        if (e.modus === 'grob') {\n            var nullKm = erg.nullY \/ 1000;\n            if (Math.abs(e.yKm - nullKm) > 8) {\n                liste.push('Bei dieser H\u00f6he w\u00e4re das Projekt in rund ' + fmt(nullKm, 0) + ' km Abstand vom Mittelmeridian l\u00e4ngentreu. Zieh den Regler dorthin, wenn du sehen willst, wie sich die beiden Anteile aufheben.');\n            }\n        }\n\n        hinweiseZeigen(liste);\n        return liste;\n    }\n\n    \/* ---------- Druckblatt ---------- *\/\n\n    function blattZeile(ziel, schluessel, wert, gross) {\n        var r = document.createElement('div');\n        r.className = 'pmr-blatt-row';\n        var k = document.createElement('div');\n        k.className = 'pmr-blatt-key';\n        k.appendChild(document.createTextNode(schluessel));\n        var v = document.createElement('div');\n        v.className = gross ? 'pmr-blatt-val pmr-blatt-gross' : 'pmr-blatt-val';\n        v.appendChild(document.createTextNode(wert));\n        r.appendChild(k);\n        r.appendChild(v);\n        ziel.appendChild(r);\n    }\n\n    function blattBlock(ziel, titel) {\n        var b = document.createElement('div');\n        b.className = 'pmr-blatt-blk';\n        var t = document.createElement('div');\n        t.className = 'pmr-blatt-blk-title';\n        t.appendChild(document.createTextNode(titel));\n        b.appendChild(t);\n        ziel.appendChild(b);\n        return b;\n    }\n\n    function blattText(ziel, txt, klasse) {\n        var p = document.createElement('p');\n        p.className = klasse ? klasse : 'pmr-blatt-text';\n        p.appendChild(document.createTextNode(txt));\n        ziel.appendChild(p);\n    }\n\n    function blattBauen(e, erg, hinweise) {\n        var blatt = el('pmrBlatt');\n        while (blatt.firstChild) { blatt.removeChild(blatt.firstChild); }\n\n        var kopf = document.createElement('div');\n        kopf.className = 'pmr-blatt-kopf';\n        var marke = document.createElement('div');\n        marke.className = 'pmr-blatt-marke';\n        marke.appendChild(document.createTextNode('CAD-Kompass, Anlage zum BIM-Abwicklungsplan'));\n        var titel = document.createElement('div');\n        titel.className = 'pmr-blatt-title';\n        titel.appendChild(document.createTextNode('Projektma\u00dfstab ETRS89\/UTM'));\n        var zeile = document.createElement('div');\n        zeile.className = 'pmr-blatt-zeile';\n        var projekt = el('pmrKopfProjekt').value;\n        var bearb = el('pmrKopfBearbeiter').value;\n        var datum = el('pmrKopfDatum').value;\n        zeile.appendChild(document.createTextNode(\n            'Projekt: ' + (projekt === '' ? '\u2013' : projekt) +\n            '  \u00b7  Bearbeiter: ' + (bearb === '' ? '\u2013' : bearb) +\n            '  \u00b7  Datum: ' + (datum === '' ? '\u2013' : datum)));\n        kopf.appendChild(marke);\n        kopf.appendChild(titel);\n        kopf.appendChild(zeile);\n        blatt.appendChild(kopf);\n\n        var bEin = blattBlock(blatt, 'Eingaben');\n        blattZeile(bEin, 'Eingabeart', e.modus === 'grob' ? 'abgesch\u00e4tzt \u00fcber den Abstand vom Mittelmeridian' : 'aus Ostwert und Hochwert');\n        if (e.modus === 'koord') {\n            blattZeile(bEin, 'Ostwert (Eingabe)', e.ostRoh === '' ? '\u2013' : e.ostRoh);\n            blattZeile(bEin, 'Hochwert (Eingabe)', e.hochRoh === '' ? '\u2013' : e.hochRoh);\n            if (e.hatZone) { blattZeile(bEin, 'Zonenkennziffer', String(e.zone) + ', beim Rechnen abgetrennt'); }\n        }\n        blattZeile(bEin, 'Abstand vom Mittelmeridian', fmtTausend(e.y) + ' m' + (e.seite === '' ? '' : ', ' + e.seite));\n        blattZeile(bEin, 'Geografische Breite', fmt(e.breite, 2) + ' Grad');\n        blattZeile(bEin, 'Mittlere Gel\u00e4ndeh\u00f6he \u00fcber NHN', fmtTausend(e.hoehe) + ' m');\n        blattZeile(bEin, 'L\u00e4ngste Strecke im Projekt', fmtTausend(e.strecke) + ' m');\n        blattZeile(bEin, 'Eigene Grenzabweichung', fmt(e.tol, 2) + ' cm');\n\n        var bErg = blattBlock(blatt, 'Ergebnis');\n        blattZeile(bErg, 'Projektma\u00dfstab m', fmt(erg.m, 5), true);\n        blattZeile(bErg, 'Abbildungsma\u00dfstab m(P)', fmt(erg.mP, 8));\n        blattZeile(bErg, 'H\u00f6henma\u00dfstab m(H)', fmt(erg.mH, 8));\n        blattZeile(bErg, 'Gau\u00df-Kr\u00fcger-Radius R', fmtTausend(erg.r) + ' m');\n        blattZeile(bErg, 'Abweichung je 100 m', mitVorzeichen(erg.abw100, 1) + ' cm');\n        blattZeile(bErg, 'Abweichung je Kilometer', mitVorzeichen(erg.abwKm, 1) + ' cm');\n        blattZeile(bErg, 'Abweichung auf ' + fmtTausend(e.strecke) + ' m', mitVorzeichen(erg.abwL, 1) + ' cm');\n        blattZeile(bErg, 'Eingehalten bis, 3,0 cm (DIN 18202)', grenzZahl(erg.grenzA));\n        blattZeile(bErg, 'Eingehalten bis, 1,32 cm (DIN 18710-1)', grenzZahl(erg.grenzB));\n        blattZeile(bErg, 'Eingehalten bis, eigener Wert', grenzZahl(erg.grenzE));\n\n        var bBef = blattBlock(blatt, 'Befund');\n        var quelleBefund = el('pmrBefund').getElementsByTagName('p');\n        var i;\n        for (i = 0; i < quelleBefund.length; i++) {\n            blattText(bBef, quelleBefund[i].textContent);\n        }\n        blattText(bBef, 'Eine Ma\u00dfstabs\u00e4nderung aus der L\u00e4ngenverzerrung wirkt nur auf die Lage. Die H\u00f6hen werden davon nicht ber\u00fchrt.');\n        if (hinweise.length > 0) {\n            for (i = 0; i < hinweise.length; i++) {\n                blattText(bBef, 'Hinweis: ' + hinweise[i]);\n            }\n        }\n\n        var bFor = blattBlock(blatt, 'Rechenweg');\n        blattText(bFor, el('pmrFormelBlock').textContent, 'pmr-blatt-formel');\n        blattText(bFor, el('pmrFormelWerte').textContent);\n\n        var bQ = blattBlock(blatt, 'Fundstellen');\n        blattText(bQ, 'Beziehung Projektma\u00dfstab gleich H\u00f6henma\u00dfstab mal Projektionsma\u00dfstab sowie beide Grenzabweichungen: Handreichung \u201eETRS89\/UTM bei Planungsaufgaben, Modul 2: Erstellung planungskonformer CAD-Daten\", Baufachliche Richtlinien Vermessung, Version 1.1, Stand 06.06.2021.');\n        blattText(bQ, 'F\u00fcnf Nachkommastellen und der Satz, dass die Ma\u00dfstabs\u00e4nderung nur auf die Lage wirkt: Handreichung \u201eGeoreferenzierung von BIM-Modellen\", BMVg und BImA, Version 1.0, Stand 16.07.2025.');\n        blattText(bQ, 'Aus DIN 18202 und DIN 18710-1 ist kein Satz \u00fcbernommen, genannt sind nur Nummer und Titel. Die beiden Zahlenwerte stammen aus der zitierenden Bundesver\u00f6ffentlichung.');\n\n        var fuss = document.createElement('div');\n        fuss.className = 'pmr-blatt-fuss';\n        fuss.appendChild(document.createTextNode('Eigene Rechnung nach der Beziehung aus Modul 2, Ellipsoid GRS80. Kein amtlicher Wert und keine Vermessungsleistung. F\u00fcr die Zahl, die du dem Auftraggeber vorlegst, ist das amtliche Online-Formular \u201eETRS89\/UTM-Projektma\u00dfstab und Planungskoordinatensystem\" der Baufachlichen Richtlinien Vermessung die bessere Adresse, betreut vom Landesamt GeoInformation Bremen, Seitenstand 2025. CAD-Kompass, Stand 09\/2026.'));\n        blatt.appendChild(fuss);\n    }\n\n    \/* ---------- Hauptlauf ---------- *\/\n\n    function alleAnzeigenAktualisieren() {\n        setText('pmrYVal', fmtTausend(ausSchieber('pmrY', 0)) + ' km');\n        setText('pmrBreiteVal', fmt(ausSchieber('pmrBreite', 51), 1) + ' Grad');\n        setText('pmrHoeheVal', fmtTausend(ausSchieber('pmrHoehe', 100)) + ' m');\n        setText('pmrStreckeVal', fmtTausend(ausSchieber('pmrStrecke', 800)) + ' m');\n    }\n\n    function lauf() {\n        alleAnzeigenAktualisieren();\n        var e = eingabenLesen();\n        if (!e.ok) {\n            hinweiseZeigen([e.grund]);\n            leerAusgeben(e.grund);\n            var blattLeer = el('pmrBlatt');\n            while (blattLeer.firstChild) { blattLeer.removeChild(blattLeer.firstChild); }\n            return;\n        }\n        var erg = rechnen(e);\n\n        if (e.modus === 'koord') {\n            setText('pmrYVal', fmt(e.yKm, 1) + ' km');\n            setText('pmrBreiteVal', fmt(e.breite, 2) + ' Grad');\n        }\n\n        ausgeben(e, erg);\n        zeichneA(e, erg);\n        zeichneB(e, erg);\n        var hinweise = hinweiseSammeln(e, erg);\n        blattBauen(e, erg, hinweise);\n        speichern();\n    }\n\n    \/* ---------- Speichern ---------- *\/\n\n    var FELDER_TEXT = ['pmrKopfProjekt', 'pmrKopfBearbeiter', 'pmrKopfDatum', 'pmrOst', 'pmrHoch', 'pmrTol'];\n    var FELDER_ZAHL = ['pmrY', 'pmrBreite', 'pmrHoehe', 'pmrStrecke'];\n\n    function speichern() {\n        var daten = { modus: modus };\n        var i;\n        for (i = 0; i < FELDER_TEXT.length; i++) { daten[FELDER_TEXT[i]] = el(FELDER_TEXT[i]).value; }\n        for (i = 0; i < FELDER_ZAHL.length; i++) { daten[FELDER_ZAHL[i]] = el(FELDER_ZAHL[i]).value; }\n        try {\n            window.localStorage.setItem(KEY, window.JSON.stringify(daten));\n        } catch (err) { \/* Speicher gesperrt, das Werkzeug laeuft trotzdem *\/ }\n    }\n\n    function laden() {\n        var roh = null;\n        try { roh = window.localStorage.getItem(KEY); } catch (err) { roh = null; }\n        if (!roh) { return; }\n        var daten = null;\n        try { daten = window.JSON.parse(roh); } catch (err) { daten = null; }\n        if (!daten) { return; }\n        var i;\n        for (i = 0; i < FELDER_TEXT.length; i++) {\n            if (typeof daten[FELDER_TEXT[i]] === 'string') { el(FELDER_TEXT[i]).value = daten[FELDER_TEXT[i]]; }\n        }\n        for (i = 0; i < FELDER_ZAHL.length; i++) {\n            if (typeof daten[FELDER_ZAHL[i]] === 'string') { el(FELDER_ZAHL[i]).value = daten[FELDER_ZAHL[i]]; }\n        }\n        if (daten.modus === 'koord') { modusSetzen('koord'); }\n    }\n\n    function loeschen() {\n        var ja = window.confirm('Alle Eingaben in diesem Werkzeug zur\u00fccksetzen?');\n        if (!ja) { return; }\n        try { window.localStorage.removeItem(KEY); } catch (err) { \/* nichts zu tun *\/ }\n        el('pmrKopfProjekt').value = '';\n        el('pmrKopfBearbeiter').value = '';\n        el('pmrKopfDatum').value = '';\n        el('pmrOst').value = '';\n        el('pmrHoch').value = '';\n        el('pmrTol').value = '3,0';\n        el('pmrY').value = '0';\n        el('pmrBreite').value = '51';\n        el('pmrHoehe').value = '100';\n        el('pmrStrecke').value = '800';\n        modusSetzen('grob');\n        lauf();\n    }\n\n    \/* ---------- Bedienung ---------- *\/\n\n    function modusSetzen(neu) {\n        modus = neu;\n        var grob = neu === 'grob';\n        el('pmrModusGrob').classList.toggle('is-active', grob);\n        el('pmrModusKoord').classList.toggle('is-active', !grob);\n        el('pmrGruppeGrob').classList.toggle('is-off', !grob);\n        el('pmrGruppeKoord').classList.toggle('is-off', grob);\n        \/* Die jeweils andere Gruppe wird deaktiviert, nicht ausgeblendet. *\/\n        el('pmrY').disabled = !grob;\n        el('pmrBreite').disabled = !grob;\n        el('pmrOst').disabled = grob;\n        el('pmrHoch').disabled = grob;\n    }\n\n    var PRESETS = {\n        odf:   { modus: 'grob', y: '0', breite: '51', hoehe: '100', strecke: '800' },\n        laengentreu: { modus: 'grob', y: '185', breite: '51', hoehe: '100', strecke: '800' },\n        rand:  { modus: 'grob', y: '210', breite: '51', hoehe: '50', strecke: '800' },\n        berg:  { modus: 'grob', y: '0', breite: '51', hoehe: '600', strecke: '800' },\n        kurz:  { modus: 'grob', y: '0', breite: '51', hoehe: '100', strecke: '50' },\n        koord: { modus: 'koord', ost: '32642828,551', hoch: '5652000', hoehe: '100', strecke: '800' }\n    };\n\n    function presetSetzen(name) {\n        var p = PRESETS[name];\n        if (!p) { return; }\n        if (p.y) { el('pmrY').value = p.y; }\n        \/* Die laengentreue Lage haengt an der Hoehe. Sie wird gerechnet, nicht fest eingetragen,\n           damit der Regler auf dem ganzen Kilometer am Nulldurchgang landet. *\/\n        if (name === 'laengentreu') {\n            el('pmrY').value = String(Math.round(nullAbstand(parseFloat(p.hoehe), parseFloat(p.breite)) \/ 1000));\n        }\n        if (p.breite) { el('pmrBreite').value = p.breite; }\n        if (p.hoehe) { el('pmrHoehe').value = p.hoehe; }\n        if (p.strecke) { el('pmrStrecke').value = p.strecke; }\n        if (p.ost) { el('pmrOst').value = p.ost; }\n        if (p.hoch) { el('pmrHoch').value = p.hoch; }\n        modusSetzen(p.modus);\n        lauf();\n    }\n\n    \/* Gedruckt wird eine Kopie des Rechners in einem unsichtbaren Rahmen, damit Kopf, Men\u00fc und Fu\u00df der\n       umgebenden Seite nicht mit aufs Papier kommen. Geht das nicht, druckt die Seite selbst. *\/\n    function druckeImRahmen() {\n        var stil = document.querySelector('style[data-pmr-stil]');\n        if (!stil) { return false; }\n        var rahmen = document.createElement('iframe');\n        rahmen.setAttribute('aria-hidden', 'true');\n        rahmen.setAttribute('tabindex', '-1');\n        rahmen.style.cssText = 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;';\n        document.body.appendChild(rahmen);\n        try {\n            var rd = rahmen.contentWindow.document;\n            var html = rd.documentElement;\n            if (!html) {\n                html = rd.createElement('html');\n                rd.appendChild(html);\n            }\n            var kopf = rd.head;\n            if (!kopf) {\n                kopf = rd.createElement('head');\n                html.appendChild(kopf);\n            }\n            var rumpf = rd.body;\n            if (!rumpf) {\n                rumpf = rd.createElement('body');\n                html.appendChild(rumpf);\n            }\n            html.setAttribute('lang', 'de');\n            var titel = rd.createElement('title');\n            titel.textContent = 'Projektma\u00dfstab-Rechner';\n            kopf.appendChild(titel);\n            var s = rd.createElement('style');\n            s.textContent = stil.textContent;\n            kopf.appendChild(s);\n            rumpf.style.margin = '0';\n            rumpf.style.fontFamily = window.getComputedStyle(root).fontFamily;\n            rumpf.appendChild(rd.importNode(root, true));\n        } catch (e) {\n            if (rahmen.parentNode) { rahmen.parentNode.removeChild(rahmen); }\n            return false;\n        }\n        window.setTimeout(function () {\n            try {\n                rahmen.contentWindow.focus();\n                rahmen.contentWindow.print();\n            } catch (e) {\n                \/* Druck im Rahmen gesperrt: der Knopf bleibt nutzbar. *\/\n            }\n            window.setTimeout(function () {\n                if (rahmen.parentNode) { rahmen.parentNode.removeChild(rahmen); }\n            }, 1500);\n        }, 100);\n        return true;\n    }\n\n    function binden() {\n        var ids = ['pmrY', 'pmrBreite', 'pmrHoehe', 'pmrStrecke'];\n        var i;\n        for (i = 0; i < ids.length; i++) {\n            el(ids[i]).addEventListener('input', lauf);\n        }\n        var texte = ['pmrOst', 'pmrHoch', 'pmrTol', 'pmrKopfProjekt', 'pmrKopfBearbeiter', 'pmrKopfDatum'];\n        for (i = 0; i < texte.length; i++) {\n            el(texte[i]).addEventListener('input', lauf);\n        }\n        el('pmrModusGrob').addEventListener('click', function () { modusSetzen('grob'); lauf(); });\n        el('pmrModusKoord').addEventListener('click', function () { modusSetzen('koord'); lauf(); });\n\n        var pbtns = root.querySelectorAll('[data-preset]');\n        for (i = 0; i < pbtns.length; i++) {\n            (function (b) {\n                b.addEventListener('click', function () { presetSetzen(b.getAttribute('data-preset')); });\n            })(pbtns[i]);\n        }\n\n        el('pmrDruck').addEventListener('click', function () {\n            if (!druckeImRahmen()) { window.print(); }\n        });\n        el('pmrLoeschen').addEventListener('click', loeschen);\n    }\n\n    function start() {\n        binden();\n        laden();\n        modusSetzen(modus);\n        lauf();\n    }\n\n    if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', start);\n    } else {\n        start();\n    }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Projektma\u00dfstab-Rechner Wie weit laufen Modellma\u00df und Naturma\u00df auf deiner Strecke auseinander, und ab welcher L\u00e4nge ist das zu viel? Lage [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"disabled","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[52],"tags":[],"class_list":["post-2601","post","type-post","status-publish","format-standard","hentry","category-tf3-bevor-das-erste-bauteil-entsteht"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":false,"author_link":"https:\/\/cad-kompass.de\/?author=1"},"uagb_comment_info":0,"uagb_excerpt":"Projektma\u00dfstab-Rechner Wie weit laufen Modellma\u00df und Naturma\u00df auf deiner Strecke auseinander, und ab welcher L\u00e4nge ist das zu viel? Lage [&hellip;]","_links":{"self":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts\/2601","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2601"}],"version-history":[{"count":3,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts\/2601\/revisions"}],"predecessor-version":[{"id":2703,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts\/2601\/revisions\/2703"}],"wp:attachment":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2601"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2601"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2601"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}