Widget:SchulkarteLeaflet: Unterschied zwischen den Versionen
Aus Altes Köln
(Die Seite wurde neu angelegt: „<div id="schulkarte" style="width:100%; height:500px;"></div> <script> (async function () { // 1) Konfiguration: JSON-Quelle und Icon-Mapping const jsonUrl = mw.util.wikiScript('index') + '?title=Schulen/GeoJSON&action=raw'; const iconForType = { "Gymnasium": "{{filepath:Marker 13 rot.png}}", "Grundschule": "{{filepath:Marker 11 rot.png}}" // weitere Typen hier ergänzen }; const defaultIconUrl = "{{filepath:Marker 11 rot.png}}";…“) |
Keine Bearbeitungszusammenfassung |
||
| (4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
<div id="schulkarte" style="width:100%; height:500px;"></div> | <div id="schulkarte" style="width:100%; height:500px;"></div> | ||
<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> | |||
<script> | <script> | ||
(async function () { | (async function () { | ||
// | // SMW-API (bei Ihnen ohne /wiki/) | ||
const ask = '[[Kategorie:Schule]] [[Position::+]]|?Position|?Schultyp|limit=5000'; | |||
const jsonUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(ask); | |||
// Icons nach Schultyp | |||
const filePath = (name) => '/wiki/Spezial:Dateipfad/' + encodeURIComponent(name); | |||
const iconForType = { | |||
"Gymnasium": filePath('MarkerRot.png'), | |||
"Volksschule": filePath('MarkerBlau.png') | |||
}; | |||
const defaultIconUrl = filePath('MarkerBlau.png'); | |||
// | // JSON laden | ||
const resp = await fetch(jsonUrl, { credentials: 'same-origin' }); | const resp = await fetch(jsonUrl, { credentials: 'same-origin' }); | ||
if (!resp.ok) throw new Error('SMW JSON nicht erreichbar: ' + resp.status); | |||
const data = await resp.json(); | const data = await resp.json(); | ||
// | // Leaflet Karte | ||
const map = L.map('schulkarte'); | const map = L.map('schulkarte'); | ||
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { | L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { | ||
| Zeile 28: | Zeile 34: | ||
const bounds = []; | const bounds = []; | ||
// | // Ergebnisse | ||
const results = data && data.results ? data.results : {}; | const results = (data && data.query && data.query.results) ? data.query.results : {}; | ||
for (const key in results) { | for (const key in results) { | ||
const r = results[key]; | const r = results[key]; | ||
const po = r.printouts || {}; | const po = r.printouts || {}; | ||
const | const pos = (po.Position && po.Position[0]) ? po.Position[0] : null; | ||
// defensiv: ungültige | // defensiv: ungültige Position überspringen | ||
if (! | if (!pos || typeof pos.lat !== 'number' || typeof pos.lon !== 'number') continue; | ||
const typ = (po.Schultyp && po.Schultyp[0]) ? String(po.Schultyp[0]) : ''; | |||
const iconUrl = iconForType[typ] || defaultIconUrl; | |||
const typ = ( | |||
const icon = L.icon({ | const icon = L.icon({ | ||
iconUrl, | iconUrl, | ||
| Zeile 55: | Zeile 57: | ||
const url = r.fullurl || ('/wiki/' + encodeURIComponent(title)); | const url = r.fullurl || ('/wiki/' + encodeURIComponent(title)); | ||
L.marker([lat, lon], { icon }) | L.marker([pos.lat, pos.lon], { icon }) | ||
.addTo(map) | .addTo(map) | ||
.bindPopup(`<a href="${url}">${title}</a><br><b>Schultyp:</b> ${typ || '-'}`); | .bindPopup(`<a href="${url}">${title}</a><br><b>Schultyp:</b> ${typ || '-'}`); | ||
bounds.push([lat, lon]); | bounds.push([pos.lat, pos.lon]); | ||
} | } | ||
// | // Zoom/Extent | ||
if (bounds.length) { | if (bounds.length) { | ||
map.fitBounds(bounds, { padding: [20, 20] }); | map.fitBounds(bounds, { padding: [20, 20] }); | ||
} else { | } else { | ||
map.setView([50.94, 6.96], 12); | map.setView([50.94, 6.96], 12); | ||
} | } | ||
})(); | })(); | ||
</script> | </script> | ||
Aktuelle Version vom 17. Dezember 2025, 18:44 Uhr
<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>
<script> (async function () {
// SMW-API (bei Ihnen ohne /wiki/)
const ask = ' Die folgende Koordinate wurde nicht erkannt: +.|?Position|?Schultyp|limit=5000';
const jsonUrl = '/api.php?action=ask&format=json&query=' + encodeURIComponent(ask);
// Icons nach Schultyp
const filePath = (name) => '/wiki/Spezial:Dateipfad/' + encodeURIComponent(name); const iconForType = {
"Gymnasium": filePath('MarkerRot.png'),
"Volksschule": filePath('MarkerBlau.png')
}; const defaultIconUrl = filePath('MarkerBlau.png');
// JSON laden
const resp = await fetch(jsonUrl, { credentials: 'same-origin' });
if (!resp.ok) throw new Error('SMW JSON nicht erreichbar: ' + resp.status);
const data = await resp.json();
// Leaflet Karte
const map = L.map('schulkarte');
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
maxZoom: 19,
attribution: '© OpenStreetMap'
}).addTo(map);
const bounds = [];
// Ergebnisse
const results = (data && data.query && data.query.results) ? data.query.results : {};
for (const key in results) {
const r = results[key];
const po = r.printouts || {};
const pos = (po.Position && po.Position[0]) ? po.Position[0] : null;
// defensiv: ungültige Position überspringen if (!pos || typeof pos.lat !== 'number' || typeof pos.lon !== 'number') continue;
const typ = (po.Schultyp && po.Schultyp[0]) ? String(po.Schultyp[0]) : ; const iconUrl = iconForType[typ] || defaultIconUrl;
const icon = L.icon({
iconUrl,
iconSize: [24, 24],
iconAnchor: [12, 24]
});
const title = r.fulltext || key;
const url = r.fullurl || ('/wiki/' + encodeURIComponent(title));
L.marker([pos.lat, pos.lon], { icon })
.addTo(map)
.bindPopup(`<a href="${url}">${title}</a>
Schultyp: ${typ || '-'}`);
bounds.push([pos.lat, pos.lon]); }
// Zoom/Extent
if (bounds.length) {
map.fitBounds(bounds, { padding: [20, 20] });
} else {
map.setView([50.94, 6.96], 12);
}
})(); </script>
