Viktigt

Översättning är en gemenskapsinsats du kan gå med i. Den här sidan är för närvarande översatt till 100.00%.

9.1. Uttryck

Baserat på lagerdata och förbyggda eller användardefinierade funktioner erbjuder Expressions ett kraftfullt sätt att manipulera attributvärde, geometri och variabler för att dynamiskt ändra geometristilen, etikettens innehåll eller position, värdet för diagram, höjden på ett layoutobjekt, välja vissa funktioner, skapa virtuella fält, …

Observera

En lista över standardfunktioner och variabler för att skriva uttryck finns på Lista över funktioner, med detaljerad information och exempel.

9.1.1. Strängbyggaren Expression

Huvuddialog för att bygga uttryck, Expression string builder är tillgänglig från många delar i QGIS och, kan särskilt nås när:

Dialogen Expression builder ger tillgång till:

9.1.1.1. Gränssnittet

Fliken Expression är det huvudsakliga gränssnittet för att skriva uttryck med funktioner, lagerfält och värden. Den innehåller följande widgetar:

../../../_images/function_list.png

Fig. 9.1 Fliken Uttryck

  • En uttrycksredigeringsyta för att skriva in eller klistra in uttryck. Autokomplettering finns tillgänglig för att snabba upp skrivandet av uttryck:

    • Motsvarande variabler, funktionsnamn och fältnamn till inmatningstexten visas nedan: använd pilarna Upp och Ned för att bläddra bland objekten och tryck på Tab för att infoga i uttrycket eller klicka helt enkelt på önskat objekt.

    • Funktionsparametrarna visas när du fyller i dem.

    QGIS kontrollerar också att uttrycket är korrekt och markerar alla fel som används:

    • Understrykning: för okända funktioner, felaktiga eller ogiltiga argument;

    • Marker: för alla andra fel (t.ex. saknad parentes, oväntat tecken) på en och samma plats.

    Tips

    Dokumentera ditt uttryck med kommentarer

    När du använder komplexa uttryck är det bra att lägga till text antingen som en kommentar på flera rader eller som en kommentar i raden för att hjälpa dig att komma ihåg.

    /*
    Labels each region with its highest (in altitude) airport(s)
    and altitude, eg 'AMBLER : 264m' for the 'Northwest Artic' region
    */
    with_variable(
      'airport_alti', -- stores the highest altitude of the region
      aggregate(
        'airports',
        'max',
        "ELEV", -- the field containing the altitude
        -- and limit the airports to the region they are within
        filter := within( @geometry, geometry( @parent ) )
      ),
        aggregate( -- finds airports at the same altitude in the region
          'airports',
          'concatenate',
          "NAME",
          filter := within( @geometry, geometry( @parent ) )
            and "ELEV" = @airport_alti
        )
        || ' : ' || @airport_alti || 'm'
        -- using || allows regions without airports to be skipped
    )
    
  • Utöver uttrycksredigeraren finns det en uppsättning verktyg som hjälper dig:

  • Under uttrycksredaktören hittar du:

    • En uppsättning grundläggande operatorer som hjälper dig att bygga upp uttrycket

    • En indikation på det förväntade formatet för utdata när du datadefinierar egenskaper

    • En live Output preview av uttrycket (upp till 60 tecken), som utvärderas på den första funktionen i lagret som standard. Om du vill visa förhandsgranskningstext på mer än 60 tecken kan du hålla markören över texten för att visa ett popup-fönster med verktygstips som innehåller hela förhandsgranskningen av utdata. Om du vill kopiera förhandsgranskningstexten till urklipp högerklickar du på förhandsgranskningstexten och väljer editCopy Copy Expression Value.

      Du kan bläddra bland och utvärdera andra funktioner i skiktet med hjälp av kombinationsrutan Feature (värdena hämtas från skiktets egenskap display name).

      Om det finns ett fel anges det och du kan komma åt detaljerna via den angivna hyperlänken.

  • En funktionsväljare visar listan över funktioner, variabler, fält … organiserade i grupper. En sökruta finns tillgänglig för att filtrera listan och snabbt hitta en viss funktion eller ett visst fält. Genom att dubbelklicka på ett objekt läggs det till i uttrycksredigeraren.

  • En hjälppanel visar hjälp för varje valt objekt i funktionsväljaren.

    Tips

    Tryck på Ctrl+Click när du håller muspekaren över ett funktionsnamn i ett uttryck för att automatiskt visa dess hjälp i dialogrutan.

    En widget med fältvärden som visas när ett fält väljs i funktionsväljaren hjälper till att hämta funktionsattribut:

    • Leta efter ett visst fältvärde

    • Visar listan med värdena All Unique eller 10 Samples. Finns även tillgänglig via högerklick.

      När fältet är mappat med ett annat lager eller en uppsättning värden, dvs. om field widget är av typen RelationReference, ValueRelation eller ValueMap, är det möjligt att lista alla värden i det mappade fältet (från det refererade lagret, tabellen eller listan). Dessutom kan du filtrera listan till checkbox :guilabel:``Visa endast värden som används` i det aktuella fältet.

    Om du dubbelklickar på ett fältvärde i widgeten läggs det till i uttrycksredigeraren.

    Tips

    Den högra panelen, som visar hjälp med funktioner eller fältvärden, kan kollapsas (osynliggöras) i dialogrutan. Tryck på knappen Show Values eller Show Help för att få tillbaka den.

9.1.1.2. Skriva ett uttryck

QGIS-uttryck används för att välja funktioner eller ställa in värden. Att skriva ett uttryck i QGIS följer vissa regler:

  1. Dialogen definierar sammanhanget: om du är van vid SQL känner du säkert till frågor av typen select features from layer where condition eller update layer set field = new_value where condition. Ett QGIS-uttryck behöver också all denna information, men det verktyg som du använder för att öppna dialogen för att skapa ett uttryck tillhandahåller delar av dem. Till exempel kan du ange ett skikt (buildings) med ett fält (height):

    • om du trycker på verktyget expressionSelect:sup:Select by expression betyder det att du vill ”välja egenskaper från byggnader”. villkoret är den enda information som du behöver ange i widgeten för uttryckstext, t.ex. skriv "höjd" > 20 för att välja byggnader som är högre än 20.

    • med detta val gjort, tryck på knappen calculateField Field calculator och välj ”height” som Update existing field, du ger redan kommandot ”update buildings set height = ??? where height > 20”. Det enda som återstår att ange i det här fallet är det nya värdet, t.ex. ange bara 50 i textrutan för uttrycksredigeraren för att ställa in höjden på de tidigare valda byggnaderna.

  2. Var uppmärksam på citattecken: enkla citattecken returnerar en bokstav, så en text som placeras mellan enkla citattecken ('145') tolkas som en sträng. Dubbla citattecken ger dig värdet på den texten, så använd dem för fält ("myfield"). Fält kan också användas utan citationstecken (myfield). Inga citationstecken för siffror (3.16).

    Observera

    Funktioner tar normalt som argument en sträng för fältnamn. Gör:

    attribute( @atlas_feature, 'height' ) -- returns the value stored in the "height" attribute of the current atlas feature
    

    Och inte:

    attribute( @atlas_feature, "height" ) -- fetches the value of the attribute named "height" (e.g. 100), and use that value as a field
                                          -- from which to return the atlas feature value. Probably wrong as a field named "100" may not exist.
    

Tips

Använd namngivna parametrar för att underlätta läsning av uttryck

Vissa funktioner kräver att många parametrar ställs in. Uttrycksmotorn stöder användning av namngivna parametrar. Detta innebär att istället för att skriva det kryptiska uttrycket clamp( 1, 2, 9), kan du använda clamp( min:=1, value:=2, max:=9). Detta gör det också möjligt att byta ut argument, t.ex. clamp( value:=2, max:=9, min:=1). Att använda namngivna parametrar hjälper till att klargöra vad argumenten för en uttrycksfunktion hänvisar till, vilket är till hjälp när du försöker tolka ett uttryck senare!

9.1.1.3. Några användningsfall för uttryck

  • Beräkna ett ”pop_density”-fält i fältkalkylatorn med hjälp av de befintliga fälten ”total_pop” och ”area_km2”:

    "total_pop" / "area_km2"
    
  • Märk eller kategorisera funktioner baserat på deras område:

    CASE WHEN $area > 10 000 THEN 'Larger' ELSE 'Smaller' END
    
  • Uppdatera fältet ”density_level” med kategorier enligt värdena för ”pop_density”:

    CASE WHEN "pop_density" < 50 THEN 'Low population density'
         WHEN "pop_density" >= 50 and "pop_density" < 150 THEN 'Medium population density'
         WHEN "pop_density" >= 150 THEN 'High population density'
    END
    
  • Använd en kategoriserad stil för alla funktioner beroende på om deras genomsnittliga huspris är lägre eller högre än 10000 € per kvadratmeter:

    "price_m2" > 10000
    
  • Med hjälp av verktyget ”Select By Expression…” väljer du alla funktioner som representerar områden med ”hög befolkningstäthet” och vars genomsnittliga huspris är högre än 10000 € per kvadratmeter:

    "density_level" = 'High population density' and "price_m2" > 10000
    

    Det föregående uttrycket kan också användas för att definiera vilka funktioner som ska märkas ut eller visas på kartan.

  • Välj funktioner som överlappar en naturlig zon från skiktet ”lands”:

    overlay_intersects( layer:='lands', filter:="zone_type"='Natural' )
    
  • Räkna för varje funktion antalet byggnader som de innehåller:

    array_length( overlay_contains( layer:='buildings', expression:=@id ) )
    
  • Skapa en annan symbol (typ) för lagret med hjälp av geometrigeneratorn:

    point_on_surface( @geometry )
    
  • Givet en punktfunktion, generera en sluten linje (med make_line) runt dess geometri:

    make_line(
      -- using an array of points placed around the original
      array_foreach(
        -- list of angles for placing the projected points (every 90°)
        array:=generate_series( 0, 360, 90 ),
        -- translate the point 20 units in the given direction (angle)
        expression:=project( @geometry, distance:=20, azimuth:=radians( @element ) )
      )
    )
    
  • I en etikett för utskriftslayout visas namnet på de ”flygplatser” som finns inom layoutens ”Karta 1”-objekt:

    with_variable( 'extent',
                   map_get( item_variables( 'Map 1' ), 'map_extent' ),
                   aggregate( 'airports', 'concatenate', "NAME",
                              intersects( @geometry, @extent ), ' ,'
                            )
                 )
    

9.1.1.4. Spara uttryck

Med hjälp av knappen fileSave Lägg till aktuellt uttryck i användaruttryck ovanför uttrycksredigerarens ram kan du spara viktiga uttryck som du vill ha snabb åtkomst till. Dessa finns tillgängliga i gruppen Användaruttryck i mittpanelen. De sparas under :ref:``användarprofil <user_profiles>` (<userprofile>/QGIS/QGIS3.ini-filen) och finns tillgängliga i alla uttrycksdialoger i alla projekt i den aktuella användarprofilen.

En uppsättning verktyg som finns tillgängliga ovanför uttrycksredigeringsramen hjälper dig att hantera användaruttrycken:

  • fileSaveLägg till det aktuella uttrycket i användaruttryck: lagrar uttrycket i användarprofilen. En etikett och en hjälptext kan läggas till för enkel identifiering.

  • symbologyEdit Redigera valt uttryck från användaruttryck, samt deras hjälp och etikett

  • deleteSelected Ta bort valt uttryck från användaruttryck

  • sharingImport :sup:Importera användaruttryck från en .json-fil till den aktiva användarprofilmappen

  • sharingExport :sup:Exportera användaruttryck som en .json-fil; alla användaruttryck i användarprofilen QGIS3.ini`-filen delas

9.1.2. Funktion Redaktör

Med fliken Function Editor kan du skriva dina egna funktioner på Python-språket. Detta är ett praktiskt och bekvämt sätt att tillgodose särskilda behov som inte täcks av de fördefinierade funktionerna.

../../../_images/function_editor.png

Fig. 9.2 Fliken Funktionsredigerare

För att skapa en ny funktion:

  1. Tryck på knappen symbologyAdd New File.

  2. Välj var den nya funktionen ska lagras. Du kan välja att spara den antingen i en Function file eller i Project functions.

    • Om du väljer Funktionsfil måste du ange ett namn för Python-filen .py, som baseras på en QGIS-mallfil och lagras i mappen /python/expressions under den aktiva katalogen användarprofil, och därmed är tillgänglig för alla projekt som du kan öppna med den profilen.

      Anpassade Python-funktioner som lagras som funktionsfiler laddas automatiskt när du startar ett nytt projekt under användarprofilen. Tänk på att om du vill dela sådana Python-funktioner måste du dela filen .py i mappen /python/expressions.

    • Om du väljer Project functions lagras den nya funktionen i projektfilen och är endast tillgänglig för det projektet.

      Anpassade Python-funktioner som lagras som projektfunktioner kan enkelt delas genom att dela projektfilen där de sparades. När ett projekt med projektfunktioner öppnas kan QGIS läsa in eller ignorera dem beroende på om inbäddad Python-kod är aktiverad.

    Ett nytt objekt har lagts till i den vänstra panelen på fliken Function Editor.

  3. I den högra panelen visas innehållet i filen: en pythonskriptmall.

  4. Avkommentera kodblocket och börja redigera det enligt dina behov. Du kan förlita dig på autokomplettering av kod, kodformatering och skrivhjälpmedel, enligt definitionen i Python-inställningar.

    I widgeten Help hittar du allmän information om hur du ställer in dekoratorn @qgsfunction.

  5. Tryck på knappen start Save and Load Functions. Den funktion du skrev läggs till i funktionsträdet på fliken Expression, som standard under gruppen Custom.

  6. Njut av din nya funktion.

  7. Om funktionen behöver förbättras, aktivera fliken Function Editor, gör ändringarna och tryck igen på knappen start Save and Load Functions för att göra dem tillgängliga i filen och därmed i alla uttrycksflikar.

Ta bort en anpassad funktion:

  1. Aktivera fliken Funktionsredigerare

  2. Välj funktion i listan

  3. Tryck på symbologyRemove Ta bort vald funktion. Funktionen tas bort från listan och, beroende på lagring, raderas motsvarande .py-fil från användarprofilmappen eller Python-funktionerna tas bort från projektfilen.

Observera

När en projektfil med projektfunktioner stängs av, avlastas motsvarande projektfunktioner och är inte längre tillgängliga i QGIS-sessionen.

Exempel

Här är ett kort exempel på hur du skapar din egen funktion my_sum som fungerar med två värden.

from qgis.core import *
from qgis.gui import *

@qgsfunction(group='Custom', referenced_columns=[])
def my_sum(value1, value2):
    """
    Calculates the sum of the two parameters value1 and value2.
    <h2>Example usage:</h2>
    <ul>
      <li>my_sum(5, 8) -> 13</li>
      <li>my_sum("field1", "field2") -> 42</li>
    </ul>
    """
    return value1 + value2

Dekoratorn @qgsfunction accepterar följande argument:

  • Argumentet group anger i vilken grupp funktionen ska listas i dialogen Expression.

  • använder geometri: Sätt detta till True om uttrycket kräver tillgång till funktionens geometri. Som standard False.

  • handlesnull: Sätt detta till True om uttrycket har anpassad hantering för NULL-värden. Om False (standard), kommer resultatet alltid att vara NULL så snart någon parameter är NULL.

  • referenced_columns: En matris med attributnamn som krävs för att köra funktionen. Standard är [QgsFeatureRequest.ALL_ATTRIBUTES]. Om du anger en delmängd av fält eller en tom lista blir körningen snabbare.

  • params_as_list: Sätt detta till True för att skicka funktionsparametrarna som en lista. Om False (standard) kommer funktionen att ta emot parametrarna som enskilda argument.

Själva funktionen tar emot det antal och den typ av parametrar som du vill skicka till din funktion. Dessa bör ställas in före följande valfria argument:

  • feature: den aktuella funktionen

  • parent: objektet QgsExpression

  • context: Om det finns ett argument som heter context på den sista positionen, kommer denna variabel att innehålla ett QgsExpressionContext-objekt, som ger tillgång till diverse ytterligare information som t.ex. uttrycksvariabler. T.ex. context.variable( 'layer_id' )

Om dessa argument finns i funktionssignaturen skickas de automatiskt till funktionen, utan att de behöver anges i uttrycket.

Funktionen i föregående exempel kan sedan användas i uttryck:

../../../_images/customFunction.png

Fig. 9.3 Anpassad funktion tillagd på fliken Expression

Du hittar fler exempel och ytterligare argument för anpassade funktioner på qgsfunction. Mer information om hur du skapar Python-kod finns i PyQGIS-utvecklarens kokbok.