Tag Archive | GeoJSON

Öppna data Helsingborg

Vid årsskiftet släppte Helsingborg sin baskarta som öppna data. I detta inlägg tittar jag närmare på vad dessa innehåller, hur de distribueras och vad man kan göra med dem. Det var i alla fall intentionen när jag började…

Läs mer…

Annonser

Vektorformat, vilket är ”bäst”

Detta blir inte en fullständig undersökning, utan en ganska ytlig granskning av några vanliga format och deras karaktär, egenskaper och prestanda.

Läs mer…

JSON och GeoJSON

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. Läs mer…

TopoJSON, vad är det?

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?

Skärmbild från 2014-04-30 14:44:14

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.

Skärmbild från 2014-04-30 14:53:05

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.

Sluta cirkeln

I två tidigare inlägg i veckan har jag använt PHP för att ladda upp bilder till en server och Javaskript för att visa var bilderna är tagna på en karta. I PHP har även positionsdata skrivits till en PostGIS databas.

Nu tänkte jag ta PostGIS data och lägga på detta som ett lager i kartan som används i steg ett…

Ett sätt är att använda QGIS Server och helt enkelt lägga till ett WMS lager i javaskriptet som visar dessa data i kartan. Det blir dock med Leaflet bara ett lager där bildpunkterna visas med en symbol:

Skärmbild från 2014-02-02 16:23:28

L.TileLayer.WMS("http://192.168.0.25/cgi-bin/qgis_mapserv.fcgi?VERSION=1.3.0&map=/qgis/foton.qgs", {
    layers: 'foton',
    format: 'image/png',
    transparent: true,
    minZoom: 7
}).addTo(map);

Koden ovan måste som tidigare anpassas till de rådande förutsättningarna och mer detaljer hur man skapar kartlager från QGIS Server finns i boken om att skapa en egen server för geodatatjänster.

Det går att använda GetFeatureInfo och ett AJAX-anrop för att hämta WMS data när man klickar på ett objekt, men det är lite omständligt.

Ett annat sätt är att lägga till lagret i Geoserver och skicka tillbaka det som ett GeoJson-lager.

…vilket säkert inte är så svårt, men det får nog vänta till nästa vecka, för nu har jag kört fast.

Vektordata, men inte lokalt

I detta inlägg så tänkte jag visa att det går utmärkt att öppna vektordata som finns att hämta via URL på Internet. En del GIS program kräver ”riktiga” sökvägar till filerna och är då begränsade till OGC tjänster som WMS och WFS för att hämta exempelvis data i nära realtid. Men om man vill använda vektordata och symbolsätta i ett eget GIS-projekt och det inte finns någon WFS tjänst så har man problem.

För att exemplifiera så använder jag jordbävningsdata från US Geological Survey (USGS). På deras hemsida kan man bland annat hämta automatgenererade data i olika format och det som jag valt för detta exempel är GeoJson. http://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php

På denna sida så tar jag och kopierar länken (högerklicka och ”kopiera länkadress”) till den senaste timmens alla jordskalv (länk).

Skärmbild från 2014-01-26 18:50:26

I QGIS så klickar jag på ”lägg till vektorlager” och klistrar in länken (bilden ovan). När jag sedan öppnar så kommer data att läggas till i QGIS, och om jag lägger till en världskarta i bakgrunden så blir det ganska tydligt var jordbävningarna ägt rum.

Skärmbild från 2014-01-26 18:54:15

Just när jag gjorde detta så fanns det bara jordbävningar längs USA:s västkust, men det kan snabbt ändras. Testa att panorera lite då och då eller klicka på uppdatera.

För att symbolsätta så öppnar jag tabellen och hittar genast några kolumner som är mer intressanta, i alla fall för mig.

  • mag
  • url
  • alert
  • title

Det går att ta med flera senare men dessa räcker till att börja med för att skapa lämpliga symboler. För det första skapar jag en enkel rund symbol kategoriserad efter attributet ”alert”. Just nu finns det bara redovisat jordbävningar utan värde i denna kolumn, men det går att lösa genom att lägga till dessa manuellt. Läser man lite på USGS hemsida så hittar man vad attributet betyder och vilka värden som förekommer.

Skärmbild från 2014-01-26 18:45:17

Det är således inte bara ”stora” skalv som hamnar här, men mer om det senare. Jag lägger till fyra klasser och ger dem värdena ”green”, ”yellow”, ”orange” och ”red”. Jag har tagit reda på att det är små bokstäver som gäller, men jag använder vanlig skrivning i etiketten.

Skärmbild från 2014-01-26 19:06:01

För att även visualisera magnituden så klickar jag på ”Avancerad” och väljer ”mag” som fält för ”storleksskalering” (bra ord…). Jag väljer även att ”skalera” diametern och inte arean. Nu kommer jordbävningar av magnitud 1 att bli så stora som jag angett i symbolen och jordbävningar magnitud 8, åtta gånger större.

Jag vill även ha med etiketter för de punkter som klassats med ”alert” enligt tidigare, så jag väljer att textsätta lagret med ett uttryck:

CASE WHEN "alert" <>'' THEN "title" END

Jag placerar även etiketten direkt på punkten och fixar lite med stilen så det ser snyggt ut. Sedan lägger jag till ett ”öppna” kommando för länkarna i url-attributet, så att det går att klicka på jordbävningar med knappen ”objektkommando” och öppna en kopplad hemsida.

Skärmbild från 2014-01-26 19:17:57

Avslutningsvis så sparar jag stilen i QGIS format, så jag kan återanvända den lite senare.

Eftersom det inte finns något siginifikant i mina data så hämtar jag och lägger till länken till ”Significant Earthquakes” de senaste 30 dagarna (länk).

När lagret är på plats så ”läser jag in” den sparade stilen och testar.

Jordbävningar 20140126

Sådär, då har jag ett QGIS projekt som bara väntar på en ordentlig jordbävning så att jag enkelt kan visa var och hur omfattande för alla i min närhet.

Nää, jag skojar bara. Jag hoppas jag aldrig behöver just denna karta, men kunskapen tar jag med mig till nya experiment.

Visualisera mera!

Då var det dags för det första gästinlägget på bloggen. Det är Kristian Bergstrand (GIS-ingenjör inom Helsingborgs stad) som skrivit det och det handlar om statistik, QGIS och visualisering genom webbtjänster. Med andra ord precis sådant som brukar avhandlas på dessa sidor. Jag ser själv fram emot att testa det som beskrivs. Kristian har nu öppnat dörren för fler gästinlägg och har du en idé så skriv ned din text, infoga länkar till eventuella bilder och andra sidor. Du kan använda kursiv och fet text och om du vill ha ytterligare formatteringar så beskriver du det i texten också. Maila underlaget till mig så hör jag av mig. Nu över till gästinlägget…

Som inbiten kalenderbitare är det förstås julafton de gånger Statistiska centralbyrån (SCB) släpper färsk och spännande statistik. Häromdagen publicerade SCB uppgifter kring hushållen i Sverige – intressant läsning! Vill en fördjupa sig och få fatt i kommunvis statistik, går det att ladda hem detta som t.ex. kalkylblad eller csv-filer. I längden är dock stora textfiler med statistik tröttande och svåra att överblicka – så varför inte använda en webbaserad kartlösning som informationsbärare!?

Som nämndes ovan går det att ladda hem en uppsjö av olika dataset kring hushållen i Sverige (botanisera själva här: LÄNK). Här valdes dock en avgränsning till data över andel singelhushåll av totala antalet hushåll, per kommun, och jag laddade hem datan som csv-fil (jfr bild nedan). Filen bearbetade jag därefter något i OpenOffice (http://www.openoffice.org); i huvudsak bildade jag två kolumner för kommun respektive kommunkod istället för en sammanslagen kolumn.

I nästa steg laddade jag hem geometrin för Sveriges kommuner som shape-fil (t.ex. tillgängligt här: ArcGIS.com). I QGIS öppnade jag shapefilen (add vector layer) och statistikdatan (add delimited text layer). Därefter slog jag samman datan från SCB (utan geometri) med shapefilen (med geometrin), genom att högerklicka på shapefilen, välja properties, välja join och slutligen välja vilka attribut som ska användas för sammanslagningen (jfr bild nedan). Innan jag stänger QGIS sparar jag mitt lager som geoJSON, för att enkelt kunna konsumera det i den kartapplikation jag ska skapa härnäst.

Kartapplikationen blir leaflet (leafletjs.com), som är ett snabbt, flexibelt och bra dokumenterat javascript-bibliotek för webbkartor. Jag har redan mitt förgrundsskikt klart (i form av geoJSON-lagret ovan) och kan ägna mig åt bakgrundskartan. Jag vill ha en bakgrundskarta som är diskret, gråskalad och sober vilket framhäver förgrundsskiktet bättre. Genom ett kostnadsfritt konto på MapBox (mapbox.com), ges tillgång till en rad avancerade designverktyg för att skapa en unik bakgrundskarta som bygger på OpenStreetMap (osm.org). När jag känner mig nöjd (se bild nedan), nyttjar jag deras hosting av bakgrundslagret, som jag sedan kan konsumera i min kartapplikation.

Återstår att sy samman allt med html och javascript, där jag får en hel del gratis genom exempel på webbplatsen för leaflet. Bland annat använder jag ColorBrewer, för att tematisera mitt förgrundslager.

Sammanfattningsvis skapades en interaktiv webbkarta (http://kartor.helsingborg.se/hushall) med hjälp av kommunvisa data från SCB, kommunytor från SCB samt några fritt tillgängliga verktyg för geografisk IT. Webbkartan visualiserar andelen singelhushåll i respektive kommun i Sverige. Nästa steg – för mig eller någon annan – är att skapa mer tillgänglig information utifrån öppna data och program!