Har du hängt med på bloggen så känner du till GeoJSON, som är ett filformat för att hantera geografiska punkter, linjer och ytor samt deras attribut.
Syntaxen följer JavaScript Object Notation (därav JSON) och har en hel del fördelar jämfört med exempelvis ESRI-shape. Inte minst då en enda fil kan hantera många olika geometrityper (punkter, linjer och ytor) vilket gör distribution via exempelvis Internet väldigt mycket enklare. När dessutom många webbkartor är baserade på javaskript så är filformatet ett ganska naturligt val.
Ett problem med GeoJSON är om man har många objekt eller objekt med komplicerade geometrier, vilket gör att filerna snabbt blir väldigt stora.
Varje objekt lagras var för sig med all information som behövs för att återskapa det, men det finns ett alternativ som går ett steg längre.
TopoJSON utgår inte från objekten utan från topologin. Vad betyder då det?
Varje brytpunkt i ett GeoJSON lager beskrivs med ett koordinatpar. I bilden ovan får siffror representera dessa koordinater, men i realiteten så är koordinater mycket längre än enkla siffror.
För att beskriva objekten ovan så behövs:
- Linjen = sex koordinatpar
- Gula ytan = fyra koordinatpar
- Gröna ytan = åtta koordinatpar
Detta ger tillsammans 18 koordinatpar, där koordinaterna 3, 4, 5, 6, 9 och 10 används vid två eller flera tillfällen.
Om man i stället använder topologier så börjar man med att definiera former eller ”arcs”, som är gemensamma.
I bilden ovan finns det sex stycken sådana former.
A – 1, 2, 3
B – 3, 4
C – 4, 5
D – 5, 6
E – 6, 7, 8, 3
F – 4, 9, 10, 5
Sedan använder man formerna för att beskriva objekten. Linjen består av A, B, C och D. Gula ytan C och F, Gröna ytan B, F, D och E.
Även i en så pass enkel geometri som den ovan så används endast 17 koordinatpar för att beskriva objekten och då kan man tänka sig vilka besparingar som kan göras för betydligt mer krångliga lager.
Bilden ovan är från https://github.com/mbostock/topojson/wiki och används som exempel. Här ser vi ”kommuner” i USA och lagrade som GeoJSON är filen 2.2 Mb, medan TopoJSON filen blir 436 kb.
I ett punktlager eller lager där inga objekt delar på former så uteblir däremot besparingen. TopoJSON blir däremot sällan större i filstorlek än GeoJSON.
TopoJSON stöds av exempelvis Leaflet och PostGIS.