Lek med geometrigeneratorn

Jag satt och kikade på ”kartogram” i en bok, där man förvränger formen på geometrier för att representera exempelvis befolkningstäthet. Att gå hela vägen med detta är lite väl överkurs för mig, men det borde gå att använda geometrigeneratorn för att skapa geometrier som representerar såväl positioner som värden i attribut.

Kartogram på Wikipedia: https://en.wikipedia.org/wiki/Cartogram

När jag testar använder jag Sveriges kommuner som exempel. Då jag inte har något bra lager med exempelvis befolkning så använder jag ytan ($area), men det går att använda vilken datakälla som helst.

Det första blir att definiera ett nytt centrum för varje polygon.

Det kan göras med centroid() eller pole_of_inaccessability().

Skärmklipp från 2018-09-28 15:36:38.png

Det är marginell skillnad på dessa i det här fallet och centroid är lite enklare att använda så jag väljer den.

Jag skulle kunna använda ”buffer” för att skapa en cirkel där ”värdet” används för radien, men jag vill använda mer komplexa former längre fram så jag börjar med att testa make_circle().

Skärmklipp från 2018-09-28 15:41:07.png

När jag kör med $area som variabel för cirkelradien (make_circle(centroid($geometry),$area/10000000)) så blir det uppenbart att jag har lite för stora variationer i mitt värde. Jag skalar i stället om värdet exponentiellt och leker lite med variablerna för att hitta något som ser ok ut.

make_circle(
  centroid($geometry),
  scale_exp($area/200000000,0,105,5000,40000,1)
)

Nästa test blir att skapa fyrkanter i stället för cirklar. Dessa måste byggas upp punkt för punkt till en linje, som i sin tur blir en polygon. Med värdet för radie ovan kan detta göras med en skapligt enkel funktion i uttrycksbyggaren.

with_variable(
 'r', 
 scale_exp($area/200000000,0,105,5000,40000,1),
 make_polygon(
  make_line(
   make_point(x($geometry)-@r,y($geometry)-@r),
   make_point(x($geometry)+@r,y($geometry)-@r),
   make_point(x($geometry)+@r,y($geometry)+@r),
   make_point(x($geometry)-@r,y($geometry)+@r)
  )
 )
)

Kvadratens fyra punkter skapas med utgångspunkt i centroidens x och y. För varje punkt ändras sedan x och y på olika sätt med det definierade värdet för @r.

Funktionen with_variable() är nog en av mina nya favoriter i uttrycksbyggaren.

Skärmklipp från 2018-09-28 16:03:01.png

Om jag inte är nöjd med resultatet så behöver jag inte ändra inställningarna för varje skapad punkt i fyrkanten, utan det räcker att ändra det beräknade värdet för variabeln.

Har jag nu ett fältvärde jag vill använda som bas för storleken på mina kvadrater så kan jag använda samma geometrigenerator och bara ändra definitionen av variabeln. Det skulle kunna vara ”BEFOLKNING”, ”Invånare_per_km2” eller vad som helst egentligen. Så länge resultatet blir ett lagom stort längdmått för halva kvadratens sida.

Om man plockar fram ett rutat papper och funderar lite så kan man säkert bygga upp mer komplicerade geometrier än såhär också. Varför inte en stjärna, hexagon, diamant…

 

Annonser

Taggar:,

2 responses to “Lek med geometrigeneratorn”

  1. Mats Elfström says :

    Klas, SCB har mycket fri tabelldata du kan använda, och till och med befolkningsfördelning på kilometerrutor som öppna data. http://www.scb.se/hitta-statistik/regional-statistik-och-kartor/geodata/oppna-geodata/total-befolkning-per-ruta/

  2. Svante Carlsson says :

    Jag gillar också det tematiska här, men skulle behöva hjälp med att komma loss ifrån ”gärdesgårdsserien” i samband med de inledande geometriska delarna som rör centroider av enkla polygoner (i 2D) som t ex dessa kommungränser.
    Sveriges landområden (eller län, landskap, socknar, kyrkostift etc) som inte är sjöar och framförallt inte hav finns väl digitaliserade som geodata i såväl raster som vektorformat, t ex Lm:s topografiska karta. Jag skulle behöva se metoden (QGIS standardfunktioner?) som kombinerar (via klippteknik?) som här kommungränser med landmassorna så att vi får illustrera den geografiska ”sverigekartan” med ett varierande antal polygonobjekt som tillhör samma kommun istället för bara en polygon per kommun (eller vilken administrativ kategori man vill använda). Rörigt? Jag kör någon kvasi-sql här… Resultatet i det här exemplet för dagen är att vi får en geometrisk sverigekarta, med grafik avseende kommuntillhörighet och att centroiderna (mittpunkterna eller snarare tyngdpunkterna) i som här i ett plan (2D) tar hänsyn till den landmassa denna befolkning lever och bor på (inte många lever och bor i själva vattnet).
    Vill man lägga in höjddata (3D) får man förstås ytterligare en ny centroid för en kommun eller vilken polygon man utgår ifrån. Kör man hela Sverige kommer Sveriges mittpunkt utifrån Lantmäteriets data och QGIS att bli ännu en snackis – d v s förstås den ”bästa” mittpunkten…

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut /  Ändra )

Google+-foto

Du kommenterar med ditt Google+-konto. Logga ut /  Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut /  Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut /  Ändra )

Ansluter till %s

%d bloggare gillar detta: