How to create a map in SVG?

Skab Interaktive Kort med SVG og CSS

Inden for webudvikling og datavisualisering er evnen til at præsentere information på en klar og engagerende måde afgørende. En af de mest effektive metoder er brugen af kort. Men traditionelle billedformater kan miste kvalitet, når de skaleres, og er ofte statiske. Her kommer SVG (Scalable Vector Graphics) ind i billedet. SVG er et alsidigt billedformat, der er baseret på vektorer, hvilket betyder, at det kan skaleres op og ned uden tab af kvalitet. Dette gør det perfekt til at skabe responsivt webdesign og ikke mindst, interaktive kort.

SVG-kort er ikke kun skalerbare; de er også lette at manipulere med kode, hvilket åbner døren for at tilføje interaktivitet direkte ved hjælp af simple webteknologier som HTML og CSS. Forestil dig et kort, hvor brugerne kan holde musen over et område for at se mere information, eller klikke på en region for at navigere til en relateret side. Alt dette er muligt med SVG, og i denne artikel vil vi dykke ned i, hvordan du specifikt kan skabe et interaktivt kort ved kun at bruge HTML og CSS, med særlig fokus på et eksempel med et kort over Afrika.

How to create a map in SVG?
You can create an SVG map using vector graphics software such as Adobe Illustrator or Inkscape, or with code using libraries such as D3. js or Leaflet. You can also download SVG maps from Wikipedia using a creative-commons license. Click here for the map we'll use in this tutorial.
Indholds

Hvad er et SVG Kort?

Et SVG kort er et digitalt kort gemt i SVG formatet. I modsætning til rasterbilleder (som JPEG eller PNG), der består af et gitter af pixels, er SVG billeder beskrevet ved hjælp af matematiske ligninger, der definerer punkter, linjer, kurver og former. For et kort betyder dette, at landegrænser, regioner og andre geografiske elementer ikke er faste pixels, men dynamiske former. Dette er kernen i, hvorfor SVG-kort er så kraftfulde – de er vektorbaseret.

Fordi SVG er XML-baseret, kan indholdet af en SVG-fil læses og manipuleres som almindelig tekst. Hvert element i kortet (f.eks. et land, en sø, en by) kan repræsenteres som et specifikt element i SVG-koden, ofte et <path> element, der beskriver formens kontur. Dette giver os mulighed for at målrette specifikke dele af kortet med CSS eller JavaScript for at ændre deres udseende eller adfærd.

Fordele ved at Bruge SVG Kort

Der er mange gode grunde til at vælge SVG, når du skal oprette kort til web eller andre applikationer. Nogle af de mest betydningsfulde fordele inkluderer:

  • Skalerbarhed: Som nævnt kan SVG kort skaleres til enhver størrelse uden tab af kvalitet. Dette er uvurderligt i en verden med mange forskellige skærmstørrelser og opløsninger, da det sikrer, at dit kort altid ser skarpt ud, uanset om det vises på en mobiltelefon eller en stor computerskærm.
  • Tilpasning: Fordi SVG-koden er tekstbaseret, er det nemt at ændre farver, streger, tykkelser og endda former på kortets elementer ved hjælp af CSS. Du kan nemt opdatere kortets udseende, så det passer til dit brands design eller til at fremhæve bestemte data.
  • Interaktivitet: SVG-elementer kan gøres interaktive ved hjælp af CSS og JavaScript. Du kan tilføje hover-effekter, klikbare områder, zoom, panoreringsfunktioner og dynamisk visning af information baseret på brugerinput. Dette transformerer et statisk billede til et dynamisk værktøj for datavisualisering.
  • Filstørrelse: For mange grafiske elementer, især dem med rene linjer og former som kort, er SVG-filer ofte mindre i størrelse sammenlignet med rasterbilleder af tilsvarende kvalitet, især ved høj opløsning. Mindre filstørrelser betyder hurtigere indlæsningstider for din webside.
  • Tilgængelighed: Da SVG er tekstbaseret, kan screenreadere og andre hjælpeteknologier potentielt læse og fortolke indholdet af SVG-filen, hvilket kan forbedre tilgængeligheden for brugere med handicap. Ved at tilføje passende titler og beskrivelser kan du gøre kortet endnu mere tilgængeligt.
  • Cross-platform Kompatibilitet: SVG understøttes af de fleste moderne webbrowsere og enheder, hvilket sikrer, at dit kort vises korrekt for et bredt publikum.

Disse fordele gør SVG til et ideelt valg for kort, der skal bruges på nettet, i applikationer, eller hvor skalerbarhed og interaktivitet er vigtig.

Kom i Gang: Opsætning af HTML

For at skabe vores interaktive SVG kort skal vi først have en grundlæggende HTML struktur. Vi vil integrere SVG-koden direkte i vores HTML-dokument. Dette kaldes 'inline SVG'.

Grundlæggende HTML Struktur

Vi starter med et standard HTML5 dokument. Her er skelettet:

<!DOCTYPE html> <html lang="da"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Interaktivt Kort</title> <!-- Her kan vi tilføje vores CSS --> <style> /* CSS regler kommer her */ </style> </head> <body> <!-- SVG kortet indsættes her --> </body> </html>

Dette er standard boilerplate for et HTML dokument. <meta charset="UTF-8"> sikrer korrekt tegnkodning, <meta name="viewport"> er vigtig for responsivt design, og <title> sætter sidens titel i browserfanen.

Indhentning af SVG Kortet

Før vi kan indsætte kortet, skal vi have en SVG fil. Du kan oprette dine egne SVG kort ved hjælp af vektorbaseret grafiksoftware som Adobe Illustrator eller Inkscape. Alternativt kan du finde gratis SVG kort online, for eksempel på Wikipedia, hvor mange kort er tilgængelige under Creative Commons licenser. Til vores eksempel med 'Tour Afrique' kortet, forestiller vi os, at vi har downloadet en SVG fil af Afrika.

Indlejring af SVG Kortet i HTML

Nu tager vi indholdet af den downloadede SVG fil og indsætter det direkte inde i <body> tagget i vores HTML. SVG koden starter typisk med et <svg> tag og indeholder derefter forskellige elementer som <path>, <circle>, <rect> osv., der tilsammen danner billedet af kortet. For et kort over Afrika vil <path> elementerne sandsynligvis repræsentere de forskellige lande.

<body> <h2>Tour Afrique</h2> <div id="kortContainer"> <svg xmlns:dc="http://purl.org/dc/elements/1.1/" ...> <!-- Masser af <path> elementer, der repræsenterer lande --> <path d="M...Z" id="Mali" style="..."/> <path d="M...Z" id="Benin" style="..."/> <!-- Flere lande... --> </svg> </div> </body>

Vi har pakket SVG'en ind i en <div> med ID'et kortContainer. Dette er nyttigt, hvis vi senere vil style eller manipulere hele kortet som en enhed ved hjælp af CSS eller JavaScript. Selve <svg> tagget indeholder attributter som xmlns, der definerer XML navnerum, hvilket er standard for SVG.

Gør Kortet Interaktivt: Tilføj Klikbare Områder

For at gøre hvert enkelt land på kortet klikbart og give det en titel, der vises ved hover, skal vi modificere SVG koden. Hvert <path> element, der repræsenterer et land, skal indpakkes i et <a> (anker) tag.

Indpakning af Lande i Anker-tags

<a> tagget bruges normalt til at skabe links til andre sider. Inden for SVG kan det bruges på samme måde til at gøre et grafisk element klikbart. Vi vil bruge href attributten til at angive URL'en (f.eks. til landets Wikipedia side) og title attributten til at vise landets navn, når musen holdes over det. For bagudkompatibilitet med ældre browsere kan xlink:href også bruges sammen med href.

<a xlink:href="https://da.wikipedia.org/wiki/Mali" href="https://da.wikipedia.org/wiki/Mali" target="_blank" title="Mali"> <path id="Mali" d="M...Z"/> </a> <a xlink:href="https://da.wikipedia.org/wiki/Benin" href="https://da.wikipedia.org/wiki/Benin" target="_blank" title="Benin"> <path id="Benin" d="M...Z"/> </a> <!-- Gør dette for hvert land -->

Her har vi indpakket <path> elementet for Mali i et <a> tag. href og xlink:href peger på Malis Wikipedia side. target="_blank" sikrer, at linket åbnes i en ny browserfane. title="Mali" vil forårsage, at browseren viser en tooltip med teksten "Mali", når brugeren holder musen over landet.

Styling med CSS: Gør Kortet Visuelt

Nu hvor kortets struktur er på plads, og vi har gjort landene klikbare, er det tid til at style kortet ved hjælp af CSS. Vi kan definere farver, streger og endda tilføje visuelle effekter som ændringer ved hover.

Grundlæggende SVG Styling

SVG elementer kan styles direkte med CSS ved hjælp af egenskaber som fill (fyldfarve), stroke (stregfarve) og stroke-width (stregtykkelse). Disse egenskaber svarer til dem, du måske kender fra grafiksoftware.

<style> #kortContainer svg { width: 100%; /* Gør kortet responsivt */ height: auto; border: 1px solid #ccc; /* Tilføj en ramme omkring kortet */ } path { fill: #d3d3d3; /* Standard fyldfarve for alle lande */ stroke: #ffffff; /* Hvide streger mellem lande */ stroke-width: 0.5; cursor: pointer; /* Indiker at elementet er klikbart */ } /* Specifikke farver for udvalgte lande (eksempel) */ #Mali { fill: #a52a2a; } #Benin { fill: #00baba; } #Nigeria { fill: #ffff00; } /* ... flere lande ... */ </style>

I dette CSS eksempel sætter vi først størrelsen på SVG'en til at være responsiv (100% bredde). Derefter definerer vi standardudseendet for alle <path> elementer (vores lande): en grå fyldfarve, tynde hvide streger og en cursor: pointer; for at indikere, at de er klikbare. Til sidst viser vi, hvordan du kan målrette specifikke lande ved deres id (som vi satte på <path> elementet inde i <a> tagget) for at give dem unikke farver.

Tilføj Hover-Effekter

En vigtig del af interaktivitet er visuel feedback. Når brugeren holder musen over et land, vil vi gerne have, at det ændrer udseende for at indikere, at det er interagerbart. Dette gøres nemt med CSS's :hover pseudo-klasse.

<style> /* ... (tidligere CSS) ... */ path:hover { fill: #800080; /* Skift fyldfarve til lilla ved hover */ stroke: #ff0000; /* Skift stregfarve til rød */ stroke-width: 2; transition: fill 0.3s ease; /* Tilføj en blød overgangseffekt */ } </style>

Denne CSS regel specificerer, hvordan <path> elementer skal se ud, når musen holdes over dem. Fyldfarven ændres til lilla, stregen bliver rød og tykkere. transition: fill 0.3s ease; tilføjer en simpel animation, der gør, at farveændringen sker gradvist over 0.3 sekunder, hvilket giver en pænere brugeroplevelse.

Bemærk, at :hover reglen anvendes på <path> elementet. Da <path> er indpakket i et <a> tag, vil hover-effekten aktiveres, når musen er over det klikbare område defineret af <a> tagget, som typisk omfatter hele <path> formen.

Ofte Stillede Spørgsmål

Her er svar på nogle almindelige spørgsmål, der kan opstå, når man arbejder med SVG kort og interaktivitet:

Q: Hvordan får jeg fat i et SVG-kort over et specifikt område?

A: Du kan oprette det selv med vektor-grafikprogrammer som Inkscape (gratis) eller Adobe Illustrator. Alternativt findes der mange online ressourcer, der tilbyder gratis eller betalte SVG kort, f.eks. Wikipedia for geografiske kort, eller specialiserede sider for kortdata. Søg efter "SVG map of [område]" eller "free SVG maps". Husk at tjekke licensbetingelserne, hvis du bruger kort fra tredjeparter.

Q: Kan jeg tilføje mere kompleks interaktivitet, f.eks. pop-ups med data?

A: Ja, absolut. Selvom denne artikel fokuserer på HTML og CSS for grundlæggende interaktivitet (hover, link), kræver mere avancerede funktioner som at vise dynamiske data i en pop-up, når man klikker på et land, typisk brug af JavaScript. JavaScript kan bruges til at lytte efter klik-events på de enkelte SVG-elementer og derefter manipulere DOM'en (Document Object Model) for at vise eller skjule information.

Q: Er SVG kort altid det bedste valg for kort på nettet?

A: SVG er fremragende til kort, hvor du har brug for skalerbarhed, interaktivitet på element-niveau og relativt enkle geografiske former. For meget detaljerede kort, kort baseret på satellitbilleder, eller kort med komplekse geodata, kan andre teknologier som WebGL eller specialiserede kortbiblioteker (f.eks. Leaflet eller Mapbox) være mere passende. Men for illustrative, interaktive kort som dem, der ofte bruges til datavisualisering af regioner eller lande, er SVG et meget stærkt og letvægtsvalg.

Q: Hvordan sikrer jeg, at mit interaktive kort er tilgængeligt for alle brugere?

A: Udover at bruge title attributten på <a> tags for at give hover-information, kan du tilføje WAI-ARIA attributter til SVG-elementerne for at give yderligere semantisk information til screenreadere. Sørg for, at farvekontraster er tilstrækkelige, og at interaktive elementer er store nok til at blive klikket på, også på touch-enheder. Hvis du bruger JavaScript til mere kompleks interaktion, skal du sikre, at tastaturnavigation og screenreadere kan tilgå informationen og interaktionerne.

Konklusion

At skabe interaktive kort ved hjælp af SVG, HTML og CSS er en kraftfuld måde at visualisere geografisk data på og forbedre brugeroplevelsen på din hjemmeside. Som vi har set, kræver det kun en grundlæggende forståelse af disse webteknologier at komme i gang. Ved at indlejre SVG-koden direkte i HTML, indpakke de ønskede elementer (som lande) i <a> tags for at gøre dem klikbare og tilføje title for hover-information, og derefter style dem med CSS, kan du hurtigt transformere et statisk kort til et dynamisk, interaktivt element.

Vi har gennemgået processen fra at have en grundlæggende HTML-struktur og indlejre SVG-koden, til at gøre individuelle områder klikbare ved hjælp af anker-tags og tilføje visuelle effekter med CSS, herunder hover-tilstande. Det 'Tour Afrique' eksempel, vi brugte, illustrerer, hvordan du kan give hvert land en unik stil og adfærd. Mulighederne for yderligere tilpasning og funktionalitet er omfattende, især hvis du vælger at introducere JavaScript for mere komplekse interaktioner.

Ved at mestre teknikkerne beskrevet her, er du godt rustet til at skabe smukke, skalerbare og engagerende kort til et utal af formål, fra datavisualisering til navigationsværktøjer på din hjemmeside. SVG's fleksibilitet og den tætte integration med HTML og CSS gør det til et fremragende valg for moderne webudvikling.

Hvis du vil læse andre artikler, der ligner Skab Interaktive Kort med SVG og CSS, kan du besøge kategorien Grafik.

Avatar photo

Franne Voigt

Mit navn er Franne Voigt, jeg er en 35-årig fotograf fra Danmark med en passion for at fange øjeblikke og dele mine erfaringer gennem min fotoblog. Jeg har arbejdet med både portræt- og naturfotografi i over et årti, og på bloggen giver jeg tips, teknikker og inspiration til både nye og erfarne fotografer. Fotografi er for mig en måde at fortælle historier på – én ramme ad gangen.

Go up