{"id":22250,"date":"2026-02-08T12:18:34","date_gmt":"2026-02-08T11:18:34","guid":{"rendered":"https:\/\/limainvestimmobilien.de\/?page_id=22250"},"modified":"2026-04-16T11:08:09","modified_gmt":"2026-04-16T09:08:09","slug":"preisatlas-hamburg","status":"publish","type":"page","link":"https:\/\/limainvestimmobilien.de\/en\/preisatlas-hamburg\/","title":{"rendered":"Preisatlas Hamburg"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"22250\" class=\"elementor elementor-22250\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3ac410d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3ac410d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-208d384\" data-id=\"208d384\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7861988 elementor-widget elementor-widget-html\" data-id=\"7861988\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"de\">\n<head>\n  <meta charset=\"UTF-8\" \/>\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" \/>\n  <meta name=\"theme-color\" content=\"#bb9e1c\" \/>\n\n  <title>Hamburg Lagenkarte 2026 \u2013 Immobilienpreise nach Stadtteil | Lima Invest<\/title>\n\n  <meta name=\"description\" content=\"Interaktive Hamburg Lagenkarte mit aktuellen Immobilienpreisen f\u00fcr Wohnungen und H\u00e4user nach Stadtteil. Stand Q4 2025 \/ Q1 2026. Heatmap, Suche, Preisvergleich.\" \/>\n  <meta name=\"keywords\" content=\"Hamburg Immobilienpreise, Lagenkarte Hamburg, Immobilie verkaufen Hamburg, Quadratmeterpreis Hamburg, Stadtteile Hamburg, Lima Invest\" \/>\n  <meta name=\"robots\" content=\"index, follow\" \/>\n  <meta name=\"author\" content=\"Lima Invest\" \/>\n\n  <meta property=\"og:type\" content=\"website\" \/>\n  <meta property=\"og:title\" content=\"Hamburg Lagenkarte 2026 \u2013 Immobilienpreise nach Stadtteil\" \/>\n  <meta property=\"og:description\" content=\"Aktuelle Quadratmeterpreise f\u00fcr Hamburg mit interaktiver Karte, Heatmap und Preisvergleich.\" \/>\n  <meta property=\"og:locale\" content=\"de_DE\" \/>\n\n  <meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n  <meta name=\"twitter:title\" content=\"Hamburg Lagenkarte 2026\" \/>\n  <meta name=\"twitter:description\" content=\"Immobilienpreise nach Stadtteil \u2013 interaktiv, mit Heatmap und Vergleichsgrafik.\" \/>\n\n  <link rel=\"preconnect\" href=\"https:\/\/cdnjs.cloudflare.com\" crossorigin \/>\n  <link rel=\"preconnect\" href=\"https:\/\/unpkg.com\" crossorigin \/>\n  <link rel=\"preconnect\" href=\"https:\/\/basemaps.cartocdn.com\" crossorigin \/>\n  <link rel=\"dns-prefetch\" href=\"https:\/\/api.hamburg.de\" \/>\n\n  <link\n    rel=\"stylesheet\"\n    href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\"\n    integrity=\"sha256-p4NxAoJBhIIN+hmNHrzRCf9tD\/miZyoHS5obTRR9BMY=\"\n    crossorigin=\"\"\n  \/>\n\n  <script defer src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"\n    integrity=\"sha256-20nQCchB9co0qIjJZRGuk2\/Z9VM+kNiyxNV1lvTlZBo=\"\n    crossorigin=\"\"><\/script>\n  <script defer src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.1\/chart.umd.min.js\"><\/script>\n\n  <script type=\"application\/ld+json\">\n  {\n    \"@context\": \"https:\/\/schema.org\",\n    \"@type\": \"Dataset\",\n    \"name\": \"Hamburg Lagenkarte \u2013 Immobilienpreise 2026\",\n    \"description\": \"Durchschnittliche Kauf- und Mietpreise f\u00fcr Wohnungen und H\u00e4user in Hamburger Stadtteilen.\",\n    \"keywords\": [\"Hamburg\", \"Immobilienpreise\", \"Lagenkarte\", \"Quadratmeterpreis\"],\n    \"spatialCoverage\": {\n      \"@type\": \"Place\",\n      \"name\": \"Hamburg, Deutschland\",\n      \"geo\": { \"@type\": \"GeoCoordinates\", \"latitude\": 53.5511, \"longitude\": 9.9937 }\n    },\n    \"temporalCoverage\": \"2025-10\/2026-03\",\n    \"creator\": { \"@type\": \"Organization\", \"name\": \"Lima Invest\" }\n  }\n  <\/script>\n\n  <style>\n    :root{\n      \/* Lima Invest Gold + Varianten *\/\n      --ci-gold: #bb9e1c;\n      --ci-gold-2: #e0c84d;\n      --ci-gold-dark: #6f5e0f;\n      --gold-rgb: 187,158,28;\n\n      \/* Marken-Typo \/ Farben *\/\n      --ci-ink: #1E2328;\n      --ci-paper: #F6F4EF;\n      --ci-paper-2: #FBFAF7;\n      --ci-line: rgba(30,35,40,.10);\n      --ci-shadow: 0 18px 50px rgba(0,0,0,.10);\n      --radius: 18px;\n\n      --stars-gold: #bb9e1c;\n      --focus-ring: 0 0 0 3px rgba(var(--gold-rgb), .45);\n    }\n\n    *, *::before, *::after{ margin:0; padding:0; box-sizing:border-box; }\n\n    html{ scroll-behavior: smooth; }\n\n    body{\n      font-family: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n      background:\n        radial-gradient(1200px 700px at 15% 10%, rgba(var(--gold-rgb), .14), transparent 60%),\n        radial-gradient(1000px 650px at 85% 30%, rgba(var(--gold-rgb), .09), transparent 60%),\n        linear-gradient(180deg, var(--ci-paper), var(--ci-paper-2));\n      min-height:100vh;\n      padding:22px;\n      color:var(--ci-ink);\n      -webkit-font-smoothing: antialiased;\n      text-rendering: optimizeLegibility;\n    }\n\n    .skip-link{\n      position:absolute; left:-9999px; top:0;\n      background: var(--ci-ink); color:#fff;\n      padding:10px 14px; border-radius:0 0 10px 0;\n      font-weight:700; z-index:9999;\n    }\n    .skip-link:focus{ left:0; }\n\n    :focus-visible{ outline: none; box-shadow: var(--focus-ring); border-radius: 8px; }\n\n    .container{\n      max-width:1600px;\n      margin:0 auto;\n      background:rgba(255,255,255,.75);\n      border:1px solid var(--ci-line);\n      border-radius:24px;\n      box-shadow:var(--ci-shadow);\n      overflow:hidden;\n      backdrop-filter: blur(8px);\n    }\n\n    \/* ============================\n       HEADER \u2013 editorial, elegant\n       ============================ *\/\n    .header{\n      position: relative;\n      padding: 52px 44px 36px;\n      background: linear-gradient(180deg, #FBFAF7 0%, #F6F4EF 100%);\n      border-bottom: 1px solid var(--ci-line);\n    }\n\n    .header-inner{\n      position: relative;\n      display: grid;\n      gap: 28px;\n      max-width: 1400px;\n      margin: 0 auto;\n    }\n\n    .header-top{\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 20px;\n      flex-wrap: wrap;\n    }\n\n    .kicker{\n      display: inline-flex;\n      align-items: center;\n      gap: 12px;\n      font-size: 0.78rem;\n      font-weight: 700;\n      letter-spacing: 0.16em;\n      text-transform: uppercase;\n      color: rgba(30,35,40,0.62);\n    }\n\n    .kicker-dot{\n      width: 6px; height: 6px; border-radius: 50%;\n      background: var(--ci-gold);\n      flex: 0 0 auto;\n    }\n\n    .cta-row{ display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }\n\n    .btn{\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 8px;\n      padding: 11px 20px;\n      border-radius: 999px;\n      border: 1px solid rgba(30,35,40,.16);\n      background: transparent;\n      color: var(--ci-ink);\n      font-weight: 600;\n      font-size: 0.92rem;\n      text-decoration: none;\n      font-family: inherit;\n      transition: background .18s ease, border-color .18s ease, color .18s ease;\n    }\n    .btn:hover{ background: rgba(30,35,40,.05); border-color: rgba(30,35,40,.28); }\n\n    .btn-primary{\n      background: var(--ci-gold);\n      color: #111;\n      border-color: var(--ci-gold);\n    }\n    .btn-primary:hover{\n      background: var(--ci-gold-dark);\n      border-color: var(--ci-gold-dark);\n      color: #fff;\n    }\n\n    .header-title{ max-width: 780px; }\n    .header-title h1{\n      font-size: clamp(2.1rem, 3.8vw, 3.2rem);\n      font-weight: 700;\n      letter-spacing: -0.02em;\n      line-height: 1.1;\n      color: var(--ci-ink);\n      margin-bottom: 16px;\n      position: relative;\n      padding-bottom: 18px;\n    }\n    .header-title h1::after{\n      content: \"\";\n      position: absolute;\n      bottom: 0; left: 0;\n      width: 48px; height: 2px;\n      background: var(--ci-gold);\n    }\n\n    .subtitle{\n      font-size: 1.05rem;\n      color: rgba(30,35,40,0.72);\n      font-weight: 400;\n      line-height: 1.5;\n      max-width: 640px;\n    }\n\n    .source{\n      font-size: 0.82rem;\n      color: rgba(30,35,40,0.58);\n      line-height: 1.65;\n      max-width: 880px;\n      border-top: 1px solid var(--ci-line);\n      padding-top: 18px;\n    }\n\n    @media (max-width: 760px){\n      .header{ padding: 32px 22px 26px; }\n      .header-top{ flex-direction: column; align-items: flex-start; }\n      .header-inner{ gap: 22px; }\n      .header-title h1{ padding-bottom: 14px; }\n    }\n\n    \/* ============================\n       CONTENT\n       ============================ *\/\n    .content{ padding:34px 38px; }\n    .reveal{ opacity:0; transform:translateY(14px); transition: opacity .75s ease, transform .75s ease; }\n    .reveal.is-visible{ opacity:1; transform:translateY(0); }\n\n    .info-box{\n      background: linear-gradient(135deg, rgba(var(--gold-rgb), .12), rgba(30,35,40,.03));\n      border-left:4px solid var(--ci-gold);\n      padding:20px;\n      border-radius:12px;\n      margin-bottom:22px;\n      border:1px solid rgba(var(--gold-rgb), .16);\n    }\n    .info-box h3{ margin-bottom:8px; font-size:1.05rem; }\n    .info-box p{ color: rgba(30,35,40,.80); line-height:1.65; font-size:.98rem; }\n\n    .section-title{ font-size:1.9rem; margin:18px 0 16px; font-weight:780; text-align:center; }\n\n    .panel{\n      background: rgba(255,255,255,.78);\n      border-radius: var(--radius);\n      padding: 18px;\n      border: 1px solid var(--ci-line);\n      box-shadow: 0 10px 30px rgba(0,0,0,.06);\n      position: relative;\n      overflow: hidden;\n    }\n\n    .panel::after{\n      content:\"\";\n      position:absolute; inset:-30%;\n      background: radial-gradient(closest-side, rgba(255,255,255,.72), transparent 65%);\n      transform: translateX(-30%) rotate(12deg);\n      opacity:0;\n      pointer-events:none;\n    }\n    .panel.map-ready::after{ animation: sweep 1.15s ease forwards; }\n    @keyframes sweep{\n      0%{ opacity:0; transform: translateX(-40%) rotate(12deg); }\n      20%{ opacity:.9; }\n      100%{ opacity:0; transform: translateX(90%) rotate(12deg); }\n    }\n\n    .map-tools{\n      display:flex;\n      gap:10px;\n      flex-wrap:wrap;\n      align-items:center;\n      justify-content: space-between;\n      margin-bottom: 12px;\n    }\n\n    .left-tools{\n      display:flex;\n      gap:10px;\n      flex-wrap:wrap;\n      align-items:center;\n      width: min(980px, 100%);\n    }\n\n    .search-wrap{ position:relative; width: min(520px, 100%); }\n    .search{\n      width:100%;\n      padding:12px 14px 12px 40px;\n      border-radius:14px;\n      border:1px solid rgba(30,35,40,.12);\n      background: rgba(255,255,255,.72);\n      box-shadow: 0 10px 25px rgba(0,0,0,.05);\n      font-size:1rem;\n      font-family: inherit;\n      color: inherit;\n      outline:none;\n      transition: border-color .16s ease, box-shadow .16s ease, transform .16s ease;\n    }\n    .search-icon{\n      position:absolute; left:14px; top:50%; transform: translateY(-50%);\n      width:18px; height:18px; opacity:.45; pointer-events:none;\n    }\n    .search:focus{\n      border-color: rgba(var(--gold-rgb), .55);\n      box-shadow: 0 12px 28px rgba(0,0,0,.07), 0 0 0 6px rgba(var(--gold-rgb), .14);\n      transform: translateY(-1px);\n    }\n\n    .suggestions{\n      position:absolute; top: calc(100% + 8px); left:0; right:0;\n      background: rgba(255,255,255,.95);\n      border:1px solid rgba(30,35,40,.12);\n      border-radius:14px;\n      box-shadow:0 18px 40px rgba(0,0,0,.10);\n      overflow:hidden;\n      display:none;\n      z-index:3000;\n      backdrop-filter: blur(8px);\n      max-height: 340px;\n      overflow-y: auto;\n    }\n    .suggestions.open{ display:block; animation: drop .18s ease both; }\n    @keyframes drop{ from{ opacity:0; transform:translateY(-6px); } to{ opacity:1; transform:translateY(0); } }\n    .suggestions button{\n      width:100%;\n      text-align:left;\n      padding:11px 12px;\n      border:none;\n      background: transparent;\n      cursor:pointer;\n      font-size:.98rem;\n      color: rgba(30,35,40,.88);\n      font-family: inherit;\n      transition: background .12s ease;\n    }\n    .suggestions button:hover,\n    .suggestions button.highlighted{ background: rgba(var(--gold-rgb), .10); }\n    .suggestions button .muted{ opacity:.65; font-size:.9rem; }\n\n    .pillbar{\n      display:flex;\n      gap:8px;\n      flex-wrap:wrap;\n      align-items:center;\n    }\n    .pill{\n      display:inline-flex;\n      align-items:center;\n      gap:10px;\n      padding:10px 12px;\n      border-radius:999px;\n      border:1px solid rgba(30,35,40,.12);\n      background: rgba(255,255,255,.62);\n      box-shadow:0 10px 25px rgba(0,0,0,.05);\n      user-select:none;\n    }\n    .pill label{\n      font-size:.92rem;\n      font-weight:760;\n      color: rgba(30,35,40,.84);\n      display:inline-flex;\n      gap:6px;\n      align-items:center;\n      cursor:pointer;\n    }\n\n    .seg{\n      display:inline-flex;\n      border:1px solid rgba(30,35,40,.12);\n      border-radius:999px;\n      overflow:hidden;\n      background: rgba(255,255,255,.55);\n    }\n    .seg button{\n      border:none;\n      background: transparent;\n      padding:9px 12px;\n      font-weight:780;\n      font-size:.92rem;\n      font-family: inherit;\n      cursor:pointer;\n      transition: background .15s ease, transform .15s ease, color .15s ease;\n      color: rgba(30,35,40,.80);\n    }\n    .seg button:hover{ background: rgba(var(--gold-rgb), .10); }\n    .seg button.active{\n      background: linear-gradient(135deg, rgba(var(--gold-rgb), .95), rgba(var(--gold-rgb), .80));\n      color:#111;\n    }\n\n    .switch{\n      width: 44px; height: 26px;\n      border-radius: 999px;\n      border: 1px solid rgba(30,35,40,.14);\n      background: rgba(30,35,40,.10);\n      position: relative;\n      transition: background .18s ease, border-color .18s ease;\n      cursor:pointer;\n      flex: 0 0 auto;\n    }\n    .switch::after{\n      content:\"\";\n      position:absolute; top:3px; left:3px;\n      width:20px; height:20px;\n      border-radius: 999px;\n      background: rgba(255,255,255,.95);\n      box-shadow: 0 10px 20px rgba(0,0,0,.10);\n      transition: transform .18s ease;\n    }\n    .switch.on{\n      background: rgba(var(--gold-rgb), .55);\n      border-color: rgba(var(--gold-rgb), .45);\n    }\n    .switch.on::after{ transform: translateX(18px); }\n\n    .badge{\n      display:inline-flex; align-items:center; gap:10px;\n      padding:10px 14px;\n      border:1px solid rgba(30,35,40,.10);\n      border-radius:999px;\n      background:rgba(255,255,255,.55);\n      backdrop-filter: blur(6px);\n      font-weight:650;\n      letter-spacing:.2px;\n      box-shadow:0 10px 25px rgba(0,0,0,.05);\n      font-size: 0.88rem;\n    }\n\n    #map{ width:100%; height:560px; border-radius:14px; overflow:hidden; background: rgba(255,255,255,.5); }\n\n    .map-error{\n      padding:18px;\n      border-radius:12px;\n      background: rgba(255,240,230,.9);\n      border:1px solid rgba(200,80,30,.25);\n      color:#6b2c10;\n      display:none;\n      margin-top:10px;\n      align-items:center;\n      justify-content:space-between;\n      gap:12px;\n    }\n    .map-error.show{ display:flex; flex-wrap:wrap; }\n    .map-error button{\n      background: #6b2c10; color:#fff; border:none; padding:8px 12px;\n      border-radius:10px; font-weight:700; cursor:pointer;\n      font-family: inherit;\n    }\n\n    .legend{ display:flex; justify-content:center; gap:18px; margin-top:16px; flex-wrap:wrap; }\n    .legend-item{\n      display:flex; align-items:center; gap:10px;\n      padding:8px 10px;\n      border-radius:999px;\n      border:1px solid var(--ci-line);\n      background: rgba(255,255,255,.65);\n    }\n    .legend-color{\n      width:18px; height:18px;\n      border-radius:6px;\n      border:1px solid rgba(0,0,0,.08);\n    }\n    .legend-text{ font-size:.92rem; color: rgba(30,35,40,.78); }\n\n    .leaflet-tooltip.custom-tip{\n      background: rgba(30,35,40,.92);\n      color: #fff;\n      border: 1px solid rgba(255,255,255,.10);\n      border-radius: 10px;\n      padding: 10px 12px;\n      box-shadow: 0 10px 24px rgba(0,0,0,.25);\n      font-size: 0.92rem;\n    }\n    .leaflet-tooltip.custom-tip::before{ border-top-color: rgba(30,35,40,.92); }\n\n    .table-container{\n      overflow-x:auto;\n      border-radius:12px;\n      border:1px solid var(--ci-line);\n      background: rgba(255,255,255,.85);\n    }\n    table{ width:100%; border-collapse: collapse; }\n    thead{ background: linear-gradient(135deg, rgba(30,35,40,.92), rgba(30,35,40,.82)); color:#fff; position: sticky; top: 0; z-index: 2; }\n    th{\n      padding:14px 16px;\n      text-align:left;\n      font-weight:650;\n      font-size:.95rem;\n      white-space:nowrap;\n      cursor: pointer;\n      user-select: none;\n      transition: background .15s ease;\n    }\n    th:hover{ background: rgba(255,255,255,.08); }\n    th .sort-arrow{ opacity: .4; margin-left:4px; font-size:.8rem; }\n    th.sorted-asc .sort-arrow,\n    th.sorted-desc .sort-arrow{ opacity:1; color: var(--ci-gold-2); }\n    td{\n      padding:14px 16px;\n      border-bottom:1px solid rgba(30,35,40,.08);\n      font-size:.95rem;\n      color: rgba(30,35,40,.86);\n      white-space:nowrap;\n    }\n    tbody tr{ transition: background-color .2s ease, transform .18s ease; cursor: pointer; }\n    tbody tr:hover{ background-color: rgba(var(--gold-rgb), .08); transform: translateY(-1px); }\n\n    .price-cell{ font-weight:700; }\n    .level-5{ color: rgba(30,35,40,.92); }\n    .level-4{ color: rgba(30,35,40,.82); }\n    .level-3{ color: rgba(30,35,40,.74); }\n    .level-2{ color: rgba(30,35,40,.66); }\n    .level-1{ color: rgba(30,35,40,.60); }\n\n    .stars{\n      color: var(--stars-gold);\n      letter-spacing: 1px;\n      filter: drop-shadow(0 2px 6px rgba(0,0,0,.08));\n    }\n\n    \/* Datenhinweis-Badge *\/\n    .data-note{\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 16px; height: 16px;\n      border-radius: 50%;\n      background: rgba(var(--gold-rgb), 0.22);\n      color: var(--ci-gold-dark);\n      font-size: 0.68rem;\n      font-weight: 800;\n      cursor: help;\n      margin-left: 6px;\n      vertical-align: middle;\n      font-style: normal;\n      font-family: \"Georgia\", serif;\n      transition: background .15s ease;\n    }\n    .data-note:hover{ background: rgba(var(--gold-rgb), 0.38); }\n\n    .modal-note{\n      margin-top: 14px;\n      padding: 12px 14px;\n      background: rgba(var(--gold-rgb), 0.10);\n      border-left: 3px solid var(--ci-gold);\n      border-radius: 8px;\n      font-size: 0.92rem;\n      color: rgba(30,35,40,0.82);\n      line-height: 1.5;\n    }\n    .modal-note strong{ color: var(--ci-ink); }\n\n    .chart-section{\n      margin-top: 32px;\n      background: rgba(255,255,255,.72);\n      border: 1px solid var(--ci-line);\n      padding: 24px;\n      border-radius: var(--radius);\n      box-shadow: 0 10px 30px rgba(0,0,0,.06);\n    }\n    .chart-title{ font-size:1.55rem; margin-bottom:14px; font-weight:760; text-align:center; }\n    .chart-container{ position:relative; height:440px; margin-bottom:18px; }\n    .chart-skeleton{\n      position:absolute; inset:0;\n      border-radius:12px;\n      background:\n        linear-gradient(90deg, rgba(0,0,0,.04), rgba(0,0,0,.08), rgba(0,0,0,.04));\n      background-size: 200% 100%;\n      animation: shimmerBG 1.6s ease-in-out infinite;\n    }\n    @keyframes shimmerBG{\n      0%{ background-position: 200% 0; }\n      100%{ background-position: -200% 0; }\n    }\n\n    .modal{ position:fixed; inset:0; display:none; place-items:center; background: rgba(0,0,0,.45); z-index:5000; padding:18px; }\n    .modal.is-open{ display:grid; }\n    .modal-card{\n      width:min(560px, 100%);\n      background: rgba(255,255,255,.92);\n      border:1px solid rgba(255,255,255,.35);\n      border-radius:18px;\n      box-shadow: 0 25px 70px rgba(0,0,0,.25);\n      overflow:hidden;\n      transform: translateY(10px) scale(.99);\n      opacity:0;\n      animation: popIn .22s ease forwards;\n    }\n    @keyframes popIn{ to{ transform: translateY(0) scale(1); opacity:1; } }\n    .modal-head{\n      padding:16px 18px;\n      background: linear-gradient(135deg, rgba(30,35,40,.92), rgba(30,35,40,.82));\n      color:#fff;\n      display:flex;\n      align-items:center;\n      justify-content:space-between;\n      gap:12px;\n    }\n    .modal-head strong{ font-size:1.05rem; }\n    .modal-close{\n      border:none;\n      background: rgba(255,255,255,.12);\n      color:#fff;\n      padding:8px 10px;\n      border-radius:10px;\n      cursor:pointer;\n      font-family: inherit;\n      transition: transform .15s ease, background .15s ease;\n    }\n    .modal-close:hover{ transform: translateY(-1px); background: rgba(255,255,255,.18); }\n    .modal-body{ padding:16px 18px 18px; color: rgba(30,35,40,.86); line-height:1.55; }\n\n    .kpi{\n      display:grid;\n      grid-template-columns: 1fr 1fr;\n      gap:10px;\n      margin-top:12px;\n    }\n    .kpi .box{\n      border:1px solid rgba(30,35,40,.10);\n      background: rgba(var(--gold-rgb), .08);\n      border-radius:14px;\n      padding:12px;\n    }\n    .kpi .label{ font-size:.85rem; opacity:.75; margin-bottom:6px; }\n    .kpi .value{ font-size:1.15rem; font-weight:820; color: var(--ci-ink); }\n\n    .footer{\n      background: rgba(255,255,255,.70);\n      padding:26px;\n      text-align:center;\n      color: rgba(30,35,40,.72);\n      font-size:.92rem;\n      border-top:1px solid var(--ci-line);\n    }\n    .footer p{ margin-bottom:8px; }\n    .footer strong{ color: rgba(30,35,40,.88); }\n\n    @media (max-width: 900px){\n      body{ padding: 14px; }\n      .content{ padding:22px; }\n      #map{ height:460px; }\n      .chart-container{ height:360px; }\n      .left-tools{ width:100%; flex-direction: column; align-items: stretch; }\n      .pillbar{ justify-content: space-between; }\n      .map-tools{ flex-direction: column; align-items: stretch; }\n      .badge#mapStatus{ align-self: flex-end; }\n      th, td{ padding: 10px 12px; font-size: .88rem; }\n    }\n\n    @media (prefers-reduced-motion: reduce){\n      *,\n      *::before,\n      *::after{\n        animation-duration: .001ms !important;\n        animation-iteration-count: 1 !important;\n        transition-duration: .001ms !important;\n        scroll-behavior: auto !important;\n      }\n      .reveal{ opacity:1; transform:none; }\n    }\n\n    @media print{\n      body{ background:#fff; padding:0; }\n      .container{ box-shadow:none; border:none; }\n      .btn, .map-tools, .search-wrap, .suggestions, .modal{ display:none !important; }\n      .panel, .chart-section, .info-box{ box-shadow:none; border-color: #ddd; break-inside: avoid; }\n      thead{ background:#1E2328 !important; -webkit-print-color-adjust: exact; print-color-adjust: exact; }\n      #map{ height: 360px; }\n    }\n  <\/style>\n<\/head>\n\n<body>\n  <a class=\"skip-link\" href=\"#main\">Zum Inhalt springen<\/a>\n\n  <div class=\"container\">\n    <header class=\"header\" role=\"banner\">\n      <div class=\"header-inner\">\n        <div class=\"header-top\">\n          <div class=\"kicker\">\n            <span class=\"kicker-dot\" aria-hidden=\"true\"><\/span>\n            Immobilienmarkt-Report \u00b7 Q4 2025 \/ Q1 2026\n          <\/div>\n\n          <div class=\"cta-row\">\n            <a class=\"btn btn-primary\"\n               href=\"https:\/\/limainvestimmobilien.de\/immobilie-verkaufen-klar-diskret-bestpreis-kostenlose-wertermittlung\/\"\n               target=\"_blank\" rel=\"noopener\">Kostenlose Bewertung<\/a>\n\n            <a class=\"btn\"\n               href=\"https:\/\/limainvestimmobilien.de\/immobilie-verkaufen-klar-diskret-bestpreis-kostenlose-wertermittlung\/#bewertung\"\n               target=\"_blank\" rel=\"noopener\">Immobilie verkaufen<\/a>\n          <\/div>\n        <\/div>\n\n        <div class=\"header-title\">\n          <h1>Hamburg Lagenkarte<\/h1>\n          <p class=\"subtitle\">Detaillierte Immobilienpreise nach Stadtteilen<\/p>\n        <\/div>\n\n        <p class=\"source\">\n          Quelle: Hausgold, Homeday, Aroundhome (Stand: Q4 2025 \/ Q1 2026). Die Preise sind Durchschnittswerte und k\u00f6nnen je nach Lage,\n          Ausstattung, Baujahr und Zustand der Immobilie erheblich variieren. In Top-Lagen wie Harvestehude, Blankenese oder HafenCity\n          k\u00f6nnen Spitzenimmobilien deutlich h\u00f6here Preise erzielen.\n        <\/p>\n      <\/div>\n    <\/header>\n\n    <main id=\"main\" class=\"content\" role=\"main\">\n      <section class=\"info-box reveal\" aria-labelledby=\"market-heading\">\n        <h3 id=\"market-heading\">\ud83d\udcca Markt\u00fcberblick 2026<\/h3>\n        <p>\n          Die Immobilienpreise in Hamburg haben sich 2025\/2026 weitgehend stabilisiert, nach den starken Anstiegen der Vorjahre.\n          Die Mietpreise steigen jedoch weiterhin moderat um etwa 4,5 % j\u00e4hrlich.\n        <\/p>\n      <\/section>\n\n      <section class=\"reveal\" aria-labelledby=\"map-heading\">\n        <h2 id=\"map-heading\" class=\"section-title\">Interaktive Hamburg-Karte (Stadtteile markiert)<\/h2>\n\n        <div class=\"panel\" id=\"mapPanel\">\n          <div class=\"map-tools\">\n            <div class=\"left-tools\">\n              <div class=\"search-wrap\">\n                <svg class=\"search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" aria-hidden=\"true\">\n                  <circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"m21 21-4.3-4.3\"\/>\n                <\/svg>\n                <input id=\"districtSearch\" class=\"search\" type=\"text\"\n                       placeholder=\"Stadtteil suchen\u2026 (z.B. Eppendorf, Winterhude, Ottensen)\"\n                       autocomplete=\"off\"\n                       role=\"combobox\"\n                       aria-expanded=\"false\"\n                       aria-controls=\"suggestions\"\n                       aria-autocomplete=\"list\" \/>\n                <div class=\"suggestions\" id=\"suggestions\" role=\"listbox\"><\/div>\n              <\/div>\n\n              <div class=\"pillbar\">\n                <div class=\"pill\">\n                  <span style=\"font-weight:800; opacity:.75;\">Preisniveau:<\/span>\n                  <div class=\"seg\" role=\"tablist\" aria-label=\"Preisniveau Auswahl\">\n                    <button id=\"modeWohn\" class=\"active\" type=\"button\" role=\"tab\" aria-selected=\"true\">Wohnungen<\/button>\n                    <button id=\"modeHaus\" type=\"button\" role=\"tab\" aria-selected=\"false\">H\u00e4user<\/button>\n                  <\/div>\n                <\/div>\n\n                <div class=\"pill\">\n                  <label for=\"heatmapSwitch\">\n                    Heatmap\n                    <span style=\"opacity:.65; font-weight:700;\">(soft)<\/span>\n                  <\/label>\n                  <div id=\"heatmapSwitch\" class=\"switch\" role=\"switch\" aria-checked=\"false\" tabindex=\"0\" aria-label=\"Heatmap umschalten\"><\/div>\n                <\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"badge\" id=\"mapStatus\" role=\"status\" aria-live=\"polite\">Karte l\u00e4dt\u2026<\/div>\n          <\/div>\n\n          <div id=\"map\" role=\"region\" aria-label=\"Hamburg Karte mit Stadtteil-Preisen\"><\/div>\n\n          <div class=\"map-error\" id=\"mapError\" role=\"alert\">\n            <div><strong>Karte konnte nicht geladen werden.<\/strong> Bitte Verbindung pr\u00fcfen.<\/div>\n            <button type=\"button\" id=\"mapRetry\">Erneut versuchen<\/button>\n          <\/div>\n\n          <div class=\"legend\" id=\"legend\" style=\"margin-top:14px;\" aria-label=\"Kartenlegende\"><\/div>\n        <\/div>\n      <\/section>\n\n      <section class=\"reveal\" style=\"margin-top: 30px;\" aria-labelledby=\"table-heading\">\n        <h2 id=\"table-heading\" class=\"section-title\">Detaillierte Preis\u00fcbersicht nach Stadtteil<\/h2>\n        <div class=\"table-container\">\n          <table aria-describedby=\"table-hint\">\n            <caption id=\"table-hint\" style=\"position:absolute; left:-9999px;\">\n              Klick auf Spaltenkopf zum Sortieren. Klick auf eine Zeile \u00f6ffnet den Stadtteil auf der Karte.\n            <\/caption>\n            <thead>\n              <tr>\n                <th data-sort=\"district\">Stadtteil <span class=\"sort-arrow\">\u2195<\/span><\/th>\n                <th data-sort=\"wohnungen\">Wohnungen (\u20ac\/m\u00b2) <span class=\"sort-arrow\">\u2195<\/span><\/th>\n                <th data-sort=\"haeuser\">H\u00e4user (\u20ac\/m\u00b2) <span class=\"sort-arrow\">\u2195<\/span><\/th>\n                <th data-sort=\"mieteWohn\">Miete Whg (\u20ac\/m\u00b2) <span class=\"sort-arrow\">\u2195<\/span><\/th>\n                <th data-sort=\"mieteHaus\">Miete Haus (\u20ac\/m\u00b2) <span class=\"sort-arrow\">\u2195<\/span><\/th>\n                <th data-sort=\"level\">Preisniveau <span class=\"sort-arrow\">\u2195<\/span><\/th>\n              <\/tr>\n            <\/thead>\n            <tbody id=\"tableBody\"><\/tbody>\n          <\/table>\n        <\/div>\n        <p style=\"margin-top:10px; font-size:.82rem; color:rgba(30,35,40,.55); text-align:center;\">\n          Zeilen mit <span class=\"data-note\" aria-hidden=\"true\">i<\/span> enthalten einen Datenhinweis. Mit der Maus dar\u00fcber fahren f\u00fcr Details.\n        <\/p>\n      <\/section>\n\n      <section class=\"chart-section reveal\" aria-labelledby=\"chart-heading\">\n        <h2 id=\"chart-heading\" class=\"chart-title\">Preisvergleich: Wohnungen vs. H\u00e4user<\/h2>\n        <div class=\"chart-container\" id=\"comparisonWrap\">\n          <div class=\"chart-skeleton\" id=\"compSkel\"><\/div>\n          <canvas id=\"comparisonChart\"><\/canvas>\n        <\/div>\n\n        <h2 class=\"chart-title\" style=\"margin-top: 34px;\">Preisspektrum (Linie)<\/h2>\n        <div class=\"chart-container\" id=\"rangeWrap\">\n          <div class=\"chart-skeleton\" id=\"rangeSkel\"><\/div>\n          <canvas id=\"priceRangeChart\"><\/canvas>\n        <\/div>\n      <\/section>\n\n      <section class=\"info-box reveal\" style=\"margin-top: 26px; border-left-color: var(--ci-ink);\" aria-labelledby=\"trends-heading\">\n        <h3 id=\"trends-heading\">\ud83d\udca1 Markttrends und Prognosen<\/h3>\n        <p>\n          <strong>Positive Indikatoren:<\/strong> Nachfrage bleibt hoch, Finanzierung 2026 tendenziell stabil.<br><br>\n          <strong>Risikofaktoren:<\/strong> Zinsanstieg \u00fcber 4 % k\u00f6nnte die Leistbarkeit dr\u00fccken.\n        <\/p>\n      <\/section>\n    <\/main>\n\n    <footer class=\"footer\" role=\"contentinfo\">\n      <p><strong>Datenquellen:<\/strong> Hausgold, Homeday, Aroundhome (Stand: Q4 2025 \/ Q1 2026)<\/p>\n      <p><strong>Mieten:<\/strong> Modellierte Sch\u00e4tzung<\/p>\n      <p><strong>Hinweis:<\/strong> \u00d8 Angebotspreise\/-mieten; reale Werte variieren je nach Objekt.<\/p>\n      <p>Letzte Aktualisierung: Februar 2026<\/p>\n    <\/footer>\n  <\/div>\n\n  <div class=\"modal\" id=\"modal\" aria-hidden=\"true\">\n    <div class=\"modal-card\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"modalTitle\">\n      <div class=\"modal-head\">\n        <strong id=\"modalTitle\">Stadtteil<\/strong>\n        <button class=\"modal-close\" id=\"modalClose\" type=\"button\" aria-label=\"Schlie\u00dfen\">\u2715<\/button>\n      <\/div>\n      <div class=\"modal-body\" id=\"modalBody\"><\/div>\n    <\/div>\n  <\/div>\n\n  <script>\n  (function(){\n    'use strict';\n\n    \/\/ =========================\n    \/\/ Konstanten\n    \/\/ =========================\n    const LEVEL_THRESHOLDS = {\n      wohnungen: [ [8000, 5], [7000, 4], [5000, 3], [4000, 2] ],\n      haeuser:   [ [11000, 5], [9000, 4], [6500, 3], [4800, 2] ]\n    };\n\n    const PALETTE_LEVEL = {\n      5: '#3b340b',\n      4: '#6b5c13',\n      3: '#8f7a16',\n      2: '#bb9e1c',\n      1: '#e3cf62'\n    };\n\n    const HEAT_LIGHT = { r: 247, g: 242, b: 223 };\n    const HEAT_DARK  = { r: 59,  g: 52,  b: 11  };\n\n    const RENT_MODEL = {\n      wohnungen: { yieldMin: 0.026, yieldMax: 0.042 },\n      haeuser:   { yieldMin: 0.022, yieldMax: 0.038 }\n    };\n\n    const API_ENDPOINT = 'https:\/\/api.hamburg.de\/datasets\/v1\/regionalstatistische_daten_stadtteile\/collections\/regionalstatistische_daten_stadtteile\/items?f=json&limit=2000';\n    const API_TIMEOUT_MS = 12000;\n\n    \/\/ Schwelle: wenn Hauspreis < 85% des Wohnungspreises, Datenhinweis setzen\n    const HOUSE_PRICE_ANOMALY_RATIO = 0.85;\n    const ANOMALY_NOTE = 'Wenige Hausangebote, Preis nicht repr\u00e4sentativ';\n\n    const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n    \/\/ =========================\n    \/\/ Daten\n    \/\/ =========================\n    const data = [\n      { district: 'Harvestehude', wohnungen: 9893, haeuser: 14539 },\n      { district: 'Rotherbaum', wohnungen: 9800, haeuser: 13418 },\n      { district: 'Eppendorf', wohnungen: 8582, haeuser: 11595 },\n      { district: 'Uhlenhorst', wohnungen: 8622, haeuser: 11487 },\n      { district: 'HafenCity', wohnungen: 8787, haeuser: 5265 },\n      { district: 'Winterhude', wohnungen: 8132, haeuser: 11446 },\n      { district: 'Othmarschen', wohnungen: 7815, haeuser: 10757 },\n      { district: 'Neustadt', wohnungen: 7739, haeuser: 5234 },\n      { district: 'Ottensen', wohnungen: 7627, haeuser: 10641 },\n      { district: 'Blankenese', wohnungen: 7410, haeuser: 9703 },\n      { district: 'St. Georg', wohnungen: 7369, haeuser: 10517 },\n      { district: 'Altona-Altstadt', wohnungen: 7170, haeuser: 9129 },\n      { district: 'St. Pauli', wohnungen: 7115, haeuser: 7611 },\n      { district: 'Eimsb\u00fcttel', wohnungen: 7102, haeuser: 9043 },\n      { district: 'Alsterdorf', wohnungen: 6500, haeuser: 7800 },\n      { district: 'Barmbek-S\u00fcd', wohnungen: 6621, haeuser: 9655 },\n      { district: 'Eilbek', wohnungen: 6154, haeuser: 8433 },\n      { district: 'Lokstedt', wohnungen: 6270, haeuser: 7540 },\n      { district: 'Bahrenfeld', wohnungen: 5874, haeuser: 7385 },\n      { district: 'Neuenfelde', wohnungen: 5904, haeuser: 3085 },\n      { district: 'Osdorf', wohnungen: 5312, haeuser: 6710 },\n      { district: 'Wellingsb\u00fcttel', wohnungen: 5478, haeuser: 6740 },\n      { district: 'Hamm', wohnungen: 5332, haeuser: 6494 },\n      { district: 'Marienthal', wohnungen: 5499, haeuser: 6399 },\n      { district: 'Volksdorf', wohnungen: 5236, haeuser: 5910 },\n      { district: 'Poppenb\u00fcttel', wohnungen: 5100, haeuser: 6200 },\n      { district: 'Rissen', wohnungen: 4966, haeuser: 6385 },\n      { district: 'Hummelsb\u00fcttel', wohnungen: 4900, haeuser: 5900 },\n      { district: 'Wandsbek', wohnungen: 4874, haeuser: 4919 },\n      { district: 'Niendorf', wohnungen: 4831, haeuser: 5510 },\n      { district: 'Sasel', wohnungen: 4800, haeuser: 5500 },\n      { district: 'Bramfeld', wohnungen: 4691, haeuser: 4949 },\n      { district: 'Langenhorn', wohnungen: 4495, haeuser: 4546 },\n      { district: 'Wilhelmsburg', wohnungen: 4462, haeuser: 4219 },\n      { district: 'Horn', wohnungen: 4449, haeuser: 4520 },\n      { district: 'Farmsen-Berne', wohnungen: 4373, haeuser: 4840 },\n      { district: 'Schnelsen', wohnungen: 4354, haeuser: 4901 },\n      { district: 'Eidelstedt', wohnungen: 4343, haeuser: 4904 },\n      { district: 'Rahlstedt', wohnungen: 4323, haeuser: 4815 },\n      { district: 'Bergedorf', wohnungen: 4318, haeuser: 4508 },\n      { district: 'Lohbr\u00fcgge', wohnungen: 4200, haeuser: 4600 },\n      { district: 'Jenfeld', wohnungen: 4100, haeuser: 4400 },\n      { district: 'Billstedt', wohnungen: 3981, haeuser: 4227 },\n      { district: 'Harburg', wohnungen: 3966, haeuser: 4360 },\n      { district: 'Kirchwerder', wohnungen: 3900, haeuser: 4300 },\n      { district: 'Finkenwerder', wohnungen: 3865, haeuser: 4109 },\n      { district: 'Steilshoop', wohnungen: 3800, haeuser: 4100 },\n      { district: 'Neuallerm\u00f6he', wohnungen: 3700, haeuser: 4000 },\n      { district: 'Neugraben-Fischbek', wohnungen: 3577, haeuser: 3862 }\n    ];\n\n    \/\/ Auto-Flag: Hauspreis deutlich unter Wohnungspreis -> Hinweis setzen\n    data.forEach(d => {\n      if (!d.note && d.haeuser < d.wohnungen * HOUSE_PRICE_ANOMALY_RATIO){\n        d.note = ANOMALY_NOTE;\n      }\n    });\n\n    \/\/ =========================\n    \/\/ Utils\n    \/\/ =========================\n    const clamp01 = (x) => Math.max(0, Math.min(1, x));\n    const lerp = (a,b,t) => a + (b-a)*t;\n    const normalizeName = (s) => String(s || '').toLowerCase().replace(\/\\s+\/g,' ').trim();\n    const escapeHtml = (s) => String(s).replace(\/[&<>\"']\/g, c => ({\n      '&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'\n    }[c]));\n\n    const numberFormat = new Intl.NumberFormat('de-DE');\n    const rentFormat = new Intl.NumberFormat('de-DE', { minimumFractionDigits: 1, maximumFractionDigits: 1 });\n    const formatEUR = (v) => (v == null || v === '-') ? '\u2014' : numberFormat.format(Number(v)) + ' \u20ac';\n    const formatRent = (v) => (v == null || v === '-') ? '\u2014' : rentFormat.format(Number(v)) + ' \u20ac';\n\n    function debounce(fn, ms){\n      let t; return function(...args){ clearTimeout(t); t = setTimeout(() => fn.apply(this, args), ms); };\n    }\n\n    function getFieldMinMax(field){\n      const vals = data.map(d => d[field]).filter(v => typeof v === 'number' && !Number.isNaN(v));\n      return { min: Math.min(...vals), max: Math.max(...vals) };\n    }\n\n    function estimateMonthlyRentPerM2(pricePerM2, field){\n      const { min, max } = getFieldMinMax(field);\n      const t = clamp01((pricePerM2 - min) \/ (max - min || 1));\n      const model = RENT_MODEL[field] || RENT_MODEL.wohnungen;\n      const grossYield = lerp(model.yieldMax, model.yieldMin, t);\n      return Math.round((pricePerM2 * grossYield) \/ 12 * 10) \/ 10;\n    }\n\n    data.forEach(d => {\n      d.mieteWohn = estimateMonthlyRentPerM2(d.wohnungen, 'wohnungen');\n      d.mieteHaus = estimateMonthlyRentPerM2(d.haeuser, 'haeuser');\n    });\n\n    function getLevel(value, mode){\n      const thresholds = LEVEL_THRESHOLDS[mode] || LEVEL_THRESHOLDS.wohnungen;\n      for (const [limit, lvl] of thresholds){\n        if (value >= limit) return lvl;\n      }\n      return 1;\n    }\n\n    function heatColor(t){\n      t = clamp01(t);\n      const r = Math.round(lerp(HEAT_LIGHT.r, HEAT_DARK.r, t));\n      const g = Math.round(lerp(HEAT_LIGHT.g, HEAT_DARK.g, t));\n      const b = Math.round(lerp(HEAT_LIGHT.b, HEAT_DARK.b, t));\n      return `rgb(${r}, ${g}, ${b})`;\n    }\n\n    \/\/ =========================\n    \/\/ State\n    \/\/ =========================\n    const byDistrict = new Map(data.map(d => [normalizeName(d.district), d]));\n    let priceMode = 'wohnungen';\n    let heatmapOn = false;\n    let currentSort = { key: null, dir: 'asc' };\n\n    const getValueForMode = (m) => !m ? null : (priceMode === 'wohnungen' ? m.wohnungen : m.haeuser);\n    function getModeMinMax(){ return getFieldMinMax(priceMode); }\n\n    \/\/ =========================\n    \/\/ Modal\n    \/\/ =========================\n    const modal = document.getElementById('modal');\n    const modalTitle = document.getElementById('modalTitle');\n    const modalBody = document.getElementById('modalBody');\n    const modalClose = document.getElementById('modalClose');\n\n    function openDistrictModal(name, match){\n      modalTitle.textContent = name;\n      const current = getValueForMode(match);\n\n      const noteBlock = match?.note\n        ? `<div class=\"modal-note\"><strong>Datenhinweis:<\/strong> ${escapeHtml(match.note)}<\/div>`\n        : '';\n\n      modalBody.innerHTML = `\n        <div style=\"opacity:.85\">\u00d8 Angebotspreise pro m\u00b2<\/div>\n        <div class=\"kpi\">\n          <div class=\"box\"><div class=\"label\">Wohnungen<\/div><div class=\"value\">${formatEUR(match?.wohnungen)}\/m\u00b2<\/div><\/div>\n          <div class=\"box\"><div class=\"label\">H\u00e4user<\/div><div class=\"value\">${formatEUR(match?.haeuser)}\/m\u00b2<\/div><\/div>\n        <\/div>\n        ${noteBlock}\n        <div style=\"margin-top:14px; opacity:.85\">\u00d8 Angebotsmieten pro m\u00b2<\/div>\n        <div class=\"kpi\">\n          <div class=\"box\"><div class=\"label\">Wohnungen (Miete)<\/div><div class=\"value\">${formatRent(match?.mieteWohn)}\/m\u00b2<\/div><\/div>\n          <div class=\"box\"><div class=\"label\">H\u00e4user (Miete)<\/div><div class=\"value\">${formatRent(match?.mieteHaus)}\/m\u00b2<\/div><\/div>\n        <\/div>\n        <div style=\"margin-top:12px; font-size:.92rem; opacity:.80\">\n          Aktiver Modus: <strong>${priceMode === 'wohnungen' ? 'Wohnungen' : 'H\u00e4user'}<\/strong> \u2014 ${current != null ? formatEUR(current) + '\/m\u00b2' : '\u2014'}\n        <\/div>\n        <div style=\"margin-top:8px; font-size:.85rem; opacity:.72\">\n          Hinweis: Mieten sind modelliert (Sch\u00e4tzung) aus Kaufpreisen und Rendite-Spanne.\n        <\/div>\n      `;\n      modal.classList.add('is-open');\n      modal.setAttribute('aria-hidden', 'false');\n      modalClose.focus();\n    }\n    function closeModal(){\n      modal.classList.remove('is-open');\n      modal.setAttribute('aria-hidden', 'true');\n    }\n    modalClose.addEventListener('click', closeModal);\n    modal.addEventListener('click', (e) => { if (e.target === modal) closeModal(); });\n    document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && modal.classList.contains('is-open')) closeModal(); });\n\n    \/\/ =========================\n    \/\/ Reveal animations\n    \/\/ =========================\n    if (!prefersReducedMotion){\n      const io = new IntersectionObserver((entries) => {\n        entries.forEach(e => { if (e.isIntersecting){ e.target.classList.add('is-visible'); io.unobserve(e.target); } });\n      }, { threshold: 0.10 });\n      document.querySelectorAll('.reveal').forEach(el => io.observe(el));\n    } else {\n      document.querySelectorAll('.reveal').forEach(el => el.classList.add('is-visible'));\n    }\n\n    \/\/ =========================\n    \/\/ Tabelle\n    \/\/ =========================\n    const tableBody = document.getElementById('tableBody');\n    const starsStr = (n) => '\u2605'.repeat(n);\n\n    function renderTable(rows){\n      const fragment = document.createDocumentFragment();\n      rows.forEach(d => {\n        const level = getLevel(d.wohnungen, 'wohnungen');\n        const tr = document.createElement('tr');\n        tr.dataset.district = d.district;\n\n        const noteIcon = d.note\n          ? ` <span class=\"data-note\" title=\"${escapeHtml(d.note)}\" aria-label=\"Datenhinweis: ${escapeHtml(d.note)}\">i<\/span>`\n          : '';\n\n        tr.innerHTML = `\n          <td><strong>${d.district}<\/strong>${noteIcon}<\/td>\n          <td class=\"price-cell level-${level}\">${formatEUR(d.wohnungen)}<\/td>\n          <td class=\"price-cell level-${level}\">${formatEUR(d.haeuser)}<\/td>\n          <td>${formatRent(d.mieteWohn)}\/m\u00b2<\/td>\n          <td>${formatRent(d.mieteHaus)}\/m\u00b2<\/td>\n          <td class=\"stars\" aria-label=\"Preisniveau ${level} von 5\">${starsStr(level)}<\/td>\n        `;\n        tr.addEventListener('click', () => focusDistrictByName(d.district));\n        fragment.appendChild(tr);\n      });\n      tableBody.innerHTML = '';\n      tableBody.appendChild(fragment);\n    }\n    renderTable(data);\n\n    \/\/ Sortierung\n    document.querySelectorAll('th[data-sort]').forEach(th => {\n      th.addEventListener('click', () => {\n        const key = th.dataset.sort;\n        const dir = (currentSort.key === key && currentSort.dir === 'asc') ? 'desc' : 'asc';\n        currentSort = { key, dir };\n\n        document.querySelectorAll('th[data-sort]').forEach(h => h.classList.remove('sorted-asc','sorted-desc'));\n        th.classList.add(dir === 'asc' ? 'sorted-asc' : 'sorted-desc');\n        const arrow = th.querySelector('.sort-arrow');\n        if (arrow) arrow.textContent = dir === 'asc' ? '\u25b2' : '\u25bc';\n\n        const sorted = [...data].sort((a,b) => {\n          let va, vb;\n          if (key === 'level'){ va = getLevel(a.wohnungen, 'wohnungen'); vb = getLevel(b.wohnungen, 'wohnungen'); }\n          else if (key === 'district'){ return dir === 'asc' ? a.district.localeCompare(b.district,'de') : b.district.localeCompare(a.district,'de'); }\n          else { va = a[key]; vb = b[key]; }\n          return dir === 'asc' ? va - vb : vb - va;\n        });\n        renderTable(sorted);\n      });\n    });\n\n    \/\/ =========================\n    \/\/ Charts (lazy init)\n    \/\/ =========================\n    const districts = data.map(d => d.district);\n    const wohnungenPrices = data.map(d => d.wohnungen);\n    const haeuserPrices = data.map(d => d.haeuser);\n\n    const chartOptionsBase = {\n      responsive: true,\n      maintainAspectRatio: false,\n      animation: prefersReducedMotion ? false : { duration: 900, easing: 'easeOutQuart' },\n      plugins: {\n        legend: { position: 'top', labels: { padding: 14, usePointStyle: true, font: { size: 12, weight: 'bold' } } },\n        tooltip: {\n          backgroundColor: 'rgba(30,35,40,0.92)', padding: 12,\n          callbacks: { label: (ctx) => `${ctx.dataset.label}: ${numberFormat.format(ctx.parsed.y)} \u20ac\/m\u00b2` }\n        }\n      },\n      scales: {\n        y: { beginAtZero: true, max: 16000,\n          ticks: { callback: (v) => numberFormat.format(v) + ' \u20ac', font: { size: 11 } },\n          grid: { color: 'rgba(0,0,0,0.06)' } },\n        x: { ticks: { font: { size: 11 } }, grid: { display: false } }\n      }\n    };\n\n    let comparisonChart = null;\n    let priceRangeChart = null;\n\n    function initComparisonChart(){\n      if (comparisonChart || typeof Chart === 'undefined') return;\n      const ctx = document.getElementById('comparisonChart').getContext('2d');\n      comparisonChart = new Chart(ctx, {\n        type: 'bar',\n        data: {\n          labels: districts,\n          datasets: [\n            { label: 'Wohnungen (\u20ac\/m\u00b2)', data: wohnungenPrices,\n              backgroundColor: 'rgba(187, 158, 28, 0.70)', borderColor: '#bb9e1c', borderWidth: 1, borderRadius: 8 },\n            { label: 'H\u00e4user (\u20ac\/m\u00b2)', data: haeuserPrices,\n              backgroundColor: 'rgba(30, 35, 40, 0.55)', borderColor: 'rgba(30, 35, 40, 0.95)', borderWidth: 1, borderRadius: 8 }\n          ]\n        },\n        options: chartOptionsBase\n      });\n      document.getElementById('compSkel')?.remove();\n    }\n\n    function initRangeChart(){\n      if (priceRangeChart || typeof Chart === 'undefined') return;\n      const ctx = document.getElementById('priceRangeChart').getContext('2d');\n      priceRangeChart = new Chart(ctx, {\n        type: 'line',\n        data: {\n          labels: districts,\n          datasets: [\n            { label: 'Wohnungen (\u20ac\/m\u00b2)', data: wohnungenPrices,\n              borderColor: '#bb9e1c', backgroundColor: 'rgba(187, 158, 28, 0.12)',\n              borderWidth: 3, fill: true, tension: 0.35, pointRadius: 5,\n              pointBackgroundColor: '#bb9e1c', pointBorderColor: '#fff', pointBorderWidth: 2, pointHoverRadius: 7 },\n            { label: 'H\u00e4user (\u20ac\/m\u00b2)', data: haeuserPrices,\n              borderColor: 'rgba(30, 35, 40, 0.95)', backgroundColor: 'rgba(30, 35, 40, 0.08)',\n              borderWidth: 3, fill: true, tension: 0.35, pointRadius: 5,\n              pointBackgroundColor: 'rgba(30, 35, 40, 0.95)', pointBorderColor: '#fff', pointBorderWidth: 2, pointHoverRadius: 7 }\n          ]\n        },\n        options: chartOptionsBase\n      });\n      document.getElementById('rangeSkel')?.remove();\n    }\n\n    function lazyInitCharts(){\n      const compWrap = document.getElementById('comparisonWrap');\n      const rangeWrap = document.getElementById('rangeWrap');\n\n      const waitForChart = () => {\n        if (typeof Chart !== 'undefined'){\n          const chartObs = new IntersectionObserver((entries) => {\n            entries.forEach(e => {\n              if (e.isIntersecting){\n                if (e.target === compWrap) initComparisonChart();\n                if (e.target === rangeWrap) initRangeChart();\n                chartObs.unobserve(e.target);\n              }\n            });\n          }, { rootMargin: '100px 0px' });\n          chartObs.observe(compWrap);\n          chartObs.observe(rangeWrap);\n        } else {\n          setTimeout(waitForChart, 80);\n        }\n      };\n      waitForChart();\n    }\n    lazyInitCharts();\n\n    \/\/ =========================\n    \/\/ Map\n    \/\/ =========================\n    const mapStatus = document.getElementById('mapStatus');\n    const mapPanel = document.getElementById('mapPanel');\n    const legendEl = document.getElementById('legend');\n    const mapErrorEl = document.getElementById('mapError');\n    const mapRetryBtn = document.getElementById('mapRetry');\n\n    let map = null;\n    let geoLayer = null;\n    const districtLayers = new Map();\n\n    function initMap(){\n      if (typeof L === 'undefined'){ setTimeout(initMap, 80); return; }\n      if (map) return;\n      map = L.map('map', { zoomControl: true, scrollWheelZoom: false }).setView([53.5511, 9.9937], 10);\n      L.tileLayer('https:\/\/{s}.basemaps.cartocdn.com\/light_all\/{z}\/{x}\/{y}{r}.png', {\n        attribution: '&copy; OpenStreetMap &copy; CARTO',\n        maxZoom: 19\n      }).addTo(map);\n      loadHamburgDistricts();\n    }\n\n    function getDistrictNameFromProps(props){\n      if (!props) return null;\n      const candidates = new Set(['stadtteil','stadtteilname','name','stt_name','stt','st_name','bezirk_stadtteil','stt_bez','stt_bezeichnung']);\n      for (const k of Object.keys(props)){\n        if (candidates.has(normalizeName(k))){\n          const v = props[k];\n          if (typeof v === 'string' && v.trim()) return v.trim();\n        }\n      }\n      for (const k of Object.keys(props)){\n        const v = props[k];\n        if (typeof v === 'string' && v.length >= 3 && v.length <= 60 && !\/^\\d+$\/.test(v)) return v.trim();\n      }\n      return null;\n    }\n\n    function dynamicStyle(feature){\n      const name = getDistrictNameFromProps(feature.properties);\n      const match = name ? byDistrict.get(normalizeName(name)) : null;\n      const value = match ? getValueForMode(match) : null;\n      const base = { color: 'rgba(30,35,40,0.55)', weight: 1, opacity: 0.9 };\n      if (!match || value == null) return { ...base, fillColor: '#E9E4D5', fillOpacity: 0.10 };\n      if (heatmapOn){\n        const { min, max } = getModeMinMax();\n        const t = (value - min) \/ (max - min || 1);\n        return { ...base, fillColor: heatColor(t), fillOpacity: 0.72 };\n      }\n      const lvl = getLevel(value, priceMode);\n      return { ...base, fillColor: PALETTE_LEVEL[lvl], fillOpacity: 0.62 };\n    }\n\n    function makeTooltipHTML(name, match){\n      const current = getValueForMode(match);\n      const modeLabel = priceMode === 'wohnungen' ? 'Wohnungen' : 'H\u00e4user';\n      const modeVal = current != null ? `${formatEUR(current)}\/m\u00b2` : '\u2014';\n\n      if (!match){\n        return `<div style=\"font-weight:800; margin-bottom:4px;\">${escapeHtml(name)}<\/div>\n                <div style=\"opacity:.86\">Keine Preisdaten<\/div>`;\n      }\n\n      const noteLine = match.note\n        ? `<div style=\"opacity:.85; font-style:italic; margin-top:6px; font-size:.82rem; color:#f3e48a;\">\u24d8 ${escapeHtml(match.note)}<\/div>`\n        : '';\n\n      return `<div style=\"font-weight:800; margin-bottom:4px;\">${escapeHtml(name)}<\/div>\n              <div style=\"opacity:.92\">${modeLabel}: <strong>${modeVal}<\/strong><\/div>\n              <div style=\"opacity:.78\">Wohnungen: ${formatEUR(match.wohnungen)} \u2022 H\u00e4user: ${formatEUR(match.haeuser)}<\/div>\n              <div style=\"opacity:.72\">Miete: Whg ${formatRent(match.mieteWohn)}\/m\u00b2 \u2022 Haus ${formatRent(match.mieteHaus)}\/m\u00b2<\/div>\n              ${noteLine}`;\n    }\n\n    function refreshTooltips(){\n      districtLayers.forEach((layer, key) => {\n        const match = byDistrict.get(key);\n        const name = layer.__displayName || 'Stadtteil';\n        if (layer.getTooltip()) layer.setTooltipContent(makeTooltipHTML(name, match));\n      });\n    }\n\n    function updateLegend(){\n      const modeText = priceMode === 'wohnungen' ? 'Wohnungen' : 'H\u00e4user';\n      if (heatmapOn){\n        legendEl.innerHTML = `\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:${heatColor(0.10)};\"><\/div><div class=\"legend-text\">g\u00fcnstiger<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:${heatColor(0.45)};\"><\/div><div class=\"legend-text\">mittig<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:${heatColor(0.85)};\"><\/div><div class=\"legend-text\">teurer<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-text\" style=\"font-weight:760;\">Modus: ${modeText}<\/div><\/div>`;\n      } else {\n        legendEl.innerHTML = `\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:#3b340b;\"><\/div><div class=\"legend-text\">Sehr hochpreisig<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:#6b5c13;\"><\/div><div class=\"legend-text\">Hochpreisig<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:#8f7a16;\"><\/div><div class=\"legend-text\">Mittleres Segment<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:#bb9e1c;\"><\/div><div class=\"legend-text\">G\u00fcnstiger<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-color\" style=\"background:#e3cf62;\"><\/div><div class=\"legend-text\">Sehr g\u00fcnstig<\/div><\/div>\n          <div class=\"legend-item\"><div class=\"legend-text\" style=\"font-weight:760;\">Modus: ${modeText}<\/div><\/div>`;\n      }\n    }\n\n    function recolorMap(){\n      if (!geoLayer) return;\n      geoLayer.setStyle(dynamicStyle);\n      refreshTooltips();\n      updateLegend();\n    }\n\n    function highlightLayer(layer){\n      layer.setStyle({ weight:2, color:'rgba(30,35,40,0.85)', fillOpacity: Math.min((layer.options.fillOpacity || 0.7) + 0.12, 0.88) });\n      if (!L.Browser.ie && !L.Browser.opera && !L.Browser.edge) layer.bringToFront();\n    }\n    function resetHighlight(layer){ if (geoLayer) geoLayer.resetStyle(layer); }\n\n    function focusDistrictByName(name){\n      const key = normalizeName(name);\n      const layer = districtLayers.get(key);\n      const match = byDistrict.get(key);\n\n      if (layer){\n        try { map.fitBounds(layer.getBounds(), { padding: [22,22] }); } catch(_){}\n        const original = dynamicStyle(layer.feature);\n        layer.setStyle({ ...original, weight:3, color:'rgba(187,158,28,0.95)', fillOpacity: 0.88 });\n        setTimeout(() => layer.setStyle(original), 520);\n        document.getElementById('map').scrollIntoView({ behavior: prefersReducedMotion ? 'auto' : 'smooth', block: 'center' });\n      }\n      openDistrictModal(name, match || null);\n    }\n\n    function onEachFeature(feature, layer){\n      const name = getDistrictNameFromProps(feature.properties) || 'Stadtteil';\n      const key = normalizeName(name);\n      const match = byDistrict.get(key);\n      layer.__displayName = name;\n      districtLayers.set(key, layer);\n      layer.bindTooltip(makeTooltipHTML(name, match), { className: 'custom-tip', sticky: true, direction: 'top' });\n      layer.on({\n        mouseover: (e) => highlightLayer(e.target),\n        mouseout:  (e) => resetHighlight(e.target),\n        click: () => focusDistrictByName(name)\n      });\n    }\n\n    async function loadHamburgDistricts(){\n      mapStatus.textContent = 'Stadtteile laden\u2026';\n      mapErrorEl.classList.remove('show');\n      const controller = new AbortController();\n      const timer = setTimeout(() => controller.abort(), API_TIMEOUT_MS);\n\n      try {\n        const res = await fetch(API_ENDPOINT, { signal: controller.signal });\n        clearTimeout(timer);\n        if (!res.ok) throw new Error('API Error: ' + res.status);\n        const geojson = await res.json();\n\n        if (geoLayer){ geoLayer.remove(); districtLayers.clear(); }\n        geoLayer = L.geoJSON(geojson, { style: dynamicStyle, onEachFeature }).addTo(map);\n\n        mapStatus.textContent = 'Karte bereit \u2713';\n        mapPanel.classList.add('map-ready');\n        updateLegend();\n      } catch (err){\n        clearTimeout(timer);\n        console.warn('Konnte Stadtteil-Geometrien nicht laden:', err);\n        mapStatus.textContent = 'API nicht erreichbar';\n        mapErrorEl.classList.add('show');\n        updateLegend();\n      }\n    }\n\n    mapRetryBtn.addEventListener('click', loadHamburgDistricts);\n    initMap();\n\n    \/\/ =========================\n    \/\/ Controls\n    \/\/ =========================\n    const btnWohn = document.getElementById('modeWohn');\n    const btnHaus = document.getElementById('modeHaus');\n    const heatSwitch = document.getElementById('heatmapSwitch');\n\n    function setMode(next){\n      priceMode = next;\n      btnWohn.classList.toggle('active', next === 'wohnungen');\n      btnHaus.classList.toggle('active', next === 'haeuser');\n      btnWohn.setAttribute('aria-selected', String(next === 'wohnungen'));\n      btnHaus.setAttribute('aria-selected', String(next === 'haeuser'));\n      recolorMap();\n    }\n    btnWohn.addEventListener('click', () => setMode('wohnungen'));\n    btnHaus.addEventListener('click', () => setMode('haeuser'));\n\n    function toggleHeatmap(){\n      heatmapOn = !heatmapOn;\n      heatSwitch.classList.toggle('on', heatmapOn);\n      heatSwitch.setAttribute('aria-checked', String(heatmapOn));\n      recolorMap();\n    }\n    heatSwitch.addEventListener('click', toggleHeatmap);\n    heatSwitch.addEventListener('keydown', (e) => {\n      if (e.key === 'Enter' || e.key === ' '){ e.preventDefault(); toggleHeatmap(); }\n    });\n\n    \/\/ =========================\n    \/\/ Search \/ Autocomplete\n    \/\/ =========================\n    const input = document.getElementById('districtSearch');\n    const suggestions = document.getElementById('suggestions');\n    const searchable = data.map(d => d.district).sort((a,b) => a.localeCompare(b,'de'));\n    let highlightIdx = -1;\n\n    function closeSuggestions(){\n      suggestions.classList.remove('open');\n      suggestions.innerHTML = '';\n      input.setAttribute('aria-expanded', 'false');\n      highlightIdx = -1;\n    }\n\n    function openSuggestions(items){\n      suggestions.innerHTML = '';\n      const frag = document.createDocumentFragment();\n      items.slice(0, 8).forEach((name, i) => {\n        const match = byDistrict.get(normalizeName(name));\n        const value = getValueForMode(match);\n        const lvl = value != null ? getLevel(value, priceMode) : 1;\n        const btn = document.createElement('button');\n        btn.type = 'button';\n        btn.setAttribute('role', 'option');\n        btn.dataset.idx = String(i);\n        const noteMark = match?.note ? ' <span style=\"color:var(--ci-gold-dark);\">\u24d8<\/span>' : '';\n        btn.innerHTML = `<strong>${name}${noteMark}<\/strong><span class=\"muted\"> \u2022 ${priceMode === 'wohnungen' ? 'W' : 'H'}: ${value != null ? numberFormat.format(value) + ' \u20ac\/m\u00b2' : '\u2014'} \u2022 Level ${lvl}<\/span>`;\n        btn.addEventListener('click', () => { input.value = name; closeSuggestions(); focusDistrictByName(name); });\n        frag.appendChild(btn);\n      });\n      suggestions.appendChild(frag);\n      suggestions.classList.add('open');\n      input.setAttribute('aria-expanded', 'true');\n    }\n\n    function filterList(q){\n      const needle = normalizeName(q);\n      if (!needle) return [];\n      return searchable.filter(n => normalizeName(n).includes(needle));\n    }\n\n    const onSearchInput = debounce(() => {\n      const items = filterList(input.value);\n      if (items.length) openSuggestions(items); else closeSuggestions();\n    }, 100);\n\n    input.addEventListener('input', onSearchInput);\n\n    input.addEventListener('keydown', (e) => {\n      const buttons = suggestions.querySelectorAll('button');\n      if (e.key === 'ArrowDown' && buttons.length){\n        e.preventDefault();\n        highlightIdx = (highlightIdx + 1) % buttons.length;\n        buttons.forEach(b => b.classList.remove('highlighted'));\n        buttons[highlightIdx].classList.add('highlighted');\n        buttons[highlightIdx].scrollIntoView({ block: 'nearest' });\n      } else if (e.key === 'ArrowUp' && buttons.length){\n        e.preventDefault();\n        highlightIdx = (highlightIdx - 1 + buttons.length) % buttons.length;\n        buttons.forEach(b => b.classList.remove('highlighted'));\n        buttons[highlightIdx].classList.add('highlighted');\n        buttons[highlightIdx].scrollIntoView({ block: 'nearest' });\n      } else if (e.key === 'Enter'){\n        e.preventDefault();\n        if (highlightIdx >= 0 && buttons[highlightIdx]){ buttons[highlightIdx].click(); return; }\n        const q = input.value.trim();\n        if (!q) return;\n        const exact = searchable.find(n => normalizeName(n) === normalizeName(q));\n        if (exact){ closeSuggestions(); focusDistrictByName(exact); return; }\n        const items = filterList(q);\n        if (items.length){ closeSuggestions(); focusDistrictByName(items[0]); }\n      } else if (e.key === 'Escape'){\n        closeSuggestions();\n      }\n    });\n\n    document.addEventListener('click', (e) => {\n      const wrap = document.querySelector('.search-wrap');\n      if (wrap && !wrap.contains(e.target)) closeSuggestions();\n    });\n  })();\n  <\/script>\n<\/body>\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Hamburg Lagenkarte 2026 \u2013 Immobilienpreise nach Stadtteil | Lima Invest Zum Inhalt springen Immobilienmarkt-Report \u00b7 Q4 2025 \/ Q1 2026 Kostenlose Bewertung Immobilie verkaufen Hamburg Lagenkarte Detaillierte Immobilienpreise nach Stadtteilen Quelle: Hausgold, Homeday, Aroundhome (Stand: Q4 2025 \/ Q1 2026). Die Preise sind Durchschnittswerte und k\u00f6nnen je nach Lage, Ausstattung, Baujahr und Zustand der Immobilie&#8230;<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kad_post_transparent":"","_kad_post_title":"hide","_kad_post_layout":"fullwidth","_kad_post_sidebar_id":"","_kad_post_content_style":"unboxed","_kad_post_vertical_padding":"hide","_kad_post_feature":"hide","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-22250","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Preisatlas Hamburg - Lima Invest Immobilien<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/limainvestimmobilien.de\/en\/preisatlas-hamburg\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Preisatlas Hamburg - Lima Invest Immobilien\" \/>\n<meta property=\"og:description\" content=\"Hamburg Lagenkarte 2026 \u2013 Immobilienpreise nach Stadtteil | Lima Invest Zum Inhalt springen Immobilienmarkt-Report \u00b7 Q4 2025 \/ Q1 2026 Kostenlose Bewertung Immobilie verkaufen Hamburg Lagenkarte Detaillierte Immobilienpreise nach Stadtteilen Quelle: Hausgold, Homeday, Aroundhome (Stand: Q4 2025 \/ Q1 2026). Die Preise sind Durchschnittswerte und k\u00f6nnen je nach Lage, Ausstattung, Baujahr und Zustand der Immobilie...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/limainvestimmobilien.de\/en\/preisatlas-hamburg\/\" \/>\n<meta property=\"og:site_name\" content=\"Lima Invest Immobilien\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-16T09:08:09+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/preisatlas-hamburg\\\/\",\"url\":\"https:\\\/\\\/limainvestimmobilien.de\\\/preisatlas-hamburg\\\/\",\"name\":\"Preisatlas Hamburg - Lima Invest Immobilien\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/#website\"},\"datePublished\":\"2026-02-08T11:18:34+00:00\",\"dateModified\":\"2026-04-16T09:08:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/preisatlas-hamburg\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/limainvestimmobilien.de\\\/preisatlas-hamburg\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/preisatlas-hamburg\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Start\",\"item\":\"https:\\\/\\\/limainvestimmobilien.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Preisatlas Hamburg\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/#website\",\"url\":\"https:\\\/\\\/limainvestimmobilien.de\\\/\",\"name\":\"Lima Invest Immobilien\",\"description\":\"Investmentimmobilien Deutschland | Lima Invest Immobilien\",\"publisher\":{\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/limainvestimmobilien.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/#organization\",\"name\":\"Lima Invest Immobilien\",\"url\":\"https:\\\/\\\/limainvestimmobilien.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/limainvestimmobilien.de\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/Bildschirmfoto-2023-11-28-um-08.13.10-Kopie.png\",\"contentUrl\":\"https:\\\/\\\/limainvestimmobilien.de\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/Bildschirmfoto-2023-11-28-um-08.13.10-Kopie.png\",\"width\":602,\"height\":476,\"caption\":\"Lima Invest Immobilien\"},\"image\":{\"@id\":\"https:\\\/\\\/limainvestimmobilien.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Preisatlas Hamburg - Lima Invest Immobilien","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/limainvestimmobilien.de\/en\/preisatlas-hamburg\/","og_locale":"en_US","og_type":"article","og_title":"Preisatlas Hamburg - Lima Invest Immobilien","og_description":"Hamburg Lagenkarte 2026 \u2013 Immobilienpreise nach Stadtteil | Lima Invest Zum Inhalt springen Immobilienmarkt-Report \u00b7 Q4 2025 \/ Q1 2026 Kostenlose Bewertung Immobilie verkaufen Hamburg Lagenkarte Detaillierte Immobilienpreise nach Stadtteilen Quelle: Hausgold, Homeday, Aroundhome (Stand: Q4 2025 \/ Q1 2026). Die Preise sind Durchschnittswerte und k\u00f6nnen je nach Lage, Ausstattung, Baujahr und Zustand der Immobilie...","og_url":"https:\/\/limainvestimmobilien.de\/en\/preisatlas-hamburg\/","og_site_name":"Lima Invest Immobilien","article_modified_time":"2026-04-16T09:08:09+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/limainvestimmobilien.de\/preisatlas-hamburg\/","url":"https:\/\/limainvestimmobilien.de\/preisatlas-hamburg\/","name":"Preisatlas Hamburg - Lima Invest Immobilien","isPartOf":{"@id":"https:\/\/limainvestimmobilien.de\/#website"},"datePublished":"2026-02-08T11:18:34+00:00","dateModified":"2026-04-16T09:08:09+00:00","breadcrumb":{"@id":"https:\/\/limainvestimmobilien.de\/preisatlas-hamburg\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/limainvestimmobilien.de\/preisatlas-hamburg\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/limainvestimmobilien.de\/preisatlas-hamburg\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Start","item":"https:\/\/limainvestimmobilien.de\/"},{"@type":"ListItem","position":2,"name":"Preisatlas Hamburg"}]},{"@type":"WebSite","@id":"https:\/\/limainvestimmobilien.de\/#website","url":"https:\/\/limainvestimmobilien.de\/","name":"Lima Invest Immobilien","description":"Investmentimmobilien Deutschland | Lima Invest Immobilien","publisher":{"@id":"https:\/\/limainvestimmobilien.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/limainvestimmobilien.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/limainvestimmobilien.de\/#organization","name":"Lima Invest Immobilien","url":"https:\/\/limainvestimmobilien.de\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/limainvestimmobilien.de\/#\/schema\/logo\/image\/","url":"https:\/\/limainvestimmobilien.de\/wp-content\/uploads\/2022\/07\/Bildschirmfoto-2023-11-28-um-08.13.10-Kopie.png","contentUrl":"https:\/\/limainvestimmobilien.de\/wp-content\/uploads\/2022\/07\/Bildschirmfoto-2023-11-28-um-08.13.10-Kopie.png","width":602,"height":476,"caption":"Lima Invest Immobilien"},"image":{"@id":"https:\/\/limainvestimmobilien.de\/#\/schema\/logo\/image\/"}}]}},"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/pages\/22250","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/comments?post=22250"}],"version-history":[{"count":10,"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/pages\/22250\/revisions"}],"predecessor-version":[{"id":23014,"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/pages\/22250\/revisions\/23014"}],"wp:attachment":[{"href":"https:\/\/limainvestimmobilien.de\/en\/wp-json\/wp\/v2\/media?parent=22250"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}