// ---- 0) Basis: Emojis nach "Typ" ---- function emojiForType(typeLabel = "") { const t = typeLabel.toLowerCase(); if (t.includes("museum")) return "🏛️"; if (t.includes("palace") ||
t.includes("konak") || t.includes("mansion")) return "🏰"; if (t.includes("castle") || t.includes("fortress") || t.includes("citadel")) return "🏰"; if (t.includes("archaeological") ||
t.includes("ancient") || t.includes("ruins") || t.includes("site")) return "🏺"; if (t.includes("mosque") || t.includes("church") || t.includes("monastery") || t.includes("temple")) return "🕌"; if
(t.includes("bridge")) return "🌉"; if (t.includes("cave")) return "🕳️"; if (t.includes("waterfall")) return "🌊"; if (t.includes("lake")) return "🌊"; if (t.includes("mountain") ||
t.includes("volcano")) return "🏔️"; if (t.includes("park") || t.includes("national")) return "🌲"; return "📍"; } function parseWktPoint(wkt) { // WKT: Point(LON LAT) const m =
String(wkt).match(/Point\(([-0-9.]+)\s+([-0-9.]+)\)/i); if (!m) return null; const lon = Number(m[1]); const lat = Number(m[2]); if (!Number.isFinite(lat) || !Number.isFinite(lon)) return null;
return [lat, lon]; } function dedupeProvinceArray(arr) { const seen = new Set(); return arr.filter((x) => { const key = `${x.name}@@${x.co?.[0]}@@${x.co?.[1]}`; if (seen.has(key)) return false;
seen.add(key); return true; }); } // ---- 1) Wikidata Fetch Helper (WDQS) ---- // WDQS Endpoint: https://query.wikidata.org/sparql :contentReference[oaicite:1]{index=1} async function wdqs(sparql) {
const url = "https://query.wikidata.org/sparql?format=json&query=" + encodeURIComponent(sparql); const res = await fetch(url, { headers: { Accept: "application/sparql-results+json" } }); if
(!res.ok) throw new Error(`WDQS failed: ${res.status}`); return res.json(); } // ---- 2) UNESCO Set (Wikidata heritage designation P1435 = World Heritage Site Q9259) ---- // Q9259 beschreibt "World
Heritage Site" :contentReference[oaicite:2]{index=2} async function loadUNESCOWHSNameSetTurkey() { const sparql = ` SELECT DISTINCT ?itemLabel WHERE { ?item wdt:P1435 wd:Q9259 . ?item wdt:P17 wd:Q43
. SERVICE wikibase:label { bd:serviceParam wikibase:language "tr,en,de". } }`.trim(); const json = await wdqs(sparql); const set = new Set(); for (const b of json.results.bindings) { const name =
b.itemLabel?.value; if (name) set.add(name); } return set; } // ---- 3) Haupt-Query: Museen + Paläste + Burgen + Archäologische Stätten + Natur ---- // Provinzzuordnung über "located in the
administrative territorial entity" (P131). :contentReference[oaicite:3]{index=3} // Provinz-Typ: "province of Turkey" (Q48336). :contentReference[oaicite:4]{index=4} async function
loadPOIsTurkeyByProvince({ limit = 20000 } = {}) { // Wir ziehen mehrere Klassen über UNION. // Du kannst jederzeit weitere Q-IDs ergänzen. const sparql = ` SELECT ?provinceLabel ?itemLabel
?typeLabel ?coord WHERE { VALUES ?rootType { wd:Q33506 # museum wd:Q16560 # palace wd:Q23413 # castle wd:Q839954 # archaeological site wd:Q22698 # national park wd:Q23397 # lake wd:Q34038 # waterfall
wd:Q8502 # mountain wd:Q35509 # cave wd:Q12511 # temple wd:Q16970 # church wd:Q32815 # mosque wd:Q44613 # monastery } ?item wdt:P17 wd:Q43 . ?item wdt:P31/wdt:P279* ?rootType . ?item wdt:P625 ?coord
. # Provinz: wir nehmen eine admin-Einheit aus P131, die selbst "province of Turkey" ist ?item wdt:P131 ?province . ?province wdt:P31 wd:Q48336 . # für Emoji/Label: OPTIONAL { ?item wdt:P31 ?type . }
SERVICE wikibase:label { bd:serviceParam wikibase:language "tr,en,de". } } LIMIT ${Number(limit)}`.trim(); return wdqs(sparql); } // ---- 4) Enricher: ergänzt dein SPECIFIC_HIGHLIGHTS für alle
Provinzen ---- async function enrichTurkeyAllProvinces(options = {}) { const { limit = 20000, maxPerProvince = 120, // Safety: damit deine Map nicht stirbt (stell hoch, wenn du willst) tagUNESCO =
true } = options; const unescoSet = tagUNESCO ? await loadUNESCOWHSNameSetTurkey() : new Set(); const json = await loadPOIsTurkeyByProvince({ limit }); const rows = json.results.bindings; // Sammeln
pro Provinz const bucket = {}; for (const r of rows) { const province = r.provinceLabel?.value; const itemName = r.itemLabel?.value; const typeLabel = r.typeLabel?.value || ""; // manchmal leer je
nach Label-Resolution const co = parseWktPoint(r.coord?.value); if (!province || !itemName || !co) continue; const emoji = emojiForType(typeLabel || itemName); const isUNESCO =
unescoSet.has(itemName); const name = `${emoji} ${itemName}${isUNESCO ? " (UNESCO)" : ""}`; if (!bucket[province]) bucket[province] = []; bucket[province].push({ name, co }); } // Merge in deine
Struktur (ERGÄNZEN, nicht ersetzen) for (const [prov, items] of Object.entries(bucket)) { if (!SPECIFIC_HIGHLIGHTS[prov]) SPECIFIC_HIGHLIGHTS[prov] = []; // Limit pro Provinz (optional) const
existing = SPECIFIC_HIGHLIGHTS[prov]; const remaining = Math.max(0, maxPerProvince - existing.length); if (remaining <= 0) continue; existing.push(...items.slice(0, remaining));
SPECIFIC_HIGHLIGHTS[prov] = dedupeProvinceArray(existing); } return SPECIFIC_HIGHLIGHTS; } // Beispiel: // await enrichTurkeyAllProvinces({ limit: 30000, maxPerProvince: 200, tagUNESCO: true });