Altes Köln

Widget:Leaflet: Unterschied zwischen den Versionen

Aus Altes Köln
Wechseln zu:Navigation, Suche
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(20 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<!-- DIV für die Karte -->
<div id="map" style="width: 100%; height: 600px;"></div>
<div id="map" style="width:100%; height:600px;"></div>


<!-- SMW-Ausgabe (als JSON, unsichtbar) -->
<!-- SMW Datenabfrage -->
<script id="smw-data" type="application/json">
<script id="smw-data" type="application/json">
{{#ask:
{{#ask:
  [[Kategorie:Schule]]
  [[Kategorie:Schule]]
  |?Koordinaten
  |?Position=coords
  |?Schultyp
  |?Schultyp=type
  |?Has page=link
  |?Name=name
  |format=json
  |format=json
|plain=yes
}}
}}
</script>
</script>


<!-- Leaflet CSS -->
<!-- Leaflet Ressourcen -->
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css"/>
<script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js"></script>


<!-- MarkerCluster CSS -->
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css"/>
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css"/>
<!-- Leaflet + MarkerCluster JS -->
<script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>


<script>
<script>
(function(){
(function() {
  // Prüfen, ob Map-DIV vorhanden
    // Daten aus SMW holen
  if (!document.getElementById('map')) return;
    var raw = document.getElementById('smw-data').textContent.trim();
    if (!raw) return;
 
    var json = JSON.parse(raw);
    var data = [];


  // SMW-JSON einlesen und parsen
     // JSON in vernünftige Objekte überführen
  var smwRaw = document.getElementById('smw-data').textContent.trim();
     if (json.results) {
  var schoolData = [];
        for (var key in json.results) {
  try {
            if (!json.results.hasOwnProperty(key)) continue;
     // SMW gibt ein JSON-Objekt mit "results" — wir wandeln in ein Array um
            var rec = json.results[key];
    var smw = JSON.parse(smwRaw || '{}');
            var po  = rec.printouts || {};
    // depending on SMW version, 'results' may hold items as properties
 
     if (smw.results) {
            var coords = po.coords && po.coords[0] ? po.coords[0] : null;
      for (var k in smw.results) {
            var typ    = po.type && po.type[0] ? po.type[0] : 'Unbekannt';
        if (!smw.results.hasOwnProperty(k)) continue;
            var name  = po.name && po.name[0] ? po.name[0] : rec.fulltext;
        var item = smw.results[k];
 
        // Extrahiere gewünschte Felder (falls MediaWiki/SMW unterschiedliche Struktur hat, anpassen)
            data.push({
        schoolData.push({
                name: name,
          link: item.fulltext || item.name || k,
                type: typ,
          Schultyp: (item.printouts && item.printouts.Schultyp) ? item.printouts.Schultyp[0] : (item.Schultyp || ''),
                coords: coords
          Koordinaten: (item.printouts && item.printouts.Koordinaten) ? item.printouts.Koordinaten[0] : (item.Koordinaten || '')
            });
        });
        }
      }
    } else if (Array.isArray(smw)) {
      // Falls SMW direkt ein Array liefert
      schoolData = smw;
     }
     }
  } catch (e) {
    console.error('SMW JSON parse error', e);
  }


  // Leaflet map
    // Leaflet Karte erzeugen
  var map = L.map('map').setView([50.94, 6.96], 11);
    var map = L.map('map').setView([50.94, 6.96], 11);
  L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    maxZoom: 18,
    attribution: '© OpenStreetMap contributors'
  }).addTo(map);


  // Cluster-Gruppen
    L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  var layerGrund  = L.markerClusterGroup();
        maxZoom: 18,
  var layerGym    = L.markerClusterGroup();
        attribution: '© OpenStreetMap contributors'
  var layerGes     = L.markerClusterGroup();
     }).addTo(map);
  var layerBeruf  = L.markerClusterGroup();
  var layerFoerder = L.markerClusterGroup();


  var bounds = [];
    // Cluster nach Schultyp
    var clusters = {
        Grundschule: L.markerClusterGroup(),
        Gymnasium: L.markerClusterGroup(),
        Gesamtschule: L.markerClusterGroup(),
        Berufskolleg: L.markerClusterGroup(),
        Förderschule: L.markerClusterGroup(),
        Unbekannt: L.markerClusterGroup()
    };


  // Helfer: Koordinaten extrahieren (String "lat,lon" oder Objekt)
    var bounds = [];
  function extractCoords(coordValue){
 
    if (!coordValue) return null;
    // Marker erzeugen
    if (typeof coordValue === 'string' && coordValue.indexOf(',') !== -1){
    data.forEach(function(s) {
      var p = coordValue.split(',');
        if (!s.coords) return;
      var lat = parseFloat(p[0]), lon = parseFloat(p[1]);
        var parts = s.coords.split(',');
      if (!isNaN(lat) && !isNaN(lon)) return [lat, lon];
        if (parts.length !== 2) return;
    }
    if (typeof coordValue === 'object' && coordValue.lat && coordValue.lon){
      var la = parseFloat(coordValue.lat), lo = parseFloat(coordValue.lon);
      if (!isNaN(la) && !isNaN(lo)) return [la, lo];
    }
    return null;
  }


  // Marker erzeugen
        var lat = parseFloat(parts[0]);
  schoolData.forEach(function(school){
        var lon = parseFloat(parts[1]);
    if (!school) return;
        if (isNaN(lat) || isNaN(lon)) return;
    var coords = extractCoords(school.Koordinaten);
    if (!coords) return;


    var marker = L.marker(coords)
        var marker = L.marker([lat, lon])
      .bindPopup('<strong>' + (school.link || '—') + '</strong><br>' + (school.Schultyp || ''));
            .bindPopup('<strong>' + s.name + '</strong><br>' + s.type);


    switch ((school.Schultyp || '').toString()){
        var layer = clusters[s.type] || clusters.Unbekannt;
      case "Grundschule":  layerGrund.addLayer(marker); break;
        layer.addLayer(marker);
      case "Gymnasium":    layerGym.addLayer(marker); break;
      case "Gesamtschule": layerGes.addLayer(marker); break;
      case "Berufskolleg": layerBeruf.addLayer(marker); break;
      case "Förderschule": layerFoerder.addLayer(marker); break;
      default: layerGrund.addLayer(marker);
    }
    bounds.push(coords);
  });


  // Default-Layer anzeigen
        bounds.push([lat, lon]);
  layerGrund.addTo(map);
    });
  layerGym.addTo(map);


  // Layer-Control (Legende)
    // Markergruppen aktivieren
  var overlays = {
     Object.values(clusters).forEach(function(group) {
    "Grundschulen": layerGrund,
        map.addLayer(group);
    "Gymnasien": layerGym,
    });
    "Gesamtschulen": layerGes,
    "Berufskollegs": layerBeruf,
     "Förderschulen": layerFoerder
  };
  L.control.layers(null, overlays, {collapsed:false}).addTo(map);


  // Auto-fit bounds
    // Layersteuerung
   if (bounds.length) map.fitBounds(bounds);
    L.control.layers(null, {
        "Grundschulen":   clusters.Grundschule,
        "Gymnasien":      clusters.Gymnasium,
        "Gesamtschulen":  clusters.Gesamtschule,
        "Berufskollegs":  clusters.Berufskolleg,
        "Förderschulen":  clusters.Förderschule,
        "Sonstige":      clusters.Unbekannt
    }, {collapsed:false}).addTo(map);


    // Karte auf Marker zoomen
    if (bounds.length) {
        map.fitBounds(bounds);
    }
})();
})();
</script>
</script>

Aktuelle Version vom 10. Dezember 2025, 00:07 Uhr

<script id="smw-data" type="application/json"> JSON </script>

<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css"/> <script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js"></script>

<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css"/> <link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css"/> <script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>

<script> (function() {

   // Daten aus SMW holen
   var raw = document.getElementById('smw-data').textContent.trim();
   if (!raw) return;
   var json = JSON.parse(raw);
   var data = [];
   // JSON in vernünftige Objekte überführen
   if (json.results) {
       for (var key in json.results) {
           if (!json.results.hasOwnProperty(key)) continue;
           var rec = json.results[key];
           var po  = rec.printouts || {};
           var coords = po.coords && po.coords[0] ? po.coords[0] : null;
           var typ    = po.type && po.type[0] ? po.type[0] : 'Unbekannt';
           var name   = po.name && po.name[0] ? po.name[0] : rec.fulltext;
           data.push({
               name: name,
               type: typ,
               coords: coords
           });
       }
   }
   // Leaflet Karte erzeugen
   var map = L.map('map').setView([50.94, 6.96], 11);
   L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
       maxZoom: 18,
       attribution: '© OpenStreetMap contributors'
   }).addTo(map);
   // Cluster nach Schultyp
   var clusters = {
       Grundschule: L.markerClusterGroup(),
       Gymnasium: L.markerClusterGroup(),
       Gesamtschule: L.markerClusterGroup(),
       Berufskolleg: L.markerClusterGroup(),
       Förderschule: L.markerClusterGroup(),
       Unbekannt: L.markerClusterGroup()
   };
   var bounds = [];
   // Marker erzeugen
   data.forEach(function(s) {
       if (!s.coords) return;
       var parts = s.coords.split(',');
       if (parts.length !== 2) return;
       var lat = parseFloat(parts[0]);
       var lon = parseFloat(parts[1]);
       if (isNaN(lat) || isNaN(lon)) return;
       var marker = L.marker([lat, lon])
           .bindPopup('' + s.name + '
' + s.type);
       var layer = clusters[s.type] || clusters.Unbekannt;
       layer.addLayer(marker);
       bounds.push([lat, lon]);
   });
   // Markergruppen aktivieren
   Object.values(clusters).forEach(function(group) {
       map.addLayer(group);
   });
   // Layersteuerung
   L.control.layers(null, {
       "Grundschulen":   clusters.Grundschule,
       "Gymnasien":      clusters.Gymnasium,
       "Gesamtschulen":  clusters.Gesamtschule,
       "Berufskollegs":  clusters.Berufskolleg,
       "Förderschulen":  clusters.Förderschule,
       "Sonstige":       clusters.Unbekannt
   }, {collapsed:false}).addTo(map);
   // Karte auf Marker zoomen
   if (bounds.length) {
       map.fitBounds(bounds);
   }

})(); </script>

Cookies helfen uns bei der Bereitstellung von Altes Köln. Durch die Nutzung von Altes Köln erklärst du dich damit einverstanden, dass wir Cookies speichern.