donderdag 24 november 2016

Forms in QGIS

In de eerdere berichten is verteld over de DEMO (PostgreSQL) database waarin relaties/domeinen op een afwijkende manier zijn vastgelegd. Relaties worden nu on-the-fly gelegd op applicatieniveau en niet meer in de database. En dat pakt helemaal niet verkeerd uit als je bijvoorbeeld QGIS gebruikt. Hieronder een fictief voorbeeld.

In dit voorbeeld worden kort en bondig een aantal stappen doorlopen in QGIS. Het moet net genoeg richting bieden om zelf ook aan de slag te kunnen gaan. En mocht je vastlopen; vragen staat vrij..

In QGIS is een nieuw (leeg) project gestart en is de postgis tabel demo.public.oppervlaktewaterlichaam  (zie blog over object hierarchie in een database) als kaartlaag  oppervlaktewaterlichaam toegevoegd. Een aantal objecten op deze laag staan 'in onderzoek', d.w.z. er is onderzocht of deze objecten wel juist getypeerd en gecategoriseerd zijn en een aantal zullen naar aanleiding van het onderzoek gewijzigd moeten worden.

De Use case is simpel:
  • doorloop alle oppervlaktewaterlichamen die in onderzoek staan (inonderzoek aangevinkt)
    • zet de typeringen (waterkwaliteit, waterkwantiteit) en de categorie juist
    • vink het attribuut inonderzoek uit
    • voer de wijzigingen door in de database
We willen hierbij een zo eenvoudig mogelijke objecteditor (QGIS form) gebruiken om het aantal handelingen per object zoveel mogelijk te beperken.

Aan de slag


Vanaf dit moment: Vergeet niet regelmatig het QGIS project (.qgs bestand) op te slaan, Alle instellingen maken immers deel uit van de project-definitie en gaan verloren als er niet opgeslagen wordt.

Aan het QGIS project wordt nog een tabel 'zonder geometrie' toegevoegd met de
naam  domeinwaarden  (zie blog over domeintabellen). Een aantal attribuutwaarden van  oppervlaktewaterlichaam vinden in deze tabel hun oorsprong.

Er zijn kennelijk oppervlaktewaterlichamen waarvan het attribuut inonderzoek de waarde t (true) bevat. Door deze objecten donkerder af te beelden zijn ze makkelijk op de kaart terug te vinden. De stijl van deze laag is daarom via het venster Laag Eigenschappen (r-klik op laag oppervlaktewaterlichaam > eigenschappen) Regel-gebaseerd gemaakt:


Het kaartbeeld ziet er als volgt uit:



In de basis is het project gereed en kunnen de werkzaamheden uitgevoerd worden, maar de automatisch gegenereerde objecteditor werkt nog niet goed (incl. foutmeldingen van de database).
Daar gaan we wat aan doen. Open de eerder genoemde Laag Eigenschappen van de laag oppervlaktewaterlichaam en selecteer het onderdeel Velden.


Er staat bovenaan dat de user-interface (UI) layout automatisch gegenereerd wordt.

In de kolom Wijzig-hulpmiddel staat voor ieder veld aangegeven wat voor user-interface bouwsteen (Widget) gebruikt wordt en wat het gedrag is. Bij iedere nieuwe laag staat er alleen maar Tekst bewerken. Dat is daarmee de eerste keuze, maar niet altijd de juiste keuze. We doorlopen alle rijen en kiezen voor ieder veld het beste hulpmiddel. Zo is voor deze Case gebruik gemaakt van de volgende hulpmiddelen:

  • Tekst bewerken = Label + Line edit (eerste keuze)
  • Datum/Tijd = Label + Date/Time edit
  • Keuzevak = Checkbox
  • Waarde relatie Label + Combobox (domeinlijst)

Ieder veld wordt voorzien van een passend hulpmiddel, ook al wordt het niet meteen gebruikt.
Met het inrichten van een hulpmiddel wordt gedrag geregeld, denk aan:
  • Is het veld aanpasbaar? (ja/nee)
  • Mag het een lege waarde bevatten? (ja/nee)
  • Hoe moet een veld weergegeven worden?
  • ..

Soms is er specifiek gedrag te definiëren voor één bepaald hulpmiddel:

Keuzevak (bijv. inonderzoek):
  • Weergave aangevinkte status = t
  • Weergave niet-aangevinkte status = f
De waarden t en f zijn bruikbaar voor de regelgebaseerde stijlinstellingen, en worden in PostgreSQL bovendien herkend als True en False.

Waarde relatie (bijv. categorieoppwaterlichaam):
  • Laag = domeinwaarden
  • Sleutelkolom = omschrijving
  • Waardekolom = omschrijving
  • Filter expressie = "naamruimte" = 'damo' AND "domein" = 'categorieoppwaterlichaam' 

De automatische objecteditor is nu wel bruikbaar, maar niet alle velden zijn relevant voor deze Case.


Alleen de velden 1-2-11 zijn nodig voor identificatie, 12-13-14 om data te wijzigen, en 7 om aan te geven dat het object afgehandeld is.
Het Wijzig-hulpmiddel voor de overige velden kunnen we op Verborgen zetten, maar daarmee gaat er specifiek gedrag verloren. Dus dat doen we niet.

Er is wat voor te zeggen om zelf een user-interface te ontwerpen in QtDesigner (maakt deel uit van een standaard QGIS installatie). Zoek een programma met deze naam, start het op en maak een nieuw form aan:


Sleep de juiste widgets uit de Widget Box (links) naar het canvas (midden) en zorg dat ze bij benadering juist staan (naast elkaar - onder elkaar). Kies daarna Form  > Lay Out in a Grid en alle widgets worden netjes uitgelijnd zoals hierboven.

Zorg dat de objectName van iedere widget  in de Property Editor (rechtsonder) EXACT overeenkomt met de veldnaam in QGIS. Het resultaat ziet er nog niet zo anders uit dan het standaard formulier van QGIS, maar eigen UI's bieden op termijn veel meer mogelijkheden.

Bewaar deze form-definitie (.ui bestand) in dezelfde map als het QGIS project (.qgs bestand).

Ga terug naar het venster Laag Eigenschappen en pas de layout van oppervlaktewaterlichaam aan van  Automatisch genereren naar Geef een UI-bestand op en blader naar het .ui bestand. Bevestig de actie (Apply of Ok). Vanaf dat moment wordt de volgende objecteditor gebruikt:


Alleen de velden die bij de werkzaamheden helpen worden getoond, en de domeinlijsten werken zoals je mag verwachten:

.
Met deze editor ernaast kan het hele gebied (en attributentabel) afgelopen worden en kunnen de wijzigingen soepel doorgevoerd worden in de DEMO database.

De DEMO database is ingericht met domain-check-constraints (zie blog oever domeinen) en row-level-security (zie blog over RLS). De gebruiker kan alleen data wijzigen voor de naamruimte (namespace) die hij onder zijn beheer heeft, in dit voorbeeld alleen de oppervlaktewaterlichamen van de bronhouder NL.IMWA.038.

De DEMO database is ook ingericht met een archive schema voor het automatisch bijhouden van historie. Iedere wijziging wordt automatisch gelogd, Info als gebruikersnaam en (versie) datumvelden worden automatisch bijgewerkt.

De object-editor die hierboven gemaakt is heeft tot nu toe geen negatieve impact gehad op de werking van DEMO.
It just works!

Geen opmerkingen:

Een reactie posten