Svarbu

Vertimas yra bendruomenės pastangos, prie kurių jūs galite prisijungti. Šis puslapis šiuo metu išverstas 100.00%.

9.1. Išraiškos

Priklausomai nuo sluoksnio duomenų ir standartinių ar naudotojo sukurtų funkcijų, Išraiškos siūlo galingą būdą manipuliuoti atributų reikšmėmis, geometrijomis ir kintamaisiais, siekiant dinamiškai geisti geometrijų stilių, užrašų turinį ar vietą, diagramų reikšmes, išdėstymo elementų aukštį, parinkti kai kuriuos geoobjektus, kurti virtualius laukus…

Pastaba

Numatytųjų funkcijų ir kintamųjų, skirtų išraiškų rašymui, sąrašą galima rasti Funkcijų sąrašas, kartu su detalia informacija ir pavyzdžiais.

9.1.1. Išraiškų teksto kūrėjas

Pagrindinis išraiškų kūrimo dialogas - Išraiškų teksto kūrėjas - pasiekiamas daugelyje QGIS dalių, pavyzdžiui, jį rasite, kai:

Išraiškų kūrimo dialogas teikia:

9.1.1.1. Naudotojo sąsaja

Kortelė Išraiška teikia pagrindinę sąsają, skirtą rašyti išraiškas naudojant funkcijas, sluoksnių laukus ir reikšmes. Joje yra šie valdikliai:

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

Fig. 9.1 Išraiškos kortelė

  • Išraiškos rašymo plotas, kuriame rašote ar įkeliate išraiškas. Išraiškų rašymo pagreitinimui galite naudoti automatinį užbaigimą:

    • atitinkamų kintamųjų, funkcijų pavadinimų ir laukų pavadinimų, žemiau esančiame lauke naudokite rodykles Aukštyn ir Žemyn, kad naršytumėte elementus ir spauskite Tab, kad įterptumėte išraišką arba tiesiog spauskite ant norimo elemento.

    • funkcijų parametrų, kurie rodomi juos pildant.

    QGIS taipogi tikrina išraiškų korektiškumą ir paryškina visas klaidas naudojant:

    • Pabraukimą: nežinomoms funkcijoms, neteisingiems ar netinkamiems argumentams;

    • Žymeklį: kiekvienai kitai klaidai (pvz. trūkstamiems skliausteliams, netikėtiems simboliams) vienoje vietoje.

    Patarimas

    Dokumentuokite savo išraišką komentarais

    Kai naudojate sudėtingą išraišką, gera praktika yra pridėti tekstą arba kaip kelių eilučių, arba kaip vidinį komentarą, padedanti jums atsiminti.

    /*
    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
    )
    
  • Virš išraiškų redaktoriaus rasite įrankius, kurie padės jums:

  • Po išraiškų redaktoriumi jūs raiste:

    • Aibę bazinių veiksmų, padedančių kurti išraiškas

    • Tikimosi išvesties formato indikatorių, kai jūs apibrėžiate nuo duomenų priklausančias geoobjektų savybes

    • Gyvą išraiškos Išvesties peržiūrą (iki 60 simbolių), pagal nutylėjimą įvertinta su pirmu sluoksnio geoobjektu. Jei norite pažiūrėti išvesties peržiūrą, kuri viršija 60 simbolių, galite užvesti pelę, kad pamatytumėte pilnos išvesties peržiūrą. Norėdami nukopijuoti išvesties peržiūrą į iškarpinę, spauskite ant peržiūros dešinį mygtuką ir parinkite editCopy Kopijuoti išraiškos reikšmę.

      Galite naršyti ir įvertinti kitus sluoksnio geoobjektus naudodami iškrentantį sąrašą Geoobjektas (reikšmės imamos iš sluoksnio savybės rodomas pavadinimas).

      Klaidos atveju ji parodoma ir jūs galite gauti daugiau informacijos naudodami pateikiamą nuorodą.

  • Funkcijų parinkiklis rodo sąrašą funkcijų, kintamųjų, laukų… sudėliotų į grupes. Yra paieškos laukelis, leidžiantis filtruoti sąrašą ir taip greitai rasti konkrečią funkciją ar lauką. Du kartus paspaudus elementą, jis pridedamas į išraiškų redaktorių.

  • Pagalbos skydelis rodo kiekvieno funkcijų parinkiklyje pažymėto elemento pagalbą.

    Patarimas

    Išraiškoje užvedę pelę virš funkcijos pavadinimo spauskite Ctrl+Paspaudimas, kad automatiškai parodytumėte dialoge jo pagalbą.

    Lauko reikšmių valdiklis, kuris rodomas funkcijų sąraše parinktus lauką, padeda ištraukti geoobjekto atributus:

    • ieškant konkrečios reikšmės

    • rodant sąrašą Visų unikalių ar 10 pavyzdinių reikšmių. Taipogi pasiekiama paspaudus dešinį pelės mygtuką.

      Kai laukas susietas su kitu sluoksniu ar aibe reikšmių, t.y. jei lauko valdiklio tipas yra RyšioNuoroda, ReikšmėsRyšys ar ReikšmiųRinkinys, galima išvardinti visas susijusio lauko reikšmes (iš susijusio sluoksnio, lentelės ar sąrašo). Be to, jūs galite filtruoti šį sąrašą checkbox Rodyti tik naudojamas reikšmes.

    Du kartus paspaudus lauko reikšmę valdiklyje ji bus pridėta į išraiškos redaktorių.

    Patarimas

    Dešinį skydelį, kuris rodo funkcijų pagalbą ar laukų reikšmes, galima sutraukti (paslėpti) dialoge. Spauskite mygtuką Rodyti reikšmes ar Rodyti pagalbą, kad jį grąžintumėte.

9.1.1.2. Išraiškos rašymas

QGIS išraiškos naudojamos parenkant geoobjektus ar nustatant reikšmes. Rašant QGIS išraišką laikomasi kelių taisyklių:

  1. Dialogas nustato kontekstą: jei jūs įpratę prie SQL, jūs tikriausiai žinote užklausas, tokias kaip select geoobjektai from sluoksnis where sąlyga ar update sluoksnis set laukas = nauja_reikšmė where sąlyga. QGIS išraiškai irgi reikia visos tokios informacijos, bet įrankis, kurį jūs naudojate išraiškų redaktoriaus atvėrimui, pateikia dalį jį. Pavyzdžiui, jei turite sluoksnį (pastatai) su lauku (aukštis) ir tada:

    • spaudžiate įrankį expressionSelectParinkti pagal išraišką, tai jūs norite atlikti „select geoobjektai from pastatai“. Ir sąlyga yra vienintelis dalykas, kurį jums reikia pateikti išraiškos tekstiniame valdiklyje, pvz. įrašykite "aukštis" > 20, kad parinktumėte pastatus, kurie yra aukštesni nei 20.

    • atlikus tokį parinkimą, paspaudus mygtuką calculateField Laukų skaičiuotuvas ir parinkus „aukštis“ kaip Keisti esamą lauką, jūs galite pateikti komandą „update pastatai set aukštis = ??? where aukštis > 20“. Jums belieka tik pateikti naują reikšmę, pavyzdžiui tiesiog įveskite 50 išraiškų redaktoriaus tekstiniame laukelyje, kad nustatytumėte prieš tai parinktų pastatų aukštį.

  2. Atkreipkite dėmesį į kabutes: viengubos kabutės grąžina tekstas, taigi tekstas tarp viengubų kabučių ('145') interpretuojamas eilutė. Dvigubos kabutės grąžina reikšmę, taigi naudokite jas laukams ("manolaukas"). Laukus taipogi galima naudoti be kabučių (manolaukas). Skaičiams kabučių nereikia (3.16).

    Pastaba

    Funkcijos paprastai kaip argumento laukia teksto ar lauko pavadinimo. Darykite taip:

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

    Nedarykite taip:

    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.
    

Patarimas

Naudokite parametrus su pavadinimais, kad palengvintumėte skaitymą

Kai kurioms funkcijoms reikia pateikti daug parametrų. Išraiškų variklis leidžia naudoti pavadintus parametrus. Tai reiškia, kad vietoje to, kad rašytumėte mistišką išraišką clamp( 1, 2, 9), galite naudoti clamp( min:=1, value:=2, max:=9). Tai taipogi leidžia sukeisti argumentus vietomis, pvz. clamp( value:=2, max:=9, min:=1). Pavadintų parametrų naudojimas padeda paaiškinti, ką nurodo vienos ar kitos reikšmės, o tai yra naudinga, kai bandote perskaityti išraišką vėliau!

9.1.1.3. Keli išraiškų naudojimo pavyzdžiai

  • Laukų skaičiuotuve paskaičiuokite lauko „pop_density“ reikšmę, naudojant esamus laukus „total_pop“ ir „area_km2“:

    "total_pop" / "area_km2"
    
  • Pažymėti arba kategorizuoti geoobjektus pagal jų plotą:

    CASE WHEN $area > 10 000 THEN 'Larger' ELSE 'Smaller' END
    
  • Pakeisti lauką „density_level“ kategorijomis pagal lauko „pop_density“ reikšmes:

    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
    
  • Pritaikyti kategorizuotą stilių visiems geoobjektams pagal tai, ar jų vidutinė būsto kaina yra mažesnė ar didesnė už 10000€ kvadratiniam metrui:

    "price_m2" > 10000
    
  • Naudojant įrankį „Parinkti pagal išraišką…“, parinkite visus geoobjektus, reprezentuojančius „Aukšto gyventojų skaičiaus tankumo“ plotus ir kurių vidutinė būsto kaina yra aukštesnė nei 10000€ už kvadratinį metrą:

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

    Ankstesnę išraišką taipogi galima naudoti norint apibrėžti, kuriuos geoobjektus pažymėti ar rodyti žemėlapyje.

  • Parinkti geoobjektus, kurie dengia „lands“ sluoksnio natūralią zoną:

    overlay_intersects( layer:='lands', filter:="zone_type"='Natural' )
    
  • Kiekvienam geoobjektui skaičiuoja, kiek juose yra pastatų:

    array_length( overlay_contains( layer:='buildings', expression:=@id ) )
    
  • Kuria sluoksniui skirtingo (tipo) simbolius, naudojant geometrijos generatorių:

    point_on_surface( @geometry )
    
  • Pateiktam taškiniam geoobjektui sukuria uždarą liniją (naudojant make_line) aplinkjo geometriją:

    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 ) )
      )
    )
    
  • Spausdinimo išdėstymo užraše rodyti „airports“ geoobjektų pavadinimą, kai jie yra išdėstymo elemento „Map 1“ viduje:

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

9.1.1.4. Išraiškų įrašymas

Naudodami virš išraiškų redaktoriaus esantį mygtuką fileSave Pridėti dabartinę išraišką į naudotojo išraiškas jūs galite įrašyti svarbias išraiškas, kurias norite greitai pasiekti. Jos bus pasiekiamos grupėje Naudotojo išraiškos skydelio viduryje. Jos įrašomos į naudotojo profilį (<userprofile>/QGIS/QGIS3.ini failas) ir jas galima naudoti visuose išraiškų dialoguose visuose dabartinio naudotojo profilio projektuose.

Virš išraiškų redaktoriaus yra keletas įrankių, kurie padeda tvarkyti naudotojo išraiškas:

  • fileSavePridėti dabartinę išraišką į naudotojo išraiškas: įrašyti išraišką į naudotojo profilį. Paprastesniam identifikavimui galima pridėti užrašą ir pagalbos tekstą.

  • symbologyEdit Keisti parinktą išraišką iš naudotojo išraiškų, taipogi ir jų pagalbą ir užrašą

  • deleteSelected Išimti parinktą išraišką iš naudotojo išraiškų

  • sharingImport Importuoti naudotojo išraiškas.json failo į aktyvaus profilio aplanką

  • sharingExport Eksportuoti naudotojo išraiškas kaip .json failą; bendrinamos visos naudotojo profilio faile QGIS3.ini esančios naudotojo išraiškos

9.1.2. Funkcijų redaktorius

Kortelėje Funkcijų redaktorius jūs galite rašyti savo funkcijas Python kalba. Tai teikia patogų ir paprastą būda atsižvelgti į poreikius, kurių netenkina standartinės funkcijos.

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

Fig. 9.2 Funkcijų redaktoriaus kortelė

Norėdami sukurti naują funkciją:

  1. Spauskite mygtuką symbologyAdd Naujas failas.

  2. Parinkite, kur laikyti naują funkciją. Galite pasirinkti įrašyti arba į Funkcijos failą, arba į Projekto funkcijas.

    • Jei parinksite Funkcijos failą, jums reikės įvesti Python .py failo pavadinimą, kuris remiasi QGIS šablono failu ir saugomas aktyvaus naudotojo profilio aplanko poaplankyje /python/expressions.

    • Jei parinksite Projekto funkcijas,nauja funkcija bus saugoma projekto faile.

    Naujas elementas pridedamas Funkcijų redaktoriaus kortelės kairiame skydelyje.

  3. Skydelyje dešinėje rodomas failo turinys: pythono scenarijaus šablonas. Pakeiskite kodą ir jo pagalbą pagal savo poreikius.

  4. Spauskite mygtuką start Įrašymo ir įkėlimo funkcijos. Jūsų parašyta funkcija pridedama į funkcijų medį kortelėje Išraiškos, pagal nutylėjimą - grupėje Savo.

  5. Džiaukitės savo nauja funkcija.

  6. Jei funkciją reikia tobulinti, įjunkite kortelę Funkcijų redaktorius, atlikite pakeitimus ir vėl spauskite mygtuką start Įrašyti ir įkelti funkcijas, kad jie atsidurtų faile ir taip būtų prieinami bet kurioje išraiškų kortelėje.

Savos Python funkcijos, saugomos kaip Funkcijų failai, laikomos naudotojo profilio aplanke, o tai reiškia, kad kiekvieną kartą paleidžiant QGIS, bus automatiškai įkeltos visos dabartinio naudotojo profilyje įkeltos funkcijos. Turėkite omenyje, kad bendrindami Python funkcijas, kurios laikomos Funkcijų failuose, jums reikia bendrinti .py failą iš aplanko /python/expressions.

Kitavertus, savos Python funkcijos, kurios saugomos kaip Projekto funkcijos, gali būti lengvai bendrinamos tiesiog bendrinant projekto failą, kuriame jos ir įrašytos. Atveriant projektą su projekto funkcijomis, QGIS gali įkelti arba ignoruoti jas priklausomai nuo to, kas nurodyta Bendrųjų nustatymų parinktyje Įjungti projekto įtrauktą pythono kodą.

Norėdami ištrinti savo funkciją:

  1. Įjunkite kortelę Funkcijų redaktorius

  2. Parinkite funkciją sąraše

  3. Spauskite symbologyRemove Išimti parinktą funkciją. Funkcija išimama iš sąrašo ir, priklausomai nuo laikymo vietos, atitinkamas .py failas ištrinamas iš naudotojo profilio aplanko, arba Python funkcijos išimamos iš projekto failo.

Kai projekto failas su projekto funkcijomis uždaromas, atitinkamos Projekto funkcijos iškeliamos ir jų daugiau nebegalima naudoti QGIS sesijoje.

Pavyzdys

Štai pavyzdys kaip sukurti jūsų nuosavą funkciją my_sum, kuri veiks su dviem reikšmėmis.

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

@qgsfunction(args='auto', group='Custom')
def my_sum(value1, value2, feature, parent):
    """
    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

Dekoratorius @qgsfunction priima šios argumentus:

  • args: argumentų skaičius. Naudojant args='auto', funkcijai reikalingų argumentų skaičius bus paskaičiuojamas automatiškai pagal tai, kiek argumentų apibrėžta Python’e (minus 2 - feature ir parent). Nurodžius args = -1 leidžiamas bet koks argumentų skaičius.

  • group argumentas nurodo grupę, kurioje funkcija turėtų būti rodoma išraiškų dialoge.

  • usesgeometry=True jei išraiškai reikia prieigos prie geoobjekto geometrijos. Pagal nutylėjimą False.

  • handlesnull=True jei išraiška turi savo NULL reikšmių apdorojimą. Jei False (numatyta), rezultatas visada bus NULL, jei bet kuris iš parametrų yra NULL.

  • referenced_columns=[list]: Masyvas atributų pavadinimų, kurie yra privalomi funkcijai. Numatyta reikšmė [QgsFeatureRequest.ALL_ATTRIBUTES].

Pati funkcija priima tokius argumentus:

  • bet kokį skaičių bet kokio tipo parametrų, kuriuos norite perduoti jūsų funkcijai, nustatytus prieš šiuos argumentus.

  • feature: dabartinis geoobjektas

  • parent: klasės QgsExpression objektas

  • context: Jei paskutinėje pozicijoje yra argumentas, pavadintas context, šiame kintamajame bus klasės QgsExpressionContext objektas, kuris duoda prieigą prie įvairios papildomos informacijos, tokios kaip išraiškos kintamieji. Pvz. context.variable( 'layer_id' )

Ankstesnio pavyzdžio funkciją tada galima naudoti išraiškose:

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

Fig. 9.3 Savo funkcija, pridėta į išraiškų kortelę

Daugiau informacijos apie Python kodo kūrimą galima rasti PyQGIS Developer Cookbook.