Hoppa till innehåll
Meny
  • Hem
  • Dokument
  • Om Mig
Geosupportsystem

Beräkna i layouten

Publicerat den 2019-12-162019-12-13

Om du vill räkna, summera eller beräkna geografiska data i en layout baserat på kartans utsträckning, så är det inte helt självskrivet hur det går till.

Jodå, du kan presentera tabeller på ett ganska trevligt sätt där du även kan filtrera tabellen efter vad som är synligt i bilden, men om du exempelvis vill summera alla ytor av en viss typ som är synliga i bilden, då blir det värre.

Här har jag en mycket enkel layout med en bakgrundskarta från Lantmäteriet och ett vektorlager med vattenytor från OpenStreetMap. Jag skulle nu vilja att den sammanlagda ytan för alla vattenytor i kartan kunde visas i min layout.

Jag har redan använt ett uttryck för att lägga till storleken i hektar i etiketter för sjöarna.

round($area/10000,1)

Nu behöver jag bara hitta ett sätt att summera alla dessa uttryck…

Lösningen är att ”aggregera” en beräkning av sjöarnas ytor.

aggregate(layer,aggregate,expression[,filter][,concatenator][,order_by])

För att välja ut endast synliga objekt i lagret (layer:=’lakes’) och summera (aggregate:=’sum’) dessa ytor (expression:=$area), så skapar man ett passande filter där man använder kartans utsträckning och lagret med sjöar i ett lämpligt uttryck. I det här fallet så använder jag intersects då jag vill inkludera alla sjöar som över huvud taget skymtar i bilden.

Kartans utsträckning får jag genom att hämta värdet för utsträckningen från ett layoutobjekt med ett specifikt namn, i det här fallet min karta. Jag måste således döpa mitt kartelement till något lämpligt. Här sätter jag ”Item ID” till ’karta’.

Sedan kan jag skapa mitt fullständiga uttryck och bygga in det i en etikett.

format_number(
 aggregate(
  'lakes',
  'sum', 
  $area,
  intersects(
    map_get(item_variables('karta'), 'map_extent'), 
    $geometry)
 )/10000
,0)

Funktionen format_number() snyggar till summan innan den skrivs ut.

När kartan panoreras så är det inte säkert att summeringen uppdateras omedelbart, men ett klick på ”uppdatera” knappen löser det. Vid export eller utskrift så uppdateras kartan automatiskt.

Det finns ganska många olika former för aggregeringen och ”sum” är bara en möjlighet. Det går att räkna antal, ta fram största värdet eller helt enkelt slå samman strängar, m.m. Om man inte vill ha ytor på sjöar som ligger lite utanför kartans gräns, så får man modifiera uttrycket något. Om man exempelvis bara önskar sjöar som ryms helt innanför layouten så använder man contains i stället för intersects.

Vill man även filtrera på ett attribut i lagret så går det också. Jag kan exempelvis välja att bara ta med sjöar som är av typen water. Det gör jag genom att kombinera contains med ”fclass” = ’water’ genom operatorn AND.

"fclass"='water' AND contains(map_get(item_variables('karta'),'map_extent'),$geometry)

Vill jag bara ha med den yta som visas i kartan och inte ta hänsyn till om en sjö sträcker sig över kanten, så går det också. Byt bara expression:=$area till

area(intersection($geometry,map_get(item_variables('karta'), 'map_extent')))

Funktionen intersection() returnerar den del som är gemensam för två geometrier. Denna kör man sedan genom area() funktionen för att få arean på samma sätt som tidigare. Tänk på att om du använder contains() som filter, då kommer intersection-uttrycket ovan att vara helt onödigt. Det bör därför framför allt användas tillsammans med tidigare intersects().

I kartan ovan så har jag lagt till en ”filtrerad” tabell med synliga sjöars kompletta yta, sorterad i storleksordning, men den samanlagda vattenytan i kartbilden beräknas endast för de delar av ytorna som syns i kartan. Uttrycket för beräkningen ser du nedan.

format_number(
 aggregate(
  'lakes',
  'sum', 
  area(intersection($geometry,map_get(item_variables('karta'), 'map_extent'))),
  "fclass"='water' AND intersects(
    map_get(item_variables('karta'), 'map_extent'), 
    $geometry)
 )/10000
,0)

Lämna ett svar Avbryt svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Translate with Google

GBR In English
GER Auf Deutch
FRA En Français
ESP En Español
Swedish is a hard language for a machine to translate. Nuance and detail will likely be lost.
     Mastodon  

Bok om QGIS på Svenska

Bok

Beställ Boken/E-bok genom att klicka på bilden (även förhandsgranskning).

Senaste kommentarer

  • Daniel Nilsson om QField
  • denis Empisse om SpaceMouse Python
  • klakar om SpaceMouse Python
  • Anders Jackson om Återbesök, WebODM
  • Anders Jackson om SpaceMouse Python

Arkiv

Meta

  • Logga in
  • Flöde för inlägg
  • Flöde för kommentarer
  • WordPress.org
©2025 Geosupportsystem | WordPress-tema av Superbthemes.com