From a28b091002633b66b4c36458b04b365048b89c35 Mon Sep 17 00:00:00 2001 From: Linus Olofsson Date: Fri, 25 Sep 2026 00:32:57 +0200 Subject: [PATCH] =?UTF-8?q?Klick=20p=C3=A5=20en=20delad=20pin=20flyttar=20?= =?UTF-8?q?platsen=20dit=20(exakt=20lagrad=20position)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 (1M context) --- README.md | 2 +- site/public/index.html | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ebe9f4e..7067ae6 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Källkoden till **https://publiccloud.se**: en helskärmshimmel som följer sole - **Just nu:** väder, temperatur, vind, måne, sol och plats. - **Plats:** en jordglob (MapLibre GL 6.11, globprojektion) med dag- och nattskugga i realtid, kust- och landsgränser (Natural Earth), en röd nål för vald plats, scroll- och knappzoom, "Utgå från min plats" (GPS), klick på globen och standardplatsen Örebro slott. Allt räknas om för vald plats. - **Spara som min plats:** sidan startar där nästa gång (sparas bara i webbläsaren). - - **Dela min pin:** ett öppet, anonymt index på stadsnivå. Servern avrundar positionen till 0,1°, slår själv upp stad och land (ingen fritext) och visar alla delade städer som glödande punkter på globen. Ägaren kan ta bort sin pin. Spärr: en delning per nätverk och 5 min (saltad IP-hash som går ut, IP sparas aldrig). + - **Dela min pin:** ett öppet, anonymt index på stadsnivå. Servern avrundar positionen till 0,1°, slår själv upp stad och land (ingen fritext) och visar alla delade städer som glödande punkter på globen. Klick på en delad pin flyttar dig direkt dit. Ägaren kan ta bort sin pin. Spärr: en delning per nätverk och 5 min (saltad IP-hash som går ut, IP sparas aldrig). - **Kväll & natt:** betyg för stjärnhimlen, chans till norrsken (Kp nu och prognos), meteorregn samt fullmåne och nymåne. - **Fotoljus:** gyllene och blå timmen med väderprognos, månens upp- och nedgång, dimma, regnbåge och nattlysande moln. diff --git a/site/public/index.html b/site/public/index.html index c0a8cd0..b013504 100644 --- a/site/public/index.html +++ b/site/public/index.html @@ -1009,7 +1009,7 @@ } function pinsGeo() { return { type: 'FeatureCollection', features: pinData.cities.map(c => ({ type: 'Feature', - properties: { n: c.n, label: `${c.city}, ${c.country} · ${c.n} ${c.n === 1 ? 'delad pin' : 'delade pins'}` }, + properties: { n: c.n, lat: c.lat, lng: c.lng, place: `${c.city}, ${c.country}`, label: `${c.city}, ${c.country} · ${c.n} ${c.n === 1 ? 'delad pin' : 'delade pins'}` }, geometry: { type: 'Point', coordinates: [c.lng, c.lat] } })) }; } async function initMap() { @@ -1043,6 +1043,7 @@ + ''); $('gz-in').onclick = () => map.zoomIn(); $('gz-out').onclick = () => map.zoomOut(); setInterval(() => map.getSource('night') && map.getSource('night').setData(nightPolygon(now())), 60 * 1000); + if (q.has('debug')) window.__globe = map; // test hook map.on('load', () => { fetchPins(); $('map').dataset.proj = JSON.stringify(map.getProjection && map.getProjection()); }); // diagnostics map.on('error', ev => { $('map').dataset.err = String(ev && ev.error && ev.error.message || ev).slice(0, 200); }); const el = document.createElement('div'); el.className = 'me-pin'; el.title = 'Din valda plats'; @@ -1054,7 +1055,13 @@ map.on('mouseleave', 'pins', () => { tip.style.display = 'none'; map.getCanvas().style.cursor = ''; }); map.on('click', ev => { const hit = map.getLayer('pins') && map.queryRenderedFeatures(ev.point, { layers: ['pins', 'pins-glow'] })[0]; - if (hit) { tip.textContent = hit.properties.label; tip.style.left = ev.point.x + 'px'; tip.style.top = ev.point.y + 'px'; tip.style.display = 'block'; return; } + if (hit) { // a shared pin: jump straight to that city + const { lat, lng } = hit.properties; // exact stored position (rendered geometry is slightly quantized) + tip.style.display = 'none'; + $('p-loc-note').textContent = `Du tittar nu på himlen över ${hit.properties.place}.`; + setLocation({ lat, lng, name: hit.properties.place, home: false }); + return; + } setLocation({ lat: ev.lngLat.lat, lng: ((ev.lngLat.lng + 540) % 360) - 180, name: null, home: false }); }); }