Några av er kanske använder GeoJSON för att lagra data, speciellt om ni har en hanterbar mängd vektordata som skall visualiseras på en webbkarta. I QGIS så går det exempelvis enkelt att spara ett vektorlager som GeoJSON genom att högerklicka på lagernamnet och välja ”Spara som…”. Men vad är GeoJSON egentligen?
Innan vi kommer till GeoJSON så får vi titta lite på vad JSON är (JavaScript Object Notation). Jag hämtar det mesta av informationen från json.org vilket är en mycket bra och informativ sida som förklarar uppbyggnaden av JSON på ett tydligt sätt.
JSON är ett textbaserat format för utbyte av data mellan olika system. Det är ett format som är (relativt) enkelt att förstå för en person och enkelt att sätta upp regler för i ett program så att dessa data kan läsas och skrivas.
De ”objekt” som beskrivs i formatet bygger på par med ”namn” och ”värde”, där framför allt ”värdet” kan anta lite olika, men väl definierade, former.
Varje ”objekt” omsluts av ”klammerparenteser” { }, och det normala är att man använder indentering (indragna rader) för att göra koden tydligare.
Till skillnad från exempelvis Python så är dock indenteringen inte ett krav, men det är god sed. Vill man däremot skapa små filer så går det utmärkt att hoppa över onödiga radbrytningar, indrag och mellanslag (så länge programmet som skall läsa filen förstår detta).
Namn är alltid textsträngar, medan värden kan vara text eller tal, men även ”listor” som då är omslutna av hakparenteser [ ]. Det är också möjligt att använda true, false och null som värde.
Det ovan beskrivna går även att kombinera. Man kan därför ha ett ”objekt” som ”värde” eller till och med en ”lista” med ”objekt” som ”värde”. Det blir förhoppningsvis lite tydligare i exemplen nedan.
VIKTIGT!
För att fullt ut förstå JSON så är det en grundläggande sak man måste vara medveten om. Ange inte värden i namnet! Jag skall försöka förklara.
Om du har en lista med resultatvärden från veckans verksamhet och vill presentera dessa i JSON så kan det vara lätt att välja ett format som här nedan:
Det som står ovan är fullständigt korrekt JSON, men för att hantera dessa data så behöver man leta efter fem olika namn. Tänk nu om det istället för veckodagar var dagens datum och årets försäljningar som skulle redovisas. Koden för att hantera och läsa dessa data skulle bli omfattande.
Ett bättre och i slutändan betydligt tydligare sätt att skriva det ovan angivna är så här:
Hakparentesen som omsluter allt talar om att här kommer en ”lista” och tittar vi närmare så ser vi att listan består av endast två ”objekt” att hålla reda på, nämligen ”Dag” och ”Resultat”. Det som i praktiken beskrivs ovan är en tabell med två kolumner och fem rader, medan det tidigare exemplet i bästa fall kan beskrivas som en tabell med fem kolumner och en rad.
Om man nu vill förklara vad det är för data så kan man lägga till information om detta också:
Vill man så går det sedan att göra en lista för alla veckoresultat, och så vidare.
Hur använder man då JSON i GeoJSON?
Jag går inte in på detaljer utan hänvisar då till GeoJSON.org, men lite principer…
GeoJSON kan beskriva ”geometrier”, ”geo-objekt” eller ”geo-objekt-samlingar”.
Geometrier kan vara exempelvis punkter, linjer eller ytor och för en punkt ser koden ut så här:
Om geometrin är av typen ”LineString” så utgörs koordinaterna av en lista, med en lista av koordinater. Förvirrande? Titta på bilden nedan och jämför med bilden ovan.
Lägg märke till de dubbla hakparenteserna som möjliggör listor i en lista. För ”Polygon” så skall listan med koordinater avslutas med samma koordinatpar som inledde, för att därmed ”stänga” polygonen.
Geo objekt består förutom av en geometri av andra egenskaper eller ”properties”, vilket är en objektsamling med namn-värdepar som beskriver de attribut som hör samman med objektet:
Det går att ha flera ”attribut” i värdet för ”properties”, dessa namn-värdepar skall bara separeras med ett komma.
Ofta så är det mer än ett objekt i ett geolager och då får man skapa en ”geo-objekt-samling”. Det är nu viktigt att man använder samma namn på de egenskaper som används (attributnamn/properties).
Analyserar man koden ovan så går det att se ett system. Det finns ett objekt (klammerparentes) av typen ”FeatureCollection” som i sin tur innehåller en lista med objekt. Dessa objekt är av typen punkt och har geometrier och egenskaper.
Jag hoppas att ni hängt med i resonemanget ovan och att förståelsen för JSON och GeoJSON ökat lite. För egen del så har jag lärt mig massor, men då detaljerna är nya för mig så kan det hända att jag missat något som kan vara av betydelse. En hjälp har varit att kunna testa alla kodexempel via en online-tjänst.
På JSONlint.com så kan man enkelt skriva in (eller klistra in en kopia av) koden och få den validerad.
Nu tror jag inte att jag kommer att skriva så hemskt mycket JSON eller GeoJSON kod manuellt, men att förstå hur saker och ting är uppbyggda och fungerar är en del av det som är spännande och intressant med teknik.
Om du vill så kan du nu använda QGIS för att spara ut ett valfritt vektorlager som GeoJSON. Öppna sedan lagret i en texteditor och se om du kan läsa och förstå det som står där. Kom ihåg att det jag tagit upp här inte är allt som går att göra med GeoJSON så det kan finnas med flera namn-värdepar (exempelvis CRC) i din kod. Dessutom så kan ordningen på olika saker variera, eftersom det inte är så viktigt i JSON då allt måste läsas in innan något kan presenteras.