Mapbox
en kommerciel kilde til kortfliser og stile
Hvad det er
Mapbox er en virksomhed og den udviklerplatform, den sælger, som leverer delene af et interaktivt kort som tjenester: grunddata, stilen, koden der tegner kortet, og API’erne rundt om det. I kode dukker det ofte op som Mapbox GL, efter tegnebiblioteket. Virksomhedens kom-i-gang-vejledning kalder det en lokationsplatform, der giver udviklere byggeklodser til kort, navigation og søgning.
Kortdata ligger i flisesæt, som regel skåret op i vektorfliser, så en klient kun
henter det område og det zoomniveau, der er på skærmen. Mapbox vedligeholder
globale grunddatasæt, og et teams egne data kommer ind i et flisesæt via Mapbox
Tiling Service (MTS) eller Uploads API. En stilart bestemmer udseendet. Den er
et JSON-dokument skrevet efter Mapbox Style Specification, som navngiver sine
kilder og opregner lag, der hver især plukker objekter ud af én kilde og siger,
hvordan de skal tegnes. Stilarter adresseres med en URL, for eksempel
mapbox://styles/mapbox/streets-v12, og laves i kontoens konsol med Mapbox
Studio, designværktøjet.
Mapbox GL JS tegner resultatet i en browser, og Maps SDK’erne til iOS og Android gør det i mobilapps. GL JS-vejledningen, i version 3.33.0 i skrivende stund, siger, at biblioteket gengiver kort i 2D og 3D med OpenGL ved at kombinere vektorfliser med stilregler i browseren frem for på en server, og det er derfor, et kort kan skifte stilart eller data, mens nogen bruger det. Static Images API returnerer et billede af et kort, og Static Tiles API leverer rasterfliser lavet ud fra Studio-stilarter til biblioteker som Leaflet. Hvert kort oprettes med et adgangstoken, og tokenet knytter det til en Mapbox-konto.
Selve fliseformatet, Mapbox Vector Tile-specifikationen, er offentliggjort åbent på GitHub og koder hver flise som en Protocol Buffers-besked.
Hvorfor det betyder noget
Et webkort skal bruge kode, der tegner det, og data at tegne, fra én leverandør eller fra flere. Mapbox er svaret med én leverandør, med data, stil, gengivelse og hosting under én konto og én regning, så valget af det er et valg om, hvor meget af kortstakken man vil leje.
Gevinsterne er reelle. Grunddata er en andens opgave at holde ajour. Kortets udseende bor i et stildokument med sit eget designværktøj, adskilt fra applikationskoden. Fordi tegningen sker i browseren, kan ét flisesæt vises i flere stilarter, et lag kan filtreres eller farves om ved et klik, og det samme kort kan vise terræn i 3D. For et produkt, hvis hovedskærm er kortet, er det en stor mængde arbejde, der overlades til leverandøren.
Omkostningerne følger med den samme konto. GL JS faktureres efter
kortindlæsninger, og prisvejledningen tæller én, hver gang et Map-objekt
initialiseres på en side. Panorering, zoom, til- og frakobling af lag og skift
af stilart inde i det kort lægger intet til, og én kortindlæsning varer højst 12
timer. Det token, kortet afregnes på, ligger i hver besøgendes browser. Og siden
version 2.0.0, udgivet i december 2020, har selve gengiveren været underlagt
kommercielle vilkår: changelog-filen for den udgivelse siger, at GL JS ikke
længere er under 3-Clause BSD-licensen, og at en opgradering betyder at
acceptere Mapbox’ servicevilkår.
Portabilitet er derfor et spørgsmål til starten. Fliseformatet er åbent. MapLibre GL JS begyndte som en open source-fork af mapbox-gl-js, taget før licensskiftet. Dens 1.x-linje var tænkt som en direkte erstatning for open source-udgaven af Mapbox 1.x, og dens README siger, at den har udviklet sig meget siden. Det er muligt at forlade Mapbox, men det er en migrering, og det er billigere at overveje den, før et produkt bygges op om én leverandørs stilarter og flisesæt.
Sådan ser det ud i praksis
Tre sider på dette websted viser, hvad Mapbox gjorde i arbejdet.
Som Teamlead for GIS‑softwareudvikling fra 2022 til 2024 var rollen at lede full-stack-udviklingen af et GIS-kort, der var vokset op i stumper: spatiale data i PostgreSQL, ReactJS forrest, NodeJS bagved og Mapbox til at tegne kortet. Siden opsummerer Mapbox-delen i én linje: Mapbox stod for tegningen, og opgaven var at fodre den med de rigtige data på de rigtige zoomniveauer i stedet for det hele på én gang. Resultatet var én integreret kortapplikation, der blev en central del af platformen og tog imod nye lag uden at knække sammen.
Under samme titel, fra 2015 til 2022, lå rollen i designprocessen for projekternes brugerflader, med React-, Angular- og Vue‑frontends oven på Mapbox- og Leaflet‑kort. Sidens pointe er, at kortet er den nemme del: folk farer vild i kontrollerne, filtreringen og flowet rundt om det, i detaljer som at skifte mellem etager på et indendørskort.
Som Dataingeniør fra 2022 til 2024 var opgaven at løse over 1.000 problemer i geografiske data og tidsseriedata med GDAL, QGIS, ArcGIS, PostGIS og Bash. De rensede data blev derefter integreret i interaktive visualiseringer med Mapbox. Siden tilskriver arbejdet som helhed en 35 % reduktion i køretider for spatiale forespørgsler.
Hvor det går galt
De fleste problemer med Mapbox begynder, når et kort møder rigtig trafik, rigtige data eller en større opgradering.
Regningen vokser med sidevisninger frem for med brugen af kortet. En
kortindlæsning tælles ved initialiseringen, så prisen følger, hvor ofte en side
opretter et kort. En single-page-app, der genopretter Map ved hvert ruteskift,
betaler hver gang, og det samme gør et kort langt nede på en lang side, som de
fleste besøgende aldrig når til. Mapbox’ vejledning om at styre omkostningerne
ved webkort foreslår at oprette kortet først, når dets container ruller ind i
synsfeltet, at lægge det bag en Load Map-knap og at bruge Static Images API,
hvor ingen behøver at panorere eller zoome. Én kortinstans, der holdes i live på
tværs af ruter, dækker single-page-tilfældet.
Et token kopieret ud af siden bliver brugt andre steder. Tokenvejledningen
fastslår, at ethvert token på en offentlig webside eller i kildekode er synligt
for alle, der leder efter det. Tokens med hemmelige scopes, sk-typen, hører
hjemme på en server. Et offentligt pk-token på en side bør være lavet til
netop den applikation, med URL-begrænsninger, frem for kontoens standardtoken,
som ikke kan begrænses. Vejledningen kalder URL-begrænsninger en
best-effort-foranstaltning, der hviler på den referer-header, browseren sender.
Efter et læk skal tokenet roteres: opret et nyt token, skift det ud i koden,
deploy, og slet så det gamle.
Kortet bliver langsommere, efterhånden som datasættet vokser. Klienten laver
en GeoJSON-kilde om til vektorfliser undervejs, så en stor fil betyder, at hver
besøgendes browser står for flisningen. Vejledningen om store GeoJSON-kilder
opregner midlerne: indlæs filen fra en URL frem for et JavaScript-objekt, sænk
kildens maxzoom under standardværdien 18 (12 passer til de fleste punktdata),
hæv lagets minzoom over 0, klyng tætte punkter, og fjern ubrugte egenskaber og
decimaler ud over den sjette. Det sidste trin skrumper vejledningens eksempelfil
fra 19,3 MB til 3,3 MB. Over 500.000 punkter foreslår den at dele kilden op
eller at lave fliserne på serveren med MTS eller Uploads API.
map.addSource("sites", {
type: "geojson",
data: "/data/sites.geojson", // a URL, not an object in memory
maxzoom: 12, // the default is 18
cluster: true, // group dense points at low zoom
});
map.addLayer({
id: "sites",
type: "circle",
source: "sites",
minzoom: 6, // hidden below zoom 6
});
En større opgradering ændrer licensen og regningen. Skiftet af GL JS fra 1.x til 2.0.0 flyttede biblioteket fra BSD-licensen til Mapbox’ servicevilkår og ændrede afregningsreglen. Under 1.x krævede en kortindlæsning en initialisering plus en anmodning om en flise hostet af Mapbox; fra 2.0.0 tæller initialiseringen alene, så et kort, der kun tegnede selvhostede fliser, begynder at generere kortindlæsninger. Changelog-filen beder om et kig på prisdokumentationen før opgraderingen, og MapLibre GL JS er vejen for et projekt, der vil blive på open source-vilkår.
Læs mere
- Getting Started — virksomhedens overblik over sine produkter til kort, søgning og navigation.
- Mapbox GL JS pricing — hvad der tæller som en kortindlæsning, sessionen på 12 timer og de ældre regler.
- Token management — offentlige og hemmelige tokens, scopes, URL-begrænsninger og rotation.
- Working with large GeoJSON sources in Mapbox GL JS — zoomgrænser, klyngedannelse, oprydning og flisning på serveren.
- Mapbox Vector Tile specification — det åbne format bag fliserne.
- MapLibre GL JS — gengiveren med åben kildekode, der begyndte som en fork af mapbox-gl-js.