Robin Bakker Robin Bakker
De weg in Zion National Park, VS

Kaartweergave in Astro (en meer met maps)

Searching for a simple map solution.

Afgelopen zomer zijn we met een camper op rondreis gegaan door de VS... Te gek! 😎 Om thuis iedereen op de hoogte te houden wilde ik een reisblog maken (rroadtrips.com), met een kaart om de route te tonen.

Ik wilde graag eens iets maken met Astro, een "static" site builder. Tegelijkertijd had ik er ook niet heel veel tijd voor vrijgemaakt. 😅 Dus ging ik op zoek naar een eenvoudige oplossing om een kaart weer te geven. Omdat Astro om kan gaan met verschillende front-end framework componenten, dacht ik dat het wel makkelijk zou zijn om een React component te zoeken en deze in te zetten.

Toch ben ik daar eigenlijk vrij snel van teruggekomen. Astro is vooral gericht op het genereren van statische pagina's, waarbij zoveel mogelijk javascript wordt weggelaten. Een maps component zou wel javascript moeten hebben om deze interacief te maken. Het leek me dan wel een beetje overdreven om dan de complete React library in te laden voor één component. 🤔 Preact (het 3KB alternatief voor React) leek me een beter plan. En als ik dan toch Preact zou gaan gebruiken, dan zijn andere Preact components die statisch worden weergegeven in Astro ook makkelijker toe te voegen.

Langer verhaal kort:

Uiteindelijk koos ik voor een simpele Preact component implementatie met Leaflet (en OpenStreetMap kaart). Voornamelijk gebaseerd op dit stackoverflow artikel. Vervolgens met het attribuut client:only="preact" om het component aan de client-side te laten opbouwen. Ik gebruikte TypeScript, en om het werkend te maken met Astro moest ik de import schrijven includief ".tsx" extensie. Dat werkte! 🥳

Voorbeeld van de kaartweergave op ons blogje; een kaart met markers en een lijst van locaties (Leaflet/OpenStreetMap)De kaartweergave op rroadtrips.com


Toen ik op zoek was naar componenten en andere map oplossingen ben ik veel andere interessante bronnen tegengekomen. Ik zet ze hier even neer, voornamelijk voor mezelf om later terug te vinden - maar misschien is het ook voor anderen handig! 😜

Handige React componenten

Hier zijn een paar componenten die ik heb geprobeerd voordat ik overstapte op het Preact component wat ik hierboven beschreef. ⬆️

Pigeon Maps (React/OpenStreetMap)

https://pigeon-maps.js.org
Gebruikte dit component als eerste in Astro. Werkte goed, iets gelimiteerd in mogelijkheden

React Simple Maps (React/d3-geo/topojson)

https://www.react-simple-maps.io
Ook geprobeerd, maar door de oude package dependencies vond ik dit niet ideaal

React Leaflet (React/Leaflet)

https://react-leaflet.js.org
Werkte ook, maar vond ik te groot/uitgebreid voor mijn usecase

Map providers

Google Maps

https://developers.google.com/maps/documentation

OpenStreetMap

https://www.openstreetmap.org

HERE maps

https://developer.here.com/develop/javascript-api

Mapbox

https://www.mapbox.com

TomTom maps

https://developer.tomtom.com/products/maps-api

Mapzen/Nextzen/Tilezen

https://www.mapzen.com
https://www.nextzen.org
https://github.com/tilezen

Map libraries/frameworks

Leaflet (javascript library)

https://leafletjs.com

OpenLayers

https://openlayers.org

MapLibre

https://maplibre.org

Mapbox GL JS

https://docs.mapbox.com/mapbox-gl-js

react-map-gl (React/Mapbox GL JS)

https://visgl.github.io/react-map-gl

deck.gl (WebGL)

https://deck.gl

Maptalks (javascript)

https://maptalks.org

Tangram (javascript/WebGL)

https://github.com/tangrams/tangram

Overig

Geolib

https://github.com/manuelbieh/geolib
Library to provide basic geospatial operations like distance calculation, conversion of decimal coordinates to sexagesimal and vice versa, etc.

Turf.js

https://turfjs.org
Advanced geospatial analysis for browsers and Node.js

Mapus

https://github.com/alyssaxuu/mapus
Een map tool met real-time samenwerken

OpenMapTiles

https://openmaptiles.org
Open-source maps gemaakt voor self-hosting