Interaktiv karta för Skåneturer

Sommarsemesterns projekt är nu genomfört, dåliga dagar var detsamma som kodning och hackande för att få ihop en ny interaktiv karta med utflyktsmål, rastplatser med mera för https://skaneturer.se vilket är en annan sida jag driver.

Under de senaste veckorna har vi utvecklat en interaktiv karta över MC‑destinationer i Skåne — ett projekt som vid första anblick kan verka enkelt, men som i praktiken kräver en noggrant genomtänkt arkitektur, ett flexibelt datalager, en robust WordPress‑integration och en visuellt tydlig kartmotor. Kartan är byggd för att vara snabb, modulär, lätt att uppdatera och enkel att bädda in på vilken WordPress‑sida som helst.

Det här är en djupgående genomgång av hur kartan byggdes, vilka tekniska val som gjordes, hur datastrukturen är uppbyggd, hur Leaflet driver interaktiviteten och hur shortcodes gör kartan flexibel för redaktörer. Artikeln beskriver också hur vi arbetat med design, prestanda och framtida möjligheter.

Det ursprungliga målet var att skapa en karta som visar MC‑vänliga destinationer i Skåne — caféer, utsiktsplatser, verkstäder, rastplatser och andra intressanta stopp. Men visionen var större än att bara placera ut punkter på en karta. Kartan skulle:

  • vara interaktiv, inte statisk
  • vara datadriven, inte hårdkodad
  • vara modulär, inte monolitisk
  • vara WordPress‑vänlig, inte beroende av specialmiljöer
  • vara lätt att uppdatera, utan att redaktörer behöver röra kod
  • vara visuellt tydlig, även på mobil
  • vara prestandaoptimerad, även med många POI‑punkter

Det innebar att kartan behövde byggas som ett system — inte som en enskild komponent.

Varför JSON-baserad data till att börja med? JSON är ett naturligt val för kartdata, särskilt när kartan ska vara modulär och lätt att uppdatera. Fördelarna är tydliga:

  • JSON är lätt att läsa och skriva
  • JSON är kompatibelt med JavaScript och Leaflet
  • JSON är filbaserat, vilket gör det enkelt att lägga till nya dataset
  • JSON är flexibelt, vilket gör det möjligt att representera olika typer av punkter
  • JSON är snabbt, eftersom Leaflet kan läsa och rendera det direkt

Det gör JSON till ett perfekt format för en destinationsfil.

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "name": "MC‑destination",
        "description": "Beskrivning av platsen",
        "category": "café"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [13.12345, 55.67890]
      }
    }
  ]
}

Den här strukturen gör det möjligt att:

  • visa popup‑information
  • filtrera på kategorier
  • skapa olika ikonstilar
  • kombinera flera POI‑filer i samma karta
  • lägga till metadata som öppettider, prisnivå eller MC‑vänlighet

Eftersom kartan bygger helt på POI‑punkter är koordinaterna kritiska. Felaktiga koordinater leder till:

  • punkter som hamnar långt utanför Skåne
  • punkter som hamnar i havet
  • punkter som hamnar på fel sida av vägen
  • punkter som inte syns vid autozoom

Vi har därför lagt stor vikt vid:

  • validering av koordinater
  • kontroll av decimaler
  • kontroll av ordningen (longitude först, latitude sedan)
  • testning i kartan

Det här är en av de viktigaste delarna av arbetet.

WordPress och shortcodes.

Shortcodes är ett av WordPress mest kraftfulla verktyg. Genom att använda shortcodes kan vi:

  • bädda in kartan på vilken sida som helst
  • låta redaktörer välja vilka POI‑filer som ska laddas
  • låta kartan vara olika på olika sidor
  • skicka konfigurationsparametrar till JavaScript
  • undvika att redaktörer behöver röra kod

Det gör kartan extremt flexibel.

Shortcoden vi utvecklade ser ut så här:

[leaflet_map poi="skane_poi.json"]

Men den kan också vara mer avancerad:

[leaflet_map poi="mc_destinations.json" zoom="10" center="55.9,13.5"]

Shortcoden är alltså inte bara ett sätt att ladda kartan — det är ett sätt att konfigurera den.

PHP-delen, shortcoden och kopplingen till kartan.

Shortcoden hanteras av ett PHP‑skript som:

  1. läser shortcode‑parametrarna
  2. genererar HTML‑containern
  3. skickar parametrarna vidare till JavaScript
  4. laddar rätt JSON‑filer
  5. initierar Leaflet‑kartan

Det här skapar en tydlig separation mellan:

  • WordPress‑logik
  • kartlogik
  • datalagring

Det gör pluginet lätt att underhålla och utöka.

Varför Leaflet är perfekt för POI‑kartor?

Leaflet är ett av världens mest använda kartbibliotek. Det är:

  • snabbt
  • lättviktigt
  • modulärt
  • open source
  • kompatibelt med alla moderna webbläsare

För en POI‑karta är Leaflet perfekt eftersom det:

  • hanterar punktdata elegant
  • har bra stöd för popup‑fönster
  • har bra zoom‑kontroller
  • fungerar utmärkt på mobil
  • är lätt att utöka med plugins

Kartinitieringen

Kartinitieringen sker i map.js:

var map = L.map('map').setView([55.9, 13.5], 9);

Därefter läggs bakgrundslagret på:

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  maxZoom: 18
}).addTo(map);

POI‑punkter laddas med:

fetch(poiFile)
  .then(response => response.json())
  .then(data => L.geoJSON(data, {
    pointToLayer: function(feature, latlng) {
      return L.marker(latlng);
    }
  }).addTo(map));

Här kan vi lägga till:

  • specialikoner
  • popup‑mallar
  • kategorifilter
  • klickhändelser

fitBounds: kartans autozoom

Eftersom kartan bara innehåller punkter är fitBounds särskilt effektiv:

map.fitBounds(layer.getBounds());

Det här gör kartan:

  • användarvänlig
  • automatiskt anpassad
  • visuellt balanserad

Safari‑konsolen som verktyg.

Safari har en utmärkt JavaScript‑konsol, och den blev ett av våra viktigaste verktyg. Vi använde den för att:

  • testa variabler
  • kontrollera JSON‑innehåll
  • se felmeddelanden
  • följa POI‑rendering
  • validera koordinater

Vanliga fel under utvecklingen.

Fel 1: felaktiga koordinater

Exempel:

  • [55.67890, 13.12345] istället för [13.12345, 55.67890]
  • koordinater i fel ordning
  • koordinater som saknade decimaler

Fel 2: JSON‑fel

Orsak:

  • saknade kommatecken
  • felaktiga citationstecken
  • felaktig struktur

Lösningen: validering och testning.

Vi byggde en rutin:

  1. validera JSON
  2. testa i konsolen
  3. rendera i kartan
  4. kontrollera fitBounds
  5. justera koordinater

Det här gjorde kartan stabil och förutsägbar.

Design: ikoner, färger, popup‑mallar och karttema.

Vi valde att använda:

  • café‑ikoner
  • utsiktsplatser
  • MC‑vänliga stopp
  • verkstäder

Ikonerna är viktiga eftersom de:

  • gör kartan lätt att läsa
  • skapar visuellt fokus
  • hjälper användaren att navigera

Popup‑fönster kan innehålla:

  • namn
  • beskrivning
  • kategori
  • öppettider
  • bilder
  • länkar

Vi experimenterade med:

  • ljus tema
  • mörkt tema
  • minimalistiskt OSM‑tema

Det slutliga valet blev ett ljus OSM‑tema eftersom det:

  • är tydligt
  • fungerar bra med färgade ikoner
  • är lätt att läsa på mobil

Lazy loading.

Kartan laddar:

  • POI‑filen först
  • kartmotorn därefter

Browsercache gör kartan snabbare vid återbesök.

Nordh Tech
Privacy Overview

GDPR och kakor (cookies)

Den 25 maj 2018 började dataskyddsförordningen (GDPR) att gälla i Sverige och övriga EU.

Det innebär bland annat att inget företag eller organisation får spara personuppgifter som inte behövs för att leverera det du bett om och att du har rätt att ”bli glömd” så snart du ber om det.

För din kontakt med Nordh.Tech innebär det inte så mycket.

Vi sparar en kaka (cookie) vilket innebär en liten textfil med information om vad du gjort när du surfar hos oss, vi gör det för att kunna få statistik rörande vad du gjort när du besöker oss och för att vi skall kunna ge dig nytt innehåll och inte till exempel behöva fråga dig var gång du besöker oss om du godkänner våra GDPR-villkor eller att det sparas en ”kaka” på din dator.

Vi sparar också din epostadress för att kunna skicka dig vårt nyhetsbrev eller hantera din inloggning i vårt forum, om du bett om det vill säga. Då du prenumererar på nyhetsbrevet eller begär inloggning till vårt forum anger du också ditt förnamn eller inloggningsnamn men här kan du ange vilket namn som helst. Vissa anger även efternamn men dessa raderas så att endast förnamnet kommer att användas i hälsningsfrasen i varje nyhetsbrev.

Hoppas detta gör att du kan känna dig trygg med ditt besök hos mig här på Internet.