Altes Köln

Widget:WWW-Siedlungen: Unterschied zwischen den Versionen

Aus Altes Köln
Wechseln zu:Navigation, Suche
Die Seite wurde neu angelegt: „<noinclude> Leaflet Karte – Köln Siedlungsentwicklung </noinclude> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/> <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script> <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css"/> <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script> <style> #map-siedlung{width:100%;height:…“
 
Keine Bearbeitungszusammenfassung
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<noinclude>
Leaflet Karte – Köln Siedlungsentwicklung
</noinclude>


<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<!DOCTYPE html>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<html>
<head>
  <title>Siedlungsentwicklung</title>
  <meta charset="utf-8"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0"/>


<link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css"/>
  <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
  <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
  <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css"/>
  <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>


<style>
  <style>
#map-siedlung{width:100%;height:80vh;border:3px solid black;border-radius:10px;}


.legend{line-height:20px;background:white;padding:10px;border-radius:6px;box-shadow:0 0 10px rgba(0,0,0,0.3);font-size:14px;}
        body { padding:10px; font-family:sans-serif; }
.legend i{width:18px;height:18px;float:left;margin-right:8px;}
        #map-frame { border-radius:8px; position: relative;}
#map {
width: 100%;
height: 88vh;     /* größere Karte */
border: 3px solid black;
border-radius: 10px;
}


.popup-card{width:270px;font-family:sans-serif;}
#map-title {
.popup-img{width:100%;max-height:220px;object-fit:cover;border-radius:8px 8px 0 0;cursor:pointer;}
position: absolute;
.popup-body{padding:10px;}
top: 10px;
.popup-title{font-size:18px;font-weight:bold;margin-bottom:4px;}
left: 50%;
.popup-sub{font-style:italic;color:#666;margin-bottom:6px;}
transform: translateX(-50%);
.popup-info{font-size:13px;line-height:1.4;margin-bottom:8px;}
z-index: 1000;
.popup-text{font-size:14px;line-height:1.4;}
background: rgba(255,255,255,0.85);
.popup-link{margin-top:8px;font-weight:bold;}
padding: 6px 14px;
</style>
font-weight: bold;
font-size: 18px;
border-radius: 6px;
box-shadow: 0 0 6px rgba(0,0,0,0.3);
}


<p style="text-align:center;font-weight:bold;font-size:20px;">
#map-footer {
Köln – Siedlungsentwicklung
position: absolute;
</p>
bottom: 10px;
left: 10px;
z-index: 1000;
background: rgba(255,255,255,0.85);
padding: 4px 10px;
border-radius: 6px;
font-size: 13px;
box-shadow: 0 0 6px rgba(0,0,0,0.3);
}


<div id="map-siedlung"></div>
#map-footer a {
color: red;
text-decoration: none;
font-weight: bold;
}


<div style="text-align:center; margin-top:8px;">
    /* Slider über der Karte, mittig unten */
<input type="range" id="yearSlider" min="800" max="2026" value="2026" step="1" style="width:80%;">
    .leaflet-control-time {
<div id="yearLabel" style="margin-top:4px; font-weight:bold;">Jahr: 2026</div>
      position: absolute;
</div>
      left: 50%;
      bottom: 20px;
      transform: translateX(-50%);
      background: rgba(255,255,255,0.95);
      padding: 10px 20px;
      border-radius:10px;
      box-shadow:0 4px 12px rgba(0,0,0,0.35);
      z-index: 1000;
      display: flex;
      flex-direction: column;
      align-items: center;
      gap: 6px;
    }


<script>
    #yearSlider { width: 300px; }
    #yearLabel { font-weight:bold; min-width:45px; text-align:center; }


(function(){
    .time-axis { width: 100%; display: flex; justify-content: space-between; font-size: 12px; margin-top: 4px; }


var map = L.map('map-siedlung').setView([50.95,6.95],12);
    .legend{
      line-height:20px;
      background:white;
      padding:10px;
      border-radius:6px;
      box-shadow:0 0 10px rgba(0,0,0,0.3);
      font-size:14px;
    }
    .legend i{width:18px;height:18px;float:left;margin-right:8px;}
    .legend-header{
      cursor:pointer;
      font-weight:bold;
      display:flex;
      justify-content:space-between;
      align-items:center;
      border-bottom:1px solid #ccc;
      margin-bottom:5px;
      padding-bottom:3px;
    }


var osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png',{
    .popup-card{width:270px;font-family:sans-serif;}
maxZoom:19,
    .popup-img{width:100%;max-height:220px;object-fit:cover;border-radius:8px 8px 0 0;cursor:pointer;}
attribution:'© OpenStreetMap'
    .popup-body{padding:10px;}
}).addTo(map);
    .popup-title{font-size:18px;font-weight:bold;margin-bottom:4px;}
    .popup-sub{font-style:italic;color:#666;margin-bottom:6px;}
    .popup-info{font-size:13px;line-height:1.4;margin-bottom:8px;}
    .popup-text{font-size:14px;line-height:1.4;}
    .popup-link{margin-top:8px;font-weight:bold;}
    .leaflet-popup-content-wrapper{border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,0.35);}
  </style>
</head>


var satellite = L.tileLayer(
<body>
'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
{attribution:'Tiles © Esri'}
);


L.control.layers({"OpenStreetMap":osm,"Satellit":satellite}).addTo(map);
<div id="map-frame">


L.Control.geocoder({
<div id="map-title">Siedlungsentwicklung</div>
position:'topleft',
defaultMarkGeocode:true,
placeholder:"Suche ..."
}).addTo(map);


var intervals=[
<div id="map"></div>
{from:50,to:949,color:'#ffffcc'},
{from:950,to:1105,color:'#ffeda0'},
{from:1106,to:1179,color:'#fed976'},
{from:1180,to:1879,color:'#feb24c'},
{from:1880,to:1918,color:'#fd8d3c'},
{from:1919,to:1945,color:'#fc4e2a'},
{from:1946,to:1959,color:'#e31a1c'},
{from:1960,to:1979,color:'#bd0026'},
{from:1980,to:1999,color:'#800026'},
{from:2000,to:2026,color:'#4d0018'}
];


function getColor(jahr){
<div id="map-footer">
for(var i=0;i<intervals.length;i++){
<a href="https://hermsdoerfer.familyds.com/" target="_blank">
if(jahr>=intervals[i].from && jahr<=intervals[i].to){
© Dietmar Hermsdörfer
return intervals[i].color;
</a>
}
</div>
}
return "#999";
}


var geojsonLayer=null;
</div>


fetch("/alteskoeln/Siedlung.geojson")
  <script>
.then(res=>res.json())
    var map = L.map('map').setView([50.95,6.95],12);
.then(data=>{


geojsonLayer=L.geoJSON(data,{
    var intervals=[
      {from:50,to:949,color:'#ffffcc'},
      {from:950,to:1105,color:'#ffeda0'},
      {from:1106,to:1179,color:'#fed976'},
      {from:1180,to:1879,color:'#feb24c'},
      {from:1880,to:1918,color:'#fd8d3c'},
      {from:1919,to:1945,color:'#fc4e2a'},
      {from:1946,to:1959,color:'#e31a1c'},
      {from:1960,to:1979,color:'#bd0026'},
      {from:1980,to:1999,color:'#800026'},
      {from:2000,to:2026,color:'#4d0018'}
    ];


style:function(feature){
    function getColor(jahr){
      for(var i=0;i<intervals.length;i++){
        if(jahr>=intervals[i].from && jahr<=intervals[i].to) return intervals[i].color;
      }
      return "#999";
    }


var jahr=feature.properties.Jahr;
    // --- Kartenlayer ---
    var osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png',{maxZoom:19, attribution:'© OpenStreetMap'}).addTo(map);
    var satellite = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',{attribution:'Tiles © Esri'});
    L.control.layers({"OpenStreetMap":osm,"Satellit":satellite}).addTo(map);
    L.Control.geocoder({position:'topleft', defaultMarkGeocode:true, placeholder:"Suche ..."}).addTo(map);


if(!jahr || jahr===0){
    var highlightedLayer=null;
return {opacity:0,fillOpacity:0,stroke:false};
    var popupFeatures=[];
}
    var popupIndex=0;
    var geojsonLayer=null;


return {
    function isPointInPolygon(latlng,layer){
color:"#555",
      var coords=layer.getLatLngs();
weight:1,
      if(layer.feature.geometry.type==="MultiPolygon"){
fillColor:getColor(jahr),
        return coords.some(part=>isInside(latlng,part[0]));
fillOpacity:0.7
      }
};
      return isInside(latlng,coords[0]);
    }
    function isInside(latlng,poly){
      var x=latlng.lat; var y=latlng.lng; var inside=false;
      for(var i=0,j=poly.length-1;i<poly.length;j=i++){
        var xi=poly[i].lat, yi=poly[i].lng, xj=poly[j].lat, yj=poly[j].lng;
        var intersect=((yi>y)!=(yj>y)) && (x<(xj-xi)*(y-yi)/(yj-yi)+xi);
        if(intersect) inside=!inside;
      }
      return inside;
    }


}
    function showPopup(index,latlng){
      popupIndex=index;
      var props=popupFeatures[index];
      var name=props.Name||"Unbekannt";
      var nutzung=props.Nutzung||"-";
      var jahr=props.Jahr||"?";
      var gebiet=props.Gebiet||"-";
      var zeitraum=props.Zeitraum||"-";
      var info=props.Info||"";
      var bild=props.Bild?'<img class="popup-img" src="'+props.Bild+'" onclick="window.open(\''+props.Bild+'\')">':'';
      var link=props.Link?'<div class="popup-link"><a href="'+props.Link+'" target="_blank">➔ Mehr Infos</a></div>':'';
      var nav="";
      if(popupFeatures.length>1){
        nav='<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;">'+
        '<button onclick="changeFeature(-1)">◀</button>'+
        '<span style="font-size:12px;">'+(index+1)+' / '+popupFeatures.length+'</span>'+
        '<button onclick="changeFeature(1)">▶</button>'+
        '</div>';
      }
      var content='<div class="popup-card">'+bild+
      '<div class="popup-body">'+nav+
      '<div class="popup-title">'+name+'</div>'+
      '<div class="popup-sub">'+nutzung+'</div>'+
      '<div class="popup-info"><b>Jahr:</b> '+jahr+'<br><b>Gebiet:</b> '+gebiet+'<br><b>Zeitraum:</b> '+zeitraum+'</div>'+
      '<div class="popup-text">'+info+'</div>'+link+'</div></div>';
      L.popup({maxWidth:300}).setLatLng(latlng).setContent(content).openOn(map);
    }


}).addTo(map);
    function changeFeature(step){
      popupIndex+=step;
      if(popupIndex<0) popupIndex=popupFeatures.length-1;
      if(popupIndex>=popupFeatures.length) popupIndex=0;
      showPopup(popupIndex,map.getCenter());
    }


});
    // --- GeoJSON laden ---
    fetch("/alteskoeln/Siedlung.geojson").then(res=>res.json()).then(data=>{
      geojsonLayer=L.geoJSON(data,{
        style:function(feature){
          var jahr=feature.properties.Jahr;
          if(!jahr || jahr===0) return {opacity:0, fillOpacity:0, stroke:false, interactive:false};
          return {color:"#555", weight:1, fillColor:getColor(jahr), fillOpacity:0.7};
        },
        onEachFeature:function(feature,layer){
          layer.on({
            mouseover:function(e){
              var l=e.target;
              var currentYear=parseInt(document.getElementById("yearSlider").value);
              if(l!==highlightedLayer && (feature.properties.Jahr||0)<=currentYear){
                l.setStyle({weight:3,color:"#000",fillOpacity:0.9});
              }
            },
            mouseout:function(e){
              var l=e.target;
              var currentYear=parseInt(document.getElementById("yearSlider").value);
              if(l!==highlightedLayer){
                if((feature.properties.Jahr||0)>currentYear){
                  l.setStyle({fillOpacity:0,opacity:0});
                }else{
                  geojsonLayer.resetStyle(l);
                }
              }
            },
            click:function(e){
              var l=e.target;
              var currentYear=parseInt(document.getElementById("yearSlider").value);
              if((feature.properties.Jahr||0)<=currentYear){
                if(highlightedLayer) geojsonLayer.resetStyle(highlightedLayer);
                highlightedLayer=l;


var yearSlider=document.getElementById("yearSlider");
                // --- Highlight setzen ---
var yearLabel=document.getElementById("yearLabel");
                l.setStyle({weight:4, color:"cyan", fillOpacity:1, fillColor: "yellow" });


yearSlider.addEventListener("input",function(){
                // --- Zoom auf angeklicktes Polygon ---
                map.flyToBounds(l.getBounds(), {padding:[40,40], maxZoom:16, duration:0.8});


var year=parseInt(this.value);
                popupFeatures=[feature.properties];
yearLabel.innerText="Jahr: "+year;
                showPopup(0,e.latlng);
              }
            }
          });
        }
      }).addTo(map);
    });


geojsonLayer.eachLayer(function(layer){
    // --- Timeslider ---
    var sliderControl = L.DomUtil.create('div','leaflet-control-time');
    sliderControl.innerHTML = '<input type="range" id="yearSlider" min="50" max="2026" value="2026" step="1">'+
                              '<span id="yearLabel">2026</span>'+
                              '<div class="time-axis">'+
                              intervals.map(i=>'<span>'+i.from+'</span>').join('')+
                              '</div>';
    L.DomEvent.disableClickPropagation(sliderControl);
    document.getElementById('map').appendChild(sliderControl);


var featureJahr=layer.feature.properties.Jahr;
    var yearSlider=document.getElementById("yearSlider");
    var yearLabel=document.getElementById("yearLabel");


if(featureJahr && featureJahr<=year){
yearSlider.addEventListener("input", function(){
layer.setStyle({fillOpacity:0.7,opacity:1,stroke:true});
  var year = parseInt(this.value);
}else{
  yearLabel.innerText = year;
layer.setStyle({fillOpacity:0,opacity:0,stroke:false});
}


});
  // Array für alle sichtbaren Layer dieses Jahres
  var visibleLayers = [];


});
  geojsonLayer.eachLayer(function(layer){
var featureJahr = layer.feature.properties.Jahr;
if(featureJahr && featureJahr > 0){
  if(featureJahr <= year){
layer.setStyle({fillOpacity:0.7, opacity:1, stroke:true});
visibleLayers.push(layer);
  } else {
layer.setStyle({fillOpacity:0, opacity:0, stroke:false});
  }
} else {
  layer.setStyle({fillOpacity:0, opacity:0, stroke:false});
}
  });


var legend=L.control({position:"bottomright"});
  // Zoom auf alle sichtbaren Layer
  if(visibleLayers.length > 0){
var group = L.featureGroup(visibleLayers);
map.fitBounds(group.getBounds(), {padding:[40,40]});
  }
});


legend.onAdd=function(map){
    // --- Legende ---
    var legend=L.control({position:"bottomright"});
    legend.onAdd=function(map){
      var div=L.DomUtil.create("div","legend");
      div.innerHTML=
        '<div class="legend-header" id="legend-header">'+
        '<span>Zeit (Jahr)</span>'+
        '<span id="legend-toggle-icon">−</span>'+
        '</div>'+
        '<div id="legend-body" style="display:block;margin-top:8px;">'+
        intervals.map(i=>'<i style="background:'+i.color+';"></i>'+i.from+' – '+i.to+'<br>').join('')+
        '</div>';
      L.DomEvent.disableClickPropagation(div);
      L.DomEvent.on(div.querySelector('#legend-header'),'click',function(){
        var body=document.getElementById("legend-body");
        var icon=document.getElementById("legend-toggle-icon");
        if(body.style.display==="none"){body.style.display="block"; icon.innerHTML="−";}
        else{body.style.display="none"; icon.innerHTML="+";}
      });
      return div;
    };
    legend.addTo(map);


var div=L.DomUtil.create("div","legend");
  </script>
 
</body>
div.innerHTML='<b>Zeit (Jahr)</b><br>'+
</html>
intervals.map(i =>
'<i style="background:'+i.color+'"></i>'+i.from+" – "+i.to+"<br>"
).join('');
 
return div;
 
};
 
legend.addTo(map);
 
})();
</script>

Aktuelle Version vom 18. März 2026, 10:58 Uhr

<!DOCTYPE html> <html> <head>

 <title>Siedlungsentwicklung</title>
 <meta charset="utf-8"/>
 <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
 <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
 <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
 <link rel="stylesheet" href="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.css"/>
 <script src="https://unpkg.com/leaflet-control-geocoder/dist/Control.Geocoder.js"></script>
 <style>
       body { padding:10px; font-family:sans-serif; }
       #map-frame { border-radius:8px; position: relative;}

#map { width: 100%; height: 88vh; /* größere Karte */ border: 3px solid black; border-radius: 10px; }

#map-title { position: absolute; top: 10px; left: 50%; transform: translateX(-50%); z-index: 1000; background: rgba(255,255,255,0.85); padding: 6px 14px; font-weight: bold; font-size: 18px; border-radius: 6px; box-shadow: 0 0 6px rgba(0,0,0,0.3); }

#map-footer { position: absolute; bottom: 10px; left: 10px; z-index: 1000; background: rgba(255,255,255,0.85); padding: 4px 10px; border-radius: 6px; font-size: 13px; box-shadow: 0 0 6px rgba(0,0,0,0.3); }

#map-footer a { color: red; text-decoration: none; font-weight: bold; }

   /* Slider über der Karte, mittig unten */
   .leaflet-control-time {
     position: absolute;
     left: 50%;
     bottom: 20px;
     transform: translateX(-50%);
     background: rgba(255,255,255,0.95);
     padding: 10px 20px;
     border-radius:10px;
     box-shadow:0 4px 12px rgba(0,0,0,0.35);
     z-index: 1000;
     display: flex;
     flex-direction: column;
     align-items: center;
     gap: 6px;
   }
   #yearSlider { width: 300px; }
   #yearLabel { font-weight:bold; min-width:45px; text-align:center; }
   .time-axis { width: 100%; display: flex; justify-content: space-between; font-size: 12px; margin-top: 4px; }
   .legend{
     line-height:20px;
     background:white;
     padding:10px;
     border-radius:6px;
     box-shadow:0 0 10px rgba(0,0,0,0.3);
     font-size:14px;
   }
   .legend i{width:18px;height:18px;float:left;margin-right:8px;}
   .legend-header{
     cursor:pointer;
     font-weight:bold;
     display:flex;
     justify-content:space-between;
     align-items:center;
     border-bottom:1px solid #ccc;
     margin-bottom:5px;
     padding-bottom:3px;
   }
   .popup-card{width:270px;font-family:sans-serif;}
   .popup-img{width:100%;max-height:220px;object-fit:cover;border-radius:8px 8px 0 0;cursor:pointer;}
   .popup-body{padding:10px;}
   .popup-title{font-size:18px;font-weight:bold;margin-bottom:4px;}
   .popup-sub{font-style:italic;color:#666;margin-bottom:6px;}
   .popup-info{font-size:13px;line-height:1.4;margin-bottom:8px;}
   .popup-text{font-size:14px;line-height:1.4;}
   .popup-link{margin-top:8px;font-weight:bold;}
   .leaflet-popup-content-wrapper{border-radius:10px;box-shadow:0 6px 20px rgba(0,0,0,0.35);}
 </style>

</head>

<body>

Siedlungsentwicklung
 <script>
   var map = L.map('map').setView([50.95,6.95],12);
   var intervals=[
     {from:50,to:949,color:'#ffffcc'},
     {from:950,to:1105,color:'#ffeda0'},
     {from:1106,to:1179,color:'#fed976'},
     {from:1180,to:1879,color:'#feb24c'},
     {from:1880,to:1918,color:'#fd8d3c'},
     {from:1919,to:1945,color:'#fc4e2a'},
     {from:1946,to:1959,color:'#e31a1c'},
     {from:1960,to:1979,color:'#bd0026'},
     {from:1980,to:1999,color:'#800026'},
     {from:2000,to:2026,color:'#4d0018'}
   ];
   function getColor(jahr){
     for(var i=0;i<intervals.length;i++){
       if(jahr>=intervals[i].from && jahr<=intervals[i].to) return intervals[i].color;
     }
     return "#999";
   }
   // --- Kartenlayer ---
   var osm = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png',{maxZoom:19, attribution:'© OpenStreetMap'}).addTo(map);
   var satellite = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',{attribution:'Tiles © Esri'});
   L.control.layers({"OpenStreetMap":osm,"Satellit":satellite}).addTo(map);
   L.Control.geocoder({position:'topleft', defaultMarkGeocode:true, placeholder:"Suche ..."}).addTo(map);
   var highlightedLayer=null;
   var popupFeatures=[];
   var popupIndex=0;
   var geojsonLayer=null;
   function isPointInPolygon(latlng,layer){
     var coords=layer.getLatLngs();
     if(layer.feature.geometry.type==="MultiPolygon"){
       return coords.some(part=>isInside(latlng,part[0]));
     }
     return isInside(latlng,coords[0]);
   }
   function isInside(latlng,poly){
     var x=latlng.lat; var y=latlng.lng; var inside=false;
     for(var i=0,j=poly.length-1;i<poly.length;j=i++){
       var xi=poly[i].lat, yi=poly[i].lng, xj=poly[j].lat, yj=poly[j].lng;
       var intersect=((yi>y)!=(yj>y)) && (x<(xj-xi)*(y-yi)/(yj-yi)+xi);
       if(intersect) inside=!inside;
     }
     return inside;
   }
   function showPopup(index,latlng){
     popupIndex=index;
     var props=popupFeatures[index];
     var name=props.Name||"Unbekannt";
     var nutzung=props.Nutzung||"-";
     var jahr=props.Jahr||"?";
     var gebiet=props.Gebiet||"-";
     var zeitraum=props.Zeitraum||"-";
     var info=props.Info||"";
     var bild=props.Bild?'<img class="popup-img" src="'+props.Bild+'" onclick="window.open(\+props.Bild+'\')">':;

var link=props.Link?'

':;

     var nav="";
     if(popupFeatures.length>1){

nav='

'+
       '<button onclick="changeFeature(-1)">◀</button>'+
       ''+(index+1)+' / '+popupFeatures.length+''+
       '<button onclick="changeFeature(1)">▶</button>'+
'

';

     }

var content='

';

     L.popup({maxWidth:300}).setLatLng(latlng).setContent(content).openOn(map);
   }
   function changeFeature(step){
     popupIndex+=step;
     if(popupIndex<0) popupIndex=popupFeatures.length-1;
     if(popupIndex>=popupFeatures.length) popupIndex=0;
     showPopup(popupIndex,map.getCenter());
   }
   // --- GeoJSON laden ---
   fetch("/alteskoeln/Siedlung.geojson").then(res=>res.json()).then(data=>{
     geojsonLayer=L.geoJSON(data,{
       style:function(feature){
         var jahr=feature.properties.Jahr;
         if(!jahr || jahr===0) return {opacity:0, fillOpacity:0, stroke:false, interactive:false};
         return {color:"#555", weight:1, fillColor:getColor(jahr), fillOpacity:0.7};
       },
       onEachFeature:function(feature,layer){
         layer.on({
           mouseover:function(e){
             var l=e.target;
             var currentYear=parseInt(document.getElementById("yearSlider").value);
             if(l!==highlightedLayer && (feature.properties.Jahr||0)<=currentYear){
               l.setStyle({weight:3,color:"#000",fillOpacity:0.9});
             }
           },
           mouseout:function(e){
             var l=e.target;
             var currentYear=parseInt(document.getElementById("yearSlider").value);
             if(l!==highlightedLayer){
               if((feature.properties.Jahr||0)>currentYear){
                 l.setStyle({fillOpacity:0,opacity:0});
               }else{
                 geojsonLayer.resetStyle(l);
               }
             }
           },
           click:function(e){
             var l=e.target;
             var currentYear=parseInt(document.getElementById("yearSlider").value);
             if((feature.properties.Jahr||0)<=currentYear){
               if(highlightedLayer) geojsonLayer.resetStyle(highlightedLayer);
               highlightedLayer=l;
               // --- Highlight setzen ---
               l.setStyle({weight:4, color:"cyan", fillOpacity:1, fillColor: "yellow" });
               // --- Zoom auf angeklicktes Polygon ---
               map.flyToBounds(l.getBounds(), {padding:[40,40], maxZoom:16, duration:0.8});
               popupFeatures=[feature.properties];
               showPopup(0,e.latlng);
             }
           }
         });
       }
     }).addTo(map);
   });
   // --- Timeslider ---
   var sliderControl = L.DomUtil.create('div','leaflet-control-time');
   sliderControl.innerHTML = '<input type="range" id="yearSlider" min="50" max="2026" value="2026" step="1">'+
                             '2026'+

'

'+
                             intervals.map(i=>''+i.from+'').join()+
'

';

   L.DomEvent.disableClickPropagation(sliderControl);
   document.getElementById('map').appendChild(sliderControl);
   var yearSlider=document.getElementById("yearSlider");
   var yearLabel=document.getElementById("yearLabel");

yearSlider.addEventListener("input", function(){ var year = parseInt(this.value); yearLabel.innerText = year;

// Array für alle sichtbaren Layer dieses Jahres var visibleLayers = [];

geojsonLayer.eachLayer(function(layer){ var featureJahr = layer.feature.properties.Jahr; if(featureJahr && featureJahr > 0){ if(featureJahr <= year){ layer.setStyle({fillOpacity:0.7, opacity:1, stroke:true}); visibleLayers.push(layer); } else { layer.setStyle({fillOpacity:0, opacity:0, stroke:false}); } } else { layer.setStyle({fillOpacity:0, opacity:0, stroke:false}); } });

// Zoom auf alle sichtbaren Layer if(visibleLayers.length > 0){ var group = L.featureGroup(visibleLayers); map.fitBounds(group.getBounds(), {padding:[40,40]}); } });

   // --- Legende ---
   var legend=L.control({position:"bottomright"});
   legend.onAdd=function(map){
     var div=L.DomUtil.create("div","legend");
     div.innerHTML=

'

'+
       'Zeit (Jahr)'+
       ''+
'

'+ '

'+
       intervals.map(i=>''+i.from+' – '+i.to+'
').join()+
'

';

     L.DomEvent.disableClickPropagation(div);
     L.DomEvent.on(div.querySelector('#legend-header'),'click',function(){
       var body=document.getElementById("legend-body");
       var icon=document.getElementById("legend-toggle-icon");
       if(body.style.display==="none"){body.style.display="block"; icon.innerHTML="−";}
       else{body.style.display="none"; icon.innerHTML="+";}
     });
     return div;
   };
   legend.addTo(map);
 </script>

</body> </html>