From 6eedc11872699e3ab4ba8bbeb0e7a275c7604382 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Wed, 9 Apr 2025 12:34:04 +0200 Subject: [PATCH 1/8] qgis-forms: init --- .gitignore | 5 + .../qgis_forms/images/fig1_simpleform.jpg | Bin 0 -> 27399 bytes content/tutorials/qgis_forms/index.qmd | 647 ++++++++++++++++++ static/list_of_categories | 1 + 4 files changed, 653 insertions(+) create mode 100644 content/tutorials/qgis_forms/images/fig1_simpleform.jpg create mode 100644 content/tutorials/qgis_forms/index.qmd diff --git a/.gitignore b/.gitignore index 3fe07d6fe..e68dfe361 100644 --- a/.gitignore +++ b/.gitignore @@ -66,3 +66,8 @@ data_gisclub/ # png images for the brms tutorial /content/tutorials/r_brms/brms_eng/*.png /content/tutorials/r_brms/brms_nl/*.png + +/.quarto/ +/content/tutorials/qgis_forms/*.qgs +/content/tutorials/qgis_forms/*.zip +/content/tutorials/qgis_forms/*.qgs~ diff --git a/content/tutorials/qgis_forms/images/fig1_simpleform.jpg b/content/tutorials/qgis_forms/images/fig1_simpleform.jpg new file mode 100644 index 0000000000000000000000000000000000000000..043c25fab8248800209444baa97e7db0ff65fc85 GIT binary patch literal 27399 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

-?Kmsf>j;B1iP>%-ms`4&+bwx3Dg)J;pKBDJM z;q2F}KaKNc77_$Kp9_a`R0TOmBxspmYci{2V#QM!x=dSLUAw(B z{l~kS!*4eOohFtTu{_F+GWZjvuA-pIwU?-n*(Z>T*RePJe@0ypmD7g%BLtRPExBz> z#y^C=**;o{aN5PtHk3GdRpEr(&_PaJtf*?cD`Qb#x{g%lmhR#sBt- zfA~0Hcg8|`(lp;(w75~tS}R}UEK#9(AW65!mr_Cxrf+9yb<%-P=}dk!Z$<|5Y*^@Y zCWG$PaB$FR* z6r;L*8YwC8T|-Tt<*0-yf!+O=l!dt^v%HbO{DfF%Ri$`cHmSUs5H0DvI>_#%+pIo)L>S(=p0z6 zx50A0lV~=u9E_V-^wFIA;oy&D&zWij*`MTaSE&5O`g_meeXD^UC9uBt?j)EVuX(9)sWMy?sOb7Kpas~9^ItYOs zAerD_&YQ|#zVa{5Ec|q$3 zJeFBEmhRHHiMloUD1`$^wf*S&E3arFyK66hJ?$$(G>_;$YU zldvj5)v?1P*EHqK^)cU5=eiofpj(5v2LH1BuLj!B&ku*jw!Nomi~I*=bjq)R2qv3~ zOV@W~KK=#(>ZQ?*zJ?r9EEYd+IH@s8#lp&+P!9?Ty^a3un}G{~<#BD~!y&FoSRZ;S3_A5O0B6(_W*MhLuX`-_S7M-~7}$DLQ9S0VGW5 z12lND1&2hEu`I@2Ai@Hk<~>ebS#RAm^!*t?fPoPd zYV3Va9VnzasCUzf#}8F&s#Z*BE)s5+>$@RZ>S-loqgYr173n&S$ldt8qP*DXncAu{9?FaQcbl;mwN%Rk z3#a%I#Lr|k?0o#Di*=KahvV9mS?R%yacmhLW*E~O667>dkN`=dgFdBNF`HM6aUWBc zi~whFIH}N|L`GZBQSl6*9Niye%vXJkru5Z2Z_G4>aJ%iQs~{CdSwzKo5u5^hmbbhN zJG$W>n^BOh<%5q@R3MXh$xg0YG*zy(-iX~GnJiwuion=;_}yg6O>lGf_n>p4BG6U+(>=W{vPXb!Zf}I zKs-05AafmZn95Pw6e-wA{M=&S#xq8xJ%H*ik6Uf8ar0`WoE*+z{*CKg z#FM7@g@Z1d#kZ$M3P5#0$*HpOHj6E8W=#SnWfUMUR%G8roOqmOXJyS3vR zfbZE{;XXl9r!a09w{3UuB)uR+H`aKws5nFO`Mvv71Nqb}xs>2-ZyZFgAXYKoQh2?u)2I`=& z33q`OeNix!mwF>SfrvHC)=W|p8FvL=7WC)I^pTHVglP41uNx-euexdCZRoMnGqLN= z>_LTbbO4Lqwa(gX@{TM+hZe^-ZL8Whf{Sowq>+HNtp-8YpXZnU?VGv5KY+`=ZPf6d zz@ZrF@S^QjwXU9*&hY${!6Ls+;o(5(Sl$mf@&R9t0mb)Ro1s};`HJkD%8?O1#=%L# zXIrNYT26QJ{(6z@KAak=;CZrf?NA5mbkiGt0?uMd)MQkyc<+2${K2ojD>RmR&}+yA z$x;`q@wbzjYnGK8v5JPWH%$q$12f7rnqRiBZ?YOjZ1p|Jp0KzTkeC+fRNU|O!h+X> zTI{|>it}SVMtcY=-pj(UFN8u%q|yAnaog<7y6=`gZwM_so{KH6JUCG%?|a^wi+Mc>u{2Ny0}k#l#AC-X@0}T`4;YXQbrcTOycpUb3T7nNb@T7a!}Ws~Pi3-F9(gKBE|o zE%o8n#AeObrq(RIV5|HESm_TV4lc{@KeNdIx7;%aMk`y(O=OxxxwRC1a55H-byhex z!4XN=f)_BtOg(t-7b-{>_GVYlm!yeCr`>GrV%T%4$a&5uxh8IPv+rWA6d%~xjj zuBCAYTRtT1eM#60bUa~H8JoIQc>30LbWzKlxNv7N#A#B6xRpD5GUgTR`c~y;^Hed+ zcJ}U|uh*B7ON`F)xf)8agC*FYj0>#yvB=*acMD@jc}c0d6Uql2wYES>}Y}K)f<+jTj{d0Q?Rv%nW((s|5e`kGZet z!!^c?0&Q-z+qh)DJ-+6 z3@>h*Jz_+Gdy%U6fI|C>s!9PHRw-f1e4zR+AnrhRVtnY>Lec?6tL1YZ2D&JVp{dy& z{nozwt@`|6nFavSlX-@RRIwP~3{;>kGLSSKJ#dKBOp^qq9@<*m=n zgBcCjhq<{LQ@4LD) zvvzi4J5EXH>&<=7y)lpdgsa;SI?DJ&0@*W*7uv!OSxN-doN9F+ivb)&kkaVQQR>zc zAL+~&0r?KCh_4C&KJb7Uo=G-PV3TokQxq384?a13u*UE%6pqqDJ*%sRmPsrMG)hpl zm$PxOxA92aVMM$lJ$eDrJj0A#e7n=0V>jHJ;$On3`}m_(nQ8ttDIWpA!STDrI~6?L z9Dgdc)wHNowkyLW@wSctdSNZX!cEy4-#V;)zL|YxR3c&(ky4{I5um=|dRnB}slEWM zsx%?@rzTl6yA!yK+DKo|Gm&K3LYmQ@_w&JRZ?e7in)*1(m?Ns`>14_Tvo%1?FnSPq ze_=Q#{$x8wl+2OtCOxvR%ma)|-kCu3O`Zmu8KwtR3I!+RE2^Qe%VZ{9GlA700U&@- zsHQ}*fBgef>#q{@zot7#Phm&~!p>8SOcYHx_URA~gmEyuy8Wp`tAhEDp5^-VsoR6( zufW~Lvl?t~hnUn$WtTZ+Eu%$?>T#4Y8N+i=T_9YN+bEZ8&%lmkn4r37`EYWM4@Nqp zUPkvFGV*!g37@crp&K@ulQzie?T+&vHw#`*z3+8YoY)zqrfR_B;0NoP%~yd@@vlfw z(p>f_SQfbqPhiFt`}vl*QQM|iwqHSvjHWa)XbjEdx+XRy2-!pUkV9Z31F3X0zU70& zTaq@k+IZmw)M60*^qEx38qGG8{_Adz+lwP>`FS(XvHG2a2^Wl9g^Y*a@w@pu6#{OV zk-uL4J^#-eP7x2d?pK?cLBy+ooFOYc94t^%be~+Jz)J2zuILdj7yD-Q?Y7a+4<|)c zU@gHEkL3Qi!S>+fN$r0UCP+=Q`rPodq~CzvcNGE$_n(Tx-NIQ%h151(3e4r6aPocU zlbirJ&ISEJJeKF%_MfNvsHvZ4MsL9^IBs0ylMwB$ z3H?>G@)dXReH$$L^x4$PfwLaZvY&0W4#@?XmF)mgk7p`y)SMaVOToSx4JCj3<2Qh2 z$qS;Vl=e=%OFg|e-T7vrlD z>*cRW#@CM=m_V1m{{st@Eupd-;< z=N=s`!tR(A=6^5Vin&&)1mU=jU^aP%Jdv<-7dQI!8xX|UB-+loL^hkRe#KZm49*AiNI_p?exV)5ZEN$k7GA)Jh&EAt?i$*> z>m(`KQF0#q8?gI1N8G)`RHU}K-vm@$pL2Moz=w`XrN6o3u`fvzs;|MiYfSrRcN7Ik z{CVH;s5*=~J}wrEyiEPLfGK0h`MgEtA3$!5>S_ufbB+GF6hP;0YhdFUtWWilfried Santer on Unsplash +--> + +If you still feel brave, consider taking up this challenge again next weekend. +I would not consider this a totally infantile exercise: is is an exercise in the art of reductionism, reducing our dependence on the trivial tools which we are so much used to, growing appreciation for everyday actions, gaining a new perspective. +And, as is the causality of things, you might remember this notebook next time you see chocolate cake. + + +In a way, this tutorial attempts to do something similar to eating cake without using your hands. +I will demonstrate how to **edit a QGIS project -- without opening QGIS.** + +Do not get me wrong: QGIS is an outstanding software tool by itself. +The interface is simple and intuitive, yet gives you powerful options to manipulate spatial data from a variety of sources. +Yet there are a few FOSS tools which go one step further: they expose their inner workings by enabling scripting in a programming language. +"Blender" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly. +QGIS also has a Python back-end, and exposes it via an internal editor. +It is worthwile to train using and understanding this feature. + +Leaving the world you know (the QGIS GUI) to enter the Matrix. + +```{=markdown} +Govt. Holkar College +``` + + +Because, you know, the immediate utility of this skill is much more obvious than in the cake analogy. +If you have QGIS under your scripts, you can automate data chains, version control data sources, document changes, dynamically customize elements, and learn about the inner workings of this fabulous, open GIS software program. +On the way, you will learn about the basic components and elements of QGIS, and GIS in general. + +And you will see that scripting QGIS is just a piece of cake. +Grab a coffee. +*Take a cookie… and everything will be right as rain.* +And enjoy reading! + + + +# QGIS Interface and References +TODO + +The code below is designed to be standalone, for the sake of this tutorial. +However, whith some minor tweaks, it should also work well in the QGIS Python console. + +```{python qgis-library-import} +from qgis.core import * +from qgis.gui import * +from qgis.utils import * +from qgis.PyQt.QtCore import QMetaType, QVariant + +import pathlib as pl +``` + +TODO installing PyQGIS + + +# Constructing Form Elements + +The more I think about it, the more I like the chocolate cake analogy. +Because, you see: just like in the *good* chocolate tarts, a QGIS project consists of many layers which are stapled one above the other. +We will work our way from the ground up. + +## App + +If you run QGIS from within Python, you might want to tell your Python interpreter where to find the QGIS installation. +You might even keep multiple QGIS versions in parallel. +For this, there is an app interface: `QgsApplication`. +This is the base layer, the foundation of the rest of the procedure. +Code below simply copies the steps shown [in the official docs](https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/intro.html#using-pyqgis-in-standalone-scripts). + + +```{python qgis-application} + +# Supply path to qgis install location +# QgsApplication.prefixPath() +QgsApplication.setPrefixPath("/usr/bin/qgis", True) + +# Create a reference to the QgsApplication. Setting the +# second argument to False disables the GUI. +app = QgsApplication([], False) + +# initialize the QGIS app (load providers) +app.initQgis() + +``` + + +## Project + +Mimicing how you work in the QGIS GUI: once you start the program, you will have to create or open a *project*. +This is the second layer, and here is how you enter it in PyQGIS. +Certainly set your project CRS, otherwise all data is flawed and all hope is lost. + + +```{python qgis-project} +project = QgsProject.instance() # taking a new QGIS project instance as our project. + +project_crs = QgsCoordinateReferenceSystem.fromEpsgId(31370) +project.setCrs(project_crs) +``` + +You can associate the project with a file location to store it. +The Python base library `pathlib` provides some useful tools for file- and path management. + +```{python qgis-save-project} +#| eval: true +project_path: pl._local.PosixPath = pl.Path(project.readPath("./")) +save_filename = project_path / "test.qgs" +save_check = project.write(str(save_filename)) + +``` + + +Below, we will need to clean up, save, and exit our project, which is why I take this along as a function (allowing you to hack in and save intermediate stages). + +```{python save-and-exit} +## clean up, save, and optionally exit +def SaveAndExitQGIS(quit_app = True): + save_check = project.write(str(save_filename)) + + if quit_app: + app.exitQgis() + +``` + +But do not run this function yet, just when the fun is about to start. + + +## Layers + +Now up on the way to the cake top cherry, all we need are more and more *layers*. + +For example, you might import existing `shp` shapefiles or `geojson` data sources and add them to your project. +Here is how you would do that: + +```{python import-data-layer} +#| eval: false + +layer_path: pl._local.PosixPath = project_path / f"geodata/{data_filename}.geojson" + +layer: QgsVectorLayer = QgsVectorLayer(path = str(layer_path), baseName = {data_layer_name}) +assert layer.isValid(), "Layer is not valid!" # should be a better check/raise in production + +project.addMapLayer(layer) # this will add the layer to the project + +``` + + +There [are similar objects and functions](https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/loadlayer.html) to get the different available data sources into QGIS; you find those well documented. +Make sure to provide a beautiful background map to help yourself and the users of your QGIS project to some basic orientation. + + +Instead, for the purpose of this tutorial, we will create a new layer which will then hold spatial data, and a form to fill for fieldworkers. +Worth mentioning is the **`provider`**, i.e. the data back-end of your layer. +There are [many options](https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/loadlayer.html#vector-layers), most noteworthy `ogr`, `csv`, or `postgres`. +In the tutorial case, we will keep the data in `memory` without linking it to an external data storage. + +```{python new-vector-layer} +layer_name = "questionnaire" +layer_provider = "memory" +layer = QgsVectorLayer("Point", layer_name, layer_provider) +``` + + +:::{.callout-note} +Layers are the central connection between your data storage and the user interface. +They hold attributes in an attribute table (the data), and control data entry and visualization via their *layer properties*. +::: + +Note that you will not see your layer on the project unless you add it via `project.addMapLayer(layer)`. +However, right now, the layer is initialized and empty, and I will add it after finishing all preparation. +This is a general pattern of how PyQGIS works: you create an object, manipulate/fill/style it, and then associate it to the appropriate structure. + + +## Attributes, Fields, and Features + +One of the first things to check on your layers is the **attribute table**. + + + +Data in the layers is organized in **fields** (columns). +When you add a row entry to the table, that is called a **feature**. +If you have a background in geographical sciences and relational databases / SQL, all of these terms will be familiar from different contexts; if not, they might need some getting used to. + + +The primary service of a QGIS project is to collect data in the field. +However, to get to that, it is important to have a meaningful data structure on the back-end. +**The attribute table is exactly that.** +Thus, the first thing we need to do is get all the relevant fields to the attribute table (assuming they are already loaded from an external source). + + +On the Python side, we want to access the `dataProvider` of the layer. +Through that data provider, we can add the fields we would fill in later. + +```{python layer-data} +data_provider = layer.dataProvider() + +data_provider.addAttributes([ \ + QgsField(field_label, field_dtype) \ + for field_label, field_dtype in [ + ("Answer 1", QMetaType.Type.Bool), + ("Answer 2A", QMetaType.Type.QString), + ("Answer 2B", QMetaType.Type.Int) + ] \ + ]) +layer.updateFields() # feed changes of the datasource to the vector layer + +# convenience function +field_index_lookup = lambda field_label: layer.fields().indexFromName(field_label) +``` + +The `addAttributes()` function takes a list of `QgsField` elements, which you could as well predefine. +You see that here I initialized three question fields: a Boolean, an Integer, a String variable. +Those data types come directly [from the Qt back-end](https://doc.qt.io/qt-6/qmetatype.html#Type-enum), i.e. the part that contributes the Q to QGIS. + +Finally, the convenience function I defined there will help us find the internal index for any field we want to access below. +It should be updated each time the fields of a layer are updated. + + +So far, so good: +if you run all the above code, you should have a QGIS project with a point vector layer and an attribute table prepared. + +## Forms, Containers, and Widgets + +### Form Configurator + +The more fields to collect, the less user-friendly attribute management gets. +One of the strengths of the QGIS interface is that you can design dynamic forms which guide the field workers' data acquisition. +Programmatically constructing such a form in a Python script is a blast, once you get the components right. +We will start simple, then generalize. + + +Whereas the `layer.dataProvider()` was the "back-end", i.e. the path to the attribute table, +there is also the `layer.editFormConfig()` to configure the "front-end" to the user. +In the GUI, you can find this in the "Layer (*right-click*) >> Properties", under **"Attributes Form"**. +Some extra options are visible in that GUI if you select "Drag and Drop Designer" layout. +The consistent integration of the Python back-end requires exactly the same steps, including selection of drag-and-drop layout. + + +```{python form-config} +form_config = layer.editFormConfig() # accessing the form configurator +form_config.setLayout(Qgis.AttributeFormLayout(1)) # drag&drop layout + +``` + +To be flexible within this notebook, I find it useful to append the `SaveAndExit()` function above at this point. + + +```{python save-and-exit-form} +## clean up, save, and optionally exit +def LayerSaveAndExitQGIS(quit_app = True): + layer.setEditFormConfig(form_config) + layer.updateFields() + project.addMapLayer(layer) + SaveAndExitQGIS(quit_app = quit_app) + + +``` + + +### Root Container + +The first item present in any form is the *root container*. +As the name suggests, it is at the root of each form, and we will place our widgets in a structured manner underneath that container. +First thing to do is to clear it, to start constructing a fresh form. + +```{python root-container} +root_container = form_config.invisibleRootContainer() +root_container.clear() +``` + +Containers are one type of widget: they can be used to visually group other widgets. +The root container is "invisible" in a sense that it does not have a label on top, and cannot be folded; yet it is "always visible" in a sense that it is the very root of your form structure. + + +### Text Widget + +Time to add our **first widget**: a simple text! + +```{python text-widget-creation} + +question_text = """ +You take the blue pill... the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill... you stay in Wonderland, and I show you how deep the rabbit hole goes. +Will you take the *red* pill? +""" +form_qn_text = QgsAttributeEditorTextElement(name = "Question 1", parent = root_container) +form_qn_text.setText(question_text) +root_container.addChildElement(form_qn_text) + +``` + +That was too simple. +Not really a challenge. +But, of course, text alone does not do much: we would like to interact with data. + + +### Field Widget + +Therefore, we need a `QgsAttributeEditorField` (*read*: a "Field" in the "QgsAttributeEditor"), which specifically links to the fields above. + +```{python field-widget-creation} +this_field_label = "Answer 1" + +checkbox_widget = QgsEditorWidgetSetup( \ + 'CheckBox', { \ + 'AllowNullState': True, \ + 'CheckedState': 'red', \ + 'TextDisplayMethod': 1, \ + 'UncheckedState': 'blue' \ + }) + +# define the field to be set by a checkbox +layer.setEditorWidgetSetup(field_index_lookup(this_field_label), checkbox_widget) + +# putting the field label on top (True) or on the left (False) of the form element +form_config.setLabelOnTop(field_index_lookup(this_field_label), False) + +``` + + +Carefully observe the way PyQGIS works: +we have associated a data field with a checkbox. +This actually brings a checkbox to the Attribute Table editor. +We have not yet configured our form, or attached a checkbox to the form config's root container. +This is done as follows: + + +```{python add-form-element} +# Note: the `name` must be equal to the field label +form_element = QgsAttributeEditorField( \ + name = this_field_label, \ + idx = field_index_lookup(this_field_label), \ + parent = root_container \ + ) + +# Then, we add the checkbox form element as a "child" of the root container +root_container.addChildElement(form_element) + +``` + +## More Widgets + +You may argue that the `CheckBox` widget is totally inappropriate for this particular question, and I would agree. +Even the details that Neo could leave the box untouched, postponing or even avoiding any choice, or answer it again on another feature, are debatable. +But, hey, I am not Morpheus, and this is just QGIS. + +However, your may as a homework edit the widget above to make it a dropdown. +Solution is folded below. + +```{python value-map-widget} +#| eval: false +#| code-fold: true + +dropdown_widget = QgsEditorWidgetSetup( + 'ValueMap', {"map": {"Red": True, "Blue": False}} + ) + +``` + + +QGIS has many more options, which are controlled from the *attribute editor*. + +[Many different attribute editor elements exist](https://qgis.org/pyqgis/3.40/core/QgsAttributeEditorElement.html), and we already saw "Fields", which effectively change the data, or "TextElements", which are informative text (there are also spacers and HTML). + +In terms of widgets for the Field elements, there a multitude of customization options, which might be hard to put in an overview. +If you have a widget in mind, and would like to create it in python, [the following code](https://gis.stackexchange.com/a/346374) can be used to extract widget configurations from the QGIS Python console. +Create a layer with a layer name of choice, manually create and configure a widget in the Drag and Drop Layout designer, and track it in the console with the following code: + +```{python widget-config-extraction} +#| eval: false + +# layer = QgsProject.instance().mapLayersByName("questionnaire")[0] +ews = layer.editorWidgetSetup(layer.fields().indexFromName("Answer 1")) +print("Type:", ews.type()) +print("Config:", ews.config()) +``` + +I hope this helps you to find your way around. + + +### Recap +At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, widgets, a root container, and form elements. +Look at our depressingly simple form. + +![](images/fig1_simpleform.jpg) +`

A first form widget. The red circle indicates the toolbar used for editing a layer, and adding features, which is what opens the form.

`{=markdown} + + +# Generalization + +Acknowledged: we constructed a fully layered chocolate cake. +And you might have realized by now that I keep promising too much cake. +So, how about if I tell you that, instead of a single cake, you can create a bakery? + +Because, after all, this is Python! + + +## Functions + +For example, we had that text element above. +Let's turn it into a function. + +```{python form-text-function} + +def AddInfoText(question_text, label = "", parent = root_container): + text_element = QgsAttributeEditorTextElement(name = label, parent = parent) + text_element.setText(question_text) + parent.addChildElement(text_element) + +``` + +Using a loop, you could spam out lines of form text with this function. + + +## Classes + +Another helpful thing is automating the field element widget creation with a dedicated function. +Or a set of functions. +Or... How about... An **Object-Oriented Approach**? + +```{python form-widget-object} + +class FieldWidget(object): + def __init__(self, field_label, parent_container, widget = None): + self.label = field_label + self.parent = parent_container + + if widget is not None: + self.SetWidget(widget) + + self.AddFormElement() + + def GetIndex(self): + return field_index_lookup(self.label) + + def SetWidget(self, widget): + # Note that layer and form_config are taken from a global context. + # You could of course do better by designing your own `Layer` class! + + layer.setEditorWidgetSetup(self.GetIndex(), widget) + + # putting the field label on top (True) or on the left (False) of the form element + form_config.setLabelOnTop(self.GetIndex(), False) + # TODO There must be more of these style setter functions in PyQGIS! + + def AddFormElement(self): + # appending this widget to the form + form_element = QgsAttributeEditorField( \ + name = self.label, \ + idx = self.GetIndex(), \ + parent = self.parent \ + ) + + self.parent.addChildElement(form_element) + + def __str__(self): + return f"A form field widget labeled {self.label}, stored under {self.parent}." + + +``` + + +This can be used to quickly add Answer 2 to the form. +But maybe those should not be visible from the start. + +To control visibility, containers can help! + + +## Containers + +The goal is to display `Answer 2A` and `Answer 2B`, depending on the choice in `Answer 1`. +In real life examples, there are many more questions and answers, and you might not want to show them at the same time, thus huge trees of forms evolve. + + +Do not Repeat Yourself: two answers, two containers, this calls for a function. +Something new on the way: you can control container visibility with an SQL condition (i.e. an expression which returns TRUE or FALSE). + + +```{python container-function} + +def CreateContainer(label, parent = root_container, visibility_condition = None): + # create a container, optionally controlling visibility with an expression + + # prepare the container + container = QgsAttributeEditorContainer(name = label, parent = parent) + + # set visibility + if visibility_condition is not None: + visexp = QgsExpression(visibility_condition) + container.setVisibilityExpression(QgsOptionalExpression(visexp)) + + return container +``` + +I get why you might find the above expressions extra confusing: we effectively use +`.setVisibilityExpression(QgsOptionalExpression(QgsExpression(expression)))`. +Express yourself! +And accept the strange beauty of an organically grown object-oriented construct. + +In practice, you deal with these things by defining your own wrapper functions. + + +## Application: Question 2 + +We still need widgets to decide how the user is supposed to answer our questions, don't we? + +```{python question-2-widgets} + +question_widgets = {} + +# The String field can be entered by a free edit field. +# QgsEditorWidgetSetup( \ +# 'TextEdit', { \ +# 'IsMultiline': True, \ +# 'UseHtml': False \ +# }) + +# We allow date selection with a calender tool. +question_widgets["Answer 2A"] = QgsEditorWidgetSetup( + 'DateTime', { + 'allow_null': True, + 'calendar_popup': True, + 'display_format': 'd/M/yy', + 'field_format': 'yyyyMMdd', + 'field_format_overwrite': False, + 'field_iso_format': False + }) + + +# The integer field shall have a list of possible values. +question_widgets["Answer 2B"] = QgsEditorWidgetSetup( \ + 'ValueMap', \ + {'map': {'The Original': 1, 'Reloaded': 2, 'Revolutions': 3, 'Resurrections': 4, 'I have never seen any!': 0}} \ + ) + +``` + + +Behold how this can quickly create a slightly more involved and dynamic form. + + +```{python question-2-scripted} +questions = { + "Answer 2A": "When was the date that you first saw The Matrix?", \ + "Answer 2B": "Which of the Matrix movies is the best?", \ +} +for answer, question in questions.items(): + container = CreateContainer( + label = answer.replace("Answer", "Block"), + parent = root_container, + visibility_condition = "\"Answer 1\" = " + ("TRUE" if "2A" in answer else "FALSE") + ) + + AddInfoText(question, label = answer.replace("Answer", "Question"), parent = container) + + widget = FieldWidget(answer, container, widget = question_widgets[answer]) + + root_container.addChildElement(container) + +``` + + +I hope you see how this scales. +The functions and objects give dedicated structure to the otherwise cryptic objects in PyQGIS, redundancies are reduced, which facilitates debugging. + +Still, things can go wrong. + + +## Braking Vases + +Whenever PyQGIS does not work as intended, fire up QGIS, run the Python console, and paste in some of your commands to check on the fly whether they do what they are supposed to do. +But why should it go wrong? + + +Ah, and don't worry about shutting down the QGIS app. +```{python finalize-qgis} +LayerSaveAndExitQGIS() +``` + + +> Oh… What’s really going to bake your noodle later on is, would you still have broken it if I hadn’t said anything. + + +# Summary + +Congratulations! +This may have been your first steps to the QGIS Python console. +Maybe your first steps in Python at all. + + +I hope to have given you some directions of how to auto-construct custom forms with PyQGIS. +If you have a meaningful way to store your questionnaires, determination keys, and field data assembly structures, take it from here and bring them to QGIS. +I mentioned the advantages above. + + +As always, questions and feedback are welcome! diff --git a/static/list_of_categories b/static/list_of_categories index 2855a2478..98e390b0e 100644 --- a/static/list_of_categories +++ b/static/list_of_categories @@ -1,4 +1,5 @@ r +python statistics gis databases From 5e0c83fdc1bd65f0b57accac86c1b4baa5f25041 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Wed, 9 Apr 2025 14:16:00 +0200 Subject: [PATCH 2/8] qgis-forms: enter the matrix! --- content/tutorials/qgis_forms/index.md | 607 +++++++++++++++++++++++++ content/tutorials/qgis_forms/index.qmd | 167 ++++--- 2 files changed, 722 insertions(+), 52 deletions(-) create mode 100644 content/tutorials/qgis_forms/index.md diff --git a/content/tutorials/qgis_forms/index.md b/content/tutorials/qgis_forms/index.md new file mode 100644 index 000000000..c9200f974 --- /dev/null +++ b/content/tutorials/qgis_forms/index.md @@ -0,0 +1,607 @@ +# Constructing Form Elements + + +--- +title: "Scripted Generation of GIS Data Forms Using PyQGIS" +description: "Editing a QGIS project without opening QGIS." +date: "2025-04-09" +authors: [falkmielke] +categories: ["gis", "python", "development"] +tags: ["python", "spatial", "gis", "qgis", "forms", "fieldwork"] +number-sections: true +link-citations: true +params: + math: true +format: + hugo-md: + toc: false + preserve_yaml: true + html-math-method: katex +--- + +# Introduction + +Life was good before we were exposed to its real challenges, wasn't it? +As a kid, you might have taken the challenge of eating chocolate cake without using your hands. +What fun it was. +I find it a pity that we do not do this any more. + +```{=html} +The image of a toddler's face after eating chocolate. +``` + +
Photo by Wilfried Santer on Unsplash

+ +If you still feel brave, consider taking up this challenge again next weekend. +I would not consider this a totally infantile exercise: is is an exercise in the art of reductionism, experiencing our dependence on the trivial tools which we are so much used to, growing appreciation for everyday actions, gaining a new, yet familiar perspective. +And, as is the causality of things, you might remember this notebook next time you see chocolate cake. + +In a way, this tutorial attempts to do something similar to eating cake without using your hands. +I will demonstrate how to **edit a QGIS project -- without opening QGIS.** + +Please do not get me wrong: QGIS is an outstanding software tool by itself. +The interface is simple and intuitive, yet gives you powerful options to manipulate spatial data from a variety of sources. +Yet there are a few FOSS tools which go one step further[^1]: they expose their inner workings by enabling scripting in a programming language. +QGIS has a Python back-end, and exposes it via an internal editor. +It is worthwile to train using and understanding this feature. + +Prepare to leave the world you know (the QGIS GUI), and enter *The Matrix*. + +```{=html} +Digital rain: green letters falling across the screen (The Matrix). +``` + +Because, you know, the immediate utility of this skill is much more obvious than in the cake analogy. +If you have QGIS under your scripts, you can automate data chains, version control data sources, document changes, dynamically customize elements, and learn about the inner workings of this fabulous, open GIS software program. +On the way, you will learn about the basic components and elements of QGIS, and GIS in general, and I might sprinkle in a Python trick or two. + +You will see that scripting QGIS is just a piece of cake. +Grab a coffee. +*Take a cookie... and everything will be right as rain.* +And enjoy reading! + +# QGIS Interface and References + +Introducing you to QGIS is beyond the scope of this tutorial, since there are excellent sources available online. + +- The official documentation: +- General youtube series by "GISWorld": \< https://www.youtube.com/playlist?list=PLCxnvDblgXGQHKgnbRTFB6a6AeKqYy9-9\> +- PyQGIS series by "GISWorld": \< https://www.youtube.com/playlist?list=PLCxnvDblgXGRzlmmVgAxpTJc60Rklxe8R\> +- PyQGIS "masterclass" tutorial: +- See also `QGISProcess` for R bindings: + +I personally found the trickiest part to be figuring out the QGIS-specific vocabulary. +If you have a background in geospatial analysis, you might struggle more with the workings of Python. +I will attempt to facilitate both. + +The code below is designed to be standalone, for the sake of this tutorial. +However, whith some minor tweaks, it should also work well in the QGIS Python console. + +``` python +from qgis.core import * +from qgis.gui import * +from qgis.utils import * +from qgis.PyQt.QtCore import QMetaType, QVariant + +import pathlib as pl +``` + +The more I think about it, the more I like the chocolate cake analogy. +Because, you see: just like in the *good* chocolate tarts, a QGIS project consists of many layers which are stapled one above the other. +We will work our way from the ground up. + +## App + +If you run QGIS from within Python, you might want to tell your Python interpreter where to find the QGIS installation. +You might even keep multiple QGIS versions in parallel. +For this, there is an app interface: `QgsApplication`. +This is the base layer, the foundation of the rest of the procedure. +Code below simply copies the steps shown [in the official docs](https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/intro.html#using-pyqgis-in-standalone-scripts). + +``` python +# Supply path to qgis install location +# QgsApplication.prefixPath() +QgsApplication.setPrefixPath("/usr/bin/qgis", True) + +# Create a reference to the QgsApplication. Setting the +# second argument to False disables the GUI. +app = QgsApplication([], False) + +# initialize the QGIS app (load providers) +app.initQgis() +``` + +## Project + +Mimicing how you work in the QGIS GUI: once you start the program, you will have to create or open a *project*. +This is the second layer, and here is how you enter it in PyQGIS. +Certainly set your project CRS, otherwise all data is flawed and all hope is lost. + +``` python +project = QgsProject.instance() # taking a new QGIS project instance as our project. + +project_crs = QgsCoordinateReferenceSystem.fromEpsgId(31370) +project.setCrs(project_crs) +``` + +You can associate the project with a file location to store it. +The Python base library `pathlib` provides some useful tools for file- and path management. + +``` python +project_path: pl._local.PosixPath = pl.Path(project.readPath("./")) +save_filename = project_path / "test.qgs" +save_check = project.write(str(save_filename)) +``` + +Below, we will need to clean up, save, and exit our project, which is why I take this along as a function (allowing you to hack in and save intermediate stages). + +``` python +## clean up, save, and optionally exit +def SaveAndExitQGIS(quit_app = True): + save_check = project.write(str(save_filename)) + + if quit_app: + app.exitQgis() +``` + +But do not run this function yet, just when the fun is about to start. + +## Layers + +Now up on the way to the cake top cherry, all we need are more and more *layers*. + +For example, you might import existing `shp` shapefiles or `geojson` data sources and add them to your project. +Here is how you would do that: + +``` python +layer_path: pl._local.PosixPath = project_path / f"geodata/{data_filename}.geojson" + +layer: QgsVectorLayer = QgsVectorLayer(path = str(layer_path), baseName = {data_layer_name}) +assert layer.isValid(), "Layer is not valid!" # should be a better check/raise in production + +project.addMapLayer(layer) # this will add the layer to the project +``` + +There [are similar objects and functions](https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/loadlayer.html) to get the different available data sources into QGIS; you find those well documented. +Make sure to provide a beautiful background map to help yourself and the users of your QGIS project to some basic orientation. + +Instead, for the purpose of this tutorial, we will create a new layer which will then hold spatial data, and a form to fill for fieldworkers. +Worth mentioning is the **`provider`**, i.e. the data back-end of your layer. +There are [many options](https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/loadlayer.html#vector-layers), most noteworthy `ogr`, `csv`, or `postgres`. +In the tutorial case, we will keep the data in `memory` without linking it to an external data storage. + +``` python +layer_name = "questionnaire" +layer_provider = "memory" +layer = QgsVectorLayer("Point", layer_name, layer_provider) +``` + +> **Note** +> +> Layers are the central connection between your data storage and the user interface. +> They hold attributes in an attribute table (the data), and control data entry and visualization via their *layer properties*. + +Note that you will not see your layer on the project unless you add it via `project.addMapLayer(layer)`. +However, right now, the layer is initialized and empty, and I will add it after finishing all preparation. +This is a general pattern of how PyQGIS works: you create an object, manipulate/fill/style it, and then associate it to the appropriate structure. + +## Attributes, Fields, and Features + +One of the first things to check on your layers is the **attribute table**. + + + +Data in the layers is organized in **fields** (columns). +When you add a row entry to the table, that is called a **feature**. +If you have a background in geographical sciences and relational databases / SQL, all of these terms will be familiar from different contexts; if not, they might need some getting used to. + +The primary service of a QGIS project, at least for my purposes, is to collect data in the field. +However, to get to that, it is important to have a meaningful data structure on the back-end. +**The Attribute Table is exactly that:** a visual display of the data table which stores your data. +Thus, the first thing we need to do is get all the relevant fields (i.e. columns) to the attribute table (assuming they are not previously loaded from an external source). + +On the Python side, we want to access the `dataProvider` of the layer, which you can access by calling the `.dataProvider()` function of the layer class. +Through that data provider, we can add the fields we would fill in later. + +``` python +data_provider = layer.dataProvider() + +data_provider.addAttributes([ \ + QgsField(field_label, field_dtype) \ + for field_label, field_dtype in [ + ("Answer 1", QMetaType.Type.Bool), + ("Answer 2A", QMetaType.Type.QString), + ("Answer 2B", QMetaType.Type.Int) + ] \ + ]) +layer.updateFields() # feed changes on the vector layer to the datasource + +# convenience function, see below +field_index_lookup = lambda field_label: layer.fields().indexFromName(field_label) +``` + +The `addAttributes()` function takes a list of `QgsField` elements, which you could as well predefine. +You see that here I initialized three question fields: a Boolean, an Integer, a String variable. +Those data types come directly [from the Qt back-end](https://doc.qt.io/qt-6/qmetatype.html#Type-enum), i.e. the part that contributes the Q to QGIS. +You may think of Qt as a layer even below the `app`. +Yet except when searching data types and basic GUI elements, you rarely have to dig this deep. + +Finally, the convenience function I defined there will help us finding the internal index for any field we want to access below. +It should be updated each time the fields of a layer are updated. + +So far, so good: +if you run all the above code, you should have a QGIS project with a point vector layer and an attribute table prepared, though no form yet. + +## Forms, Containers, and Widgets + +### Form Configurator + +The more fields to collect, the less user-friendly attribute management gets. +One of the strengths of the QGIS interface is that you can design dynamic forms which guide the field workers' data acquisition. +Programmatically constructing such a form in a Python script is a blast, once you get the components right. +We will start simple, then generalize. + +Whereas the `layer.dataProvider()` was the "back-end", i.e. the path to the attribute table, +there is also the `layer.editFormConfig()` to configure the "front-end" to the user. +In the GUI, you can find this in the "Layer (*right-click*) \>\> Properties", under **"Attributes Form"**. +Some extra options are visible in that GUI if you select "Drag and Drop Designer" layout. +The consistent integration of the Python back-end requires exactly the same steps, including selection of drag-and-drop layout. + +``` python +form_config = layer.editFormConfig() # accessing the form configurator +form_config.setLayout(Qgis.AttributeFormLayout(1)) # drag&drop layout +``` + +To be flexible within this notebook, I find it useful to append the `SaveAndExit()` function above at this point. + +``` python +## clean up, save, and optionally exit +def LayerSaveAndExitQGIS(quit_app = True): + layer.setEditFormConfig(form_config) + layer.updateFields() + project.addMapLayer(layer) + SaveAndExitQGIS(quit_app = quit_app) +``` + +### Root Container + +The first item present in any form configurator is the *root container*. +As the name suggests, it is at the root of each form, and we will place our widgets in a structured manner underneath that container. +First thing to do is to clear it, to start constructing a fresh form. + +``` python +root_container = form_config.invisibleRootContainer() +root_container.clear() +``` + +Containers are one type of widget: they can be used to visually group other widgets. +The root container is "invisible" in a sense that it does not have a label on top, and cannot be folded; yet it is "always visible" in a sense that it is the very root of your form structure. +This terminology is typical Qt and OOP GUI design heritage. + +### Text Widget + +Time to add our **first widget**: a simple text! + +``` python +question_text = """ +You take the blue pill... the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill... you stay in Wonderland, and I show you how deep the rabbit hole goes. +Will you take the *red* pill? +""" +form_qn_text = QgsAttributeEditorTextElement(name = "Question 1", parent = root_container) +form_qn_text.setText(question_text) +root_container.addChildElement(form_qn_text) +``` + +That was too simple. +Not really a challenge. +But, of course, text alone does not do much: we would like to interact with data. + +### Field Widget + +Therefore, we need a `QgsAttributeEditorField` (*read*: a "Field" in the "QgsAttributeEditor"), which specifically links to the fields above. + +``` python +# terminology: we seek an answer, not a question. +this_field_label = "Answer 1" + +# the widget defines *how* data is entered. +checkbox_widget = QgsEditorWidgetSetup( \ + 'CheckBox', { \ + 'AllowNullState': True, \ + 'CheckedState': 'red', \ + 'TextDisplayMethod': 1, \ + 'UncheckedState': 'blue' \ + }) + +# set up the field so that it will be set by the checkbox +layer.setEditorWidgetSetup(field_index_lookup(this_field_label), checkbox_widget) +``` + +Carefully observe the way PyQGIS works: +we have associated a data field with a checkbox. +This actually brings a checkbox to the **Attribute Table** editor of the layer. +We have not yet configured our form, or attached a checkbox to the form config's root container. +This is done as follows: + +``` python +# Note: the `name` must be equal to the field label +form_element = QgsAttributeEditorField( \ + name = this_field_label, \ + idx = field_index_lookup(this_field_label), \ + parent = root_container \ + ) + +# Then, we add the checkbox form element as a "child" of the root container +root_container.addChildElement(form_element) + +# style options: putting the field label on top (True) or on the left (False) of the form element +form_config.setLabelOnTop(field_index_lookup(this_field_label), False) +``` + +## More Widgets + +You may argue that the `CheckBox` widget is totally inappropriate for this particular question, and I would agree. +Obviously, the details that Neo could leave the box untouched, postponing or even avoiding any choice, or answer it again on another feature, are debatable. +But, hey, I am not Morpheus, and this is just QGIS. + +However, your may as a homework edit the widget above to make it a dropdown. +Solution hint is folded below. + +
+Code + +``` python +dropdown_widget = QgsEditorWidgetSetup( + 'ValueMap', {"map": {"Red": True, "Blue": False}} + ) +``` + +
+ +QGIS has many more widget options, which are controlled from the *attribute editor*. + +[Many different attribute editor elements exist](https://qgis.org/pyqgis/3.40/core/QgsAttributeEditorElement.html), and we already saw "Fields", which effectively change the data, or "TextElements", which are informative text; we will see "Containers" below, and there are also "spacers" and "HTML" elements. + +In terms of widgets for the Field elements, there a multitude of customization options, which might be hard to put in a general overview. +If you have a widget in mind, and would like to create it in python, [the following code](https://gis.stackexchange.com/a/346374) can be used to extract widget configurations from the QGIS Python console. +Create a layer with a layer name of choice, manually create and configure a widget in the Drag and Drop Layout designer, and track it in the console with the following code: + +``` python +# layer = QgsProject.instance().mapLayersByName("questionnaire")[0] +ews = layer.editorWidgetSetup(layer.fields().indexFromName("Answer 1")) +print("Type:", ews.type()) +print("Config:", ews.config()) +``` + +I found this immensely helpful to find my way around. + +### Recap + +At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, form elements, widgets, a root container. +Look at our depressingly simple form. + +![](images/fig1_simpleform.jpg) +
A first form widget. The red circle indicates the toolbar used for editing a layer, and adding features, which is what opens the form.

+ +# Generalization + +Acknowledged: we constructed a very simple, but already fully layered chocolate cake. +(And you might have the feeling by now that I keep promising too much cake.) +So, how about if I tell you that, instead of a single cake, you can create an entire bakery? + +Because, after all, this is Python! + +## Functions + +For example, we saw somewhat cumbersome code for creating that text element above. +Let's turn it into a function. + +``` python +def AddInfoText(question_text, label = "", parent = root_container): + text_element = QgsAttributeEditorTextElement(name = label, parent = parent) + text_element.setText(question_text) + parent.addChildElement(text_element) +``` + +Using a loop, you could spam out lines of form text with this function. + +## Classes + +Another helpful thing is automating the field element widget creation with a dedicated function. +Or a set of functions. +Or... How about... An **Object-Oriented Approach**? + +``` python +# define a FieldWidget class, +# which assembles all the actions necessary to create a form element, set a widget, +# and add everything to the form. +class FieldWidget(object): + def __init__(self, field_label, parent_container, widget = None): + # The "constructor" of a FieldWidget, + # which in this case does all the work of adding it to the form. + self.label = field_label + self.parent = parent_container + + if widget is not None: + self.SetWidget(widget) + + self.AddFormElement() + + def GetIndex(self): + # a simple "getter" function which uses the field lookup + return field_index_lookup(self.label) + + def SetWidget(self, widget): + # Note that layer and form_config are taken from a global context. + # You could of course do better by designing your own `Layer` class! + + layer.setEditorWidgetSetup(self.GetIndex(), widget) + + # putting the field label on top (True) or on the left (False) of the form element + form_config.setLabelOnTop(self.GetIndex(), False) + # TODO There must be more of these style setter functions in PyQGIS! + + def AddFormElement(self): + # appending this widget to the form + form_element = QgsAttributeEditorField( \ + name = self.label, \ + idx = self.GetIndex(), \ + parent = self.parent \ + ) + + self.parent.addChildElement(form_element) + + def __str__(self): + # functions with double underscores are Python "magic functions": + # this one defines how an object of this class is printed. + return f"A form field widget labeled {self.label}, stored under {self.parent}." +``` + +This can be used to quickly add Answer 2 to the form. +But maybe those should not be visible from the start. + +To control visibility, containers can help! + +## Containers + +The goal is to display `Answer 2A` and `Answer 2B`, depending on the choice in `Answer 1`. +In real life examples, there are many more questions and answers, and you might not want to show them at the same time (I envision huge, dynamic trees of forms evolving, now you know how to dynamically program them). + +Do not Repeat Yourself: two answers, two containers, this calls for a function. +Something new on the way: you can control container visibility with an SQL condition (i.e. an expression which returns TRUE or FALSE). + +``` python +def CreateContainer(label, parent = root_container, visibility_condition = None): + # create a container, optionally controlling visibility with an expression + + # prepare the container + container = QgsAttributeEditorContainer(name = label, parent = parent) + + # set visibility to be dynamically controlled + if visibility_condition is not None: + visexp = QgsExpression(visibility_condition) + container.setVisibilityExpression(QgsOptionalExpression(visexp)) + + return container +``` + +I get why you might find the above expressions extra confusing: we effectively use +`.setVisibilityExpression(QgsOptionalExpression(QgsExpression(expression)))`. +Express yourself! +And accept the strange beauty of an organically grown object-oriented construct. + +In practice, you deal with this sort of things by defining your own wrapper classes and functions. + +## Application: Question 2 + +We still need widgets to decide how the user is supposed to answer our questions, don't we? + +``` python +question_widgets = {} + +# The String field can be entered by a free edit field. +# QgsEditorWidgetSetup( \ +# 'TextEdit', { \ +# 'IsMultiline': True, \ +# 'UseHtml': False \ +# }) + +# We allow date selection with a calender tool. +question_widgets["Answer 2A"] = QgsEditorWidgetSetup( + 'DateTime', { + 'allow_null': True, + 'calendar_popup': True, + 'display_format': 'd/M/yy', + 'field_format': 'yyyyMMdd', + 'field_format_overwrite': False, + 'field_iso_format': False + }) + + +# The integer field shall have a list of possible values. +# Note the structure of the map dict is {'displayed text': data_value, ...} +question_widgets["Answer 2B"] = QgsEditorWidgetSetup( \ + 'ValueMap', \ + {'map': { \ + 'The Original': 1, \ + 'Reloaded': 2, \ + 'Revolutions': 3, \ + 'Resurrections': 4, \ + 'I have never seen any!': 0 \ + }} \ + ) +``` + +Behold how this can quickly create a slightly more involved and dynamic form. + +``` python +questions = { + "Answer 2A": "When was the date that you first saw The Matrix?", \ + "Answer 2B": "Which of the Matrix movies is the best?", \ +} +for answer, question in questions.items(): + container = CreateContainer( + label = answer.replace("Answer", "Block"), + parent = root_container, + visibility_condition = "\"Answer 1\" = " + ("TRUE" if "2A" in answer else "FALSE") + ) + + AddInfoText(question, label = answer.replace("Answer", "Question"), parent = container) + + widget = FieldWidget(answer, container, widget = question_widgets[answer]) + + root_container.addChildElement(container) +``` + +I hope you see how this scales. +The functions and objects give dedicated structure to the otherwise cryptic objects in PyQGIS, redundancies are reduced, which facilitates debugging. + +Still, things can go wrong. + +## Braking Vases + +Whenever PyQGIS does not work as intended, fire up QGIS, run the Python console, and paste in some of your commands to check on the fly whether they do what they are supposed to do. +Some basic helpers in Python are `print(dir())` and `help()`, and those work just as well within QGIS. + +But why should it not work as intended, eh? + +Ah, and never mind shutting down the QGIS app. + +``` python +LayerSaveAndExitQGIS() +``` + +> *Oh... What's really going to bake your noodle later on is, would you still have broken it if I hadn't said anything.* + +# Summary + +Congratulations! +This may have been your first steps to the QGIS Python console. +Maybe your first steps in Python at all. + +I hope to have given you some directions of how to auto-construct custom forms with PyQGIS. +If you have a meaningful way to store your questionnaires, determination keys, and field data assembly structures, take it from here and bring them to QGIS. +I mentioned the advantages above. + +You might use R to handle your GIS data, and only use Python for parsing it to QGIS. +And you could spin up a [QFieldCloud](https://qfield.cloud) for sync or a custom [PostGIS server](https://docs.qgis.org/3.40/en/docs/training_manual/spatial_databases/spatial_functions.html) as a data source. +Finally, [QField](https://qfield.org) is an outstandig app, a highly optimized mobile phone interface to your QGIS projects. +All of these are part of the "QGIS Matrix", and in this tutorial you got introduced to its Python foundation. + +As always, questions and feedback are welcome! + +# Versions + +The following software versions were used at the time of writing: + + + python 3.13.2-1 + qgis 3.42.1-2 + qt5-base 5.15.16+kde+r130-4 + python-pyqt5 5.15.11-2 + +[^1]: "Blender" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly. diff --git a/content/tutorials/qgis_forms/index.qmd b/content/tutorials/qgis_forms/index.qmd index ac90d43d7..6035a849e 100644 --- a/content/tutorials/qgis_forms/index.qmd +++ b/content/tutorials/qgis_forms/index.qmd @@ -21,8 +21,8 @@ format: ```{=markdown} --- -title: "Scripted Generation of Forms in QGIS" -description: "Using Python to auto-generate forms for field data caption." +title: "Scripted Generation of GIS Data Forms Using PyQGIS" +description: "Editing a QGIS project without opening QGIS." date: "2025-04-09" authors: [falkmielke] categories: ["gis", "python", "development"] @@ -47,38 +47,45 @@ As a kid, you might have taken the challenge of eating chocolate cake without us What fun it was. I find it a pity that we do not do this any more. - +````{=markdown} +```{=html} +The image of a toddler's face after eating chocolate. +``` +```` + +`
Photo by Wilfried Santer on Unsplash

`{=markdown} If you still feel brave, consider taking up this challenge again next weekend. -I would not consider this a totally infantile exercise: is is an exercise in the art of reductionism, reducing our dependence on the trivial tools which we are so much used to, growing appreciation for everyday actions, gaining a new perspective. +I would not consider this a totally infantile exercise: is is an exercise in the art of reductionism, experiencing our dependence on the trivial tools which we are so much used to, growing appreciation for everyday actions, gaining a new, yet familiar perspective. And, as is the causality of things, you might remember this notebook next time you see chocolate cake. In a way, this tutorial attempts to do something similar to eating cake without using your hands. I will demonstrate how to **edit a QGIS project -- without opening QGIS.** -Do not get me wrong: QGIS is an outstanding software tool by itself. +Please do not get me wrong: QGIS is an outstanding software tool by itself. The interface is simple and intuitive, yet gives you powerful options to manipulate spatial data from a variety of sources. -Yet there are a few FOSS tools which go one step further: they expose their inner workings by enabling scripting in a programming language. -"Blender" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly. -QGIS also has a Python back-end, and exposes it via an internal editor. +Yet there are a few FOSS tools which go one step further[^1]: they expose their inner workings by enabling scripting in a programming language. +QGIS has a Python back-end, and exposes it via an internal editor. It is worthwile to train using and understanding this feature. -Leaving the world you know (the QGIS GUI) to enter the Matrix. +[^1]: "Blender" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly. -```{=markdown} -Govt. Holkar College +Prepare to leave the world you know (the QGIS GUI), and enter *The Matrix*. + +````{=markdown} +```{=html} +Digital rain: green letters falling across the screen (The Matrix). ``` +```` Because, you know, the immediate utility of this skill is much more obvious than in the cake analogy. If you have QGIS under your scripts, you can automate data chains, version control data sources, document changes, dynamically customize elements, and learn about the inner workings of this fabulous, open GIS software program. -On the way, you will learn about the basic components and elements of QGIS, and GIS in general. +On the way, you will learn about the basic components and elements of QGIS, and GIS in general, and I might sprinkle in a Python trick or two. -And you will see that scripting QGIS is just a piece of cake. + +You will see that scripting QGIS is just a piece of cake. Grab a coffee. *Take a cookie… and everything will be right as rain.* And enjoy reading! @@ -86,7 +93,20 @@ And enjoy reading! # QGIS Interface and References -TODO + +Introducing you to QGIS is beyond the scope of this tutorial, since there are excellent sources available online. + +- The official documentation: +- General youtube series by "GISWorld": < https://www.youtube.com/playlist?list=PLCxnvDblgXGQHKgnbRTFB6a6AeKqYy9-9> +- PyQGIS series by "GISWorld": < https://www.youtube.com/playlist?list=PLCxnvDblgXGRzlmmVgAxpTJc60Rklxe8R> +- PyQGIS "masterclass" tutorial: +- See also `QGISProcess` for R bindings: + + +I personally found the trickiest part to be figuring out the QGIS-specific vocabulary. +If you have a background in geospatial analysis, you might struggle more with the workings of Python. +I will attempt to facilitate both. + The code below is designed to be standalone, for the sake of this tutorial. However, whith some minor tweaks, it should also work well in the QGIS Python console. @@ -100,8 +120,6 @@ from qgis.PyQt.QtCore import QMetaType, QVariant import pathlib as pl ``` -TODO installing PyQGIS - # Constructing Form Elements @@ -109,6 +127,7 @@ The more I think about it, the more I like the chocolate cake analogy. Because, you see: just like in the *good* chocolate tarts, a QGIS project consists of many layers which are stapled one above the other. We will work our way from the ground up. + ## App If you run QGIS from within Python, you might want to tell your Python interpreter where to find the QGIS installation. @@ -234,13 +253,13 @@ When you add a row entry to the table, that is called a **feature**. If you have a background in geographical sciences and relational databases / SQL, all of these terms will be familiar from different contexts; if not, they might need some getting used to. -The primary service of a QGIS project is to collect data in the field. +The primary service of a QGIS project, at least for my purposes, is to collect data in the field. However, to get to that, it is important to have a meaningful data structure on the back-end. -**The attribute table is exactly that.** -Thus, the first thing we need to do is get all the relevant fields to the attribute table (assuming they are already loaded from an external source). +**The Attribute Table is exactly that:** a visual display of the data table which stores your data. +Thus, the first thing we need to do is get all the relevant fields (i.e. columns) to the attribute table (assuming they are not previously loaded from an external source). -On the Python side, we want to access the `dataProvider` of the layer. +On the Python side, we want to access the `dataProvider` of the layer, which you can access by calling the `.dataProvider()` function of the layer class. Through that data provider, we can add the fields we would fill in later. ```{python layer-data} @@ -254,22 +273,26 @@ data_provider.addAttributes([ \ ("Answer 2B", QMetaType.Type.Int) ] \ ]) -layer.updateFields() # feed changes of the datasource to the vector layer +layer.updateFields() # feed changes on the vector layer to the datasource -# convenience function +# convenience function, see below field_index_lookup = lambda field_label: layer.fields().indexFromName(field_label) ``` The `addAttributes()` function takes a list of `QgsField` elements, which you could as well predefine. You see that here I initialized three question fields: a Boolean, an Integer, a String variable. -Those data types come directly [from the Qt back-end](https://doc.qt.io/qt-6/qmetatype.html#Type-enum), i.e. the part that contributes the Q to QGIS. +Those data types come directly [from the Qt back-end](https://doc.qt.io/qt-6/qmetatype.html#Type-enum), i.e. the part that contributes the Q to QGIS. +You may think of Qt as a layer even below the `app`. +Yet except when searching data types and basic GUI elements, you rarely have to dig this deep. + -Finally, the convenience function I defined there will help us find the internal index for any field we want to access below. +Finally, the convenience function I defined there will help us finding the internal index for any field we want to access below. It should be updated each time the fields of a layer are updated. So far, so good: -if you run all the above code, you should have a QGIS project with a point vector layer and an attribute table prepared. +if you run all the above code, you should have a QGIS project with a point vector layer and an attribute table prepared, though no form yet. + ## Forms, Containers, and Widgets @@ -311,7 +334,7 @@ def LayerSaveAndExitQGIS(quit_app = True): ### Root Container -The first item present in any form is the *root container*. +The first item present in any form configurator is the *root container*. As the name suggests, it is at the root of each form, and we will place our widgets in a structured manner underneath that container. First thing to do is to clear it, to start constructing a fresh form. @@ -322,6 +345,7 @@ root_container.clear() Containers are one type of widget: they can be used to visually group other widgets. The root container is "invisible" in a sense that it does not have a label on top, and cannot be folded; yet it is "always visible" in a sense that it is the very root of your form structure. +This terminology is typical Qt and OOP GUI design heritage. ### Text Widget @@ -350,8 +374,10 @@ But, of course, text alone does not do much: we would like to interact with data Therefore, we need a `QgsAttributeEditorField` (*read*: a "Field" in the "QgsAttributeEditor"), which specifically links to the fields above. ```{python field-widget-creation} +# terminology: we seek an answer, not a question. this_field_label = "Answer 1" +# the widget defines *how* data is entered. checkbox_widget = QgsEditorWidgetSetup( \ 'CheckBox', { \ 'AllowNullState': True, \ @@ -360,18 +386,15 @@ checkbox_widget = QgsEditorWidgetSetup( \ 'UncheckedState': 'blue' \ }) -# define the field to be set by a checkbox +# set up the field so that it will be set by the checkbox layer.setEditorWidgetSetup(field_index_lookup(this_field_label), checkbox_widget) -# putting the field label on top (True) or on the left (False) of the form element -form_config.setLabelOnTop(field_index_lookup(this_field_label), False) - ``` Carefully observe the way PyQGIS works: we have associated a data field with a checkbox. -This actually brings a checkbox to the Attribute Table editor. +This actually brings a checkbox to the **Attribute Table** editor of the layer. We have not yet configured our form, or attached a checkbox to the form config's root container. This is done as follows: @@ -387,16 +410,20 @@ form_element = QgsAttributeEditorField( \ # Then, we add the checkbox form element as a "child" of the root container root_container.addChildElement(form_element) +# style options: putting the field label on top (True) or on the left (False) of the form element +form_config.setLabelOnTop(field_index_lookup(this_field_label), False) + ``` + ## More Widgets You may argue that the `CheckBox` widget is totally inappropriate for this particular question, and I would agree. -Even the details that Neo could leave the box untouched, postponing or even avoiding any choice, or answer it again on another feature, are debatable. +Obviously, the details that Neo could leave the box untouched, postponing or even avoiding any choice, or answer it again on another feature, are debatable. But, hey, I am not Morpheus, and this is just QGIS. However, your may as a homework edit the widget above to make it a dropdown. -Solution is folded below. +Solution hint is folded below. ```{python value-map-widget} #| eval: false @@ -409,11 +436,11 @@ dropdown_widget = QgsEditorWidgetSetup( ``` -QGIS has many more options, which are controlled from the *attribute editor*. +QGIS has many more widget options, which are controlled from the *attribute editor*. -[Many different attribute editor elements exist](https://qgis.org/pyqgis/3.40/core/QgsAttributeEditorElement.html), and we already saw "Fields", which effectively change the data, or "TextElements", which are informative text (there are also spacers and HTML). +[Many different attribute editor elements exist](https://qgis.org/pyqgis/3.40/core/QgsAttributeEditorElement.html), and we already saw "Fields", which effectively change the data, or "TextElements", which are informative text; we will see "Containers" below, and there are also "spacers" and "HTML" elements. -In terms of widgets for the Field elements, there a multitude of customization options, which might be hard to put in an overview. +In terms of widgets for the Field elements, there a multitude of customization options, which might be hard to put in a general overview. If you have a widget in mind, and would like to create it in python, [the following code](https://gis.stackexchange.com/a/346374) can be used to extract widget configurations from the QGIS Python console. Create a layer with a layer name of choice, manually create and configure a widget in the Drag and Drop Layout designer, and track it in the console with the following code: @@ -426,11 +453,11 @@ print("Type:", ews.type()) print("Config:", ews.config()) ``` -I hope this helps you to find your way around. +I found this immensely helpful to find my way around. ### Recap -At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, widgets, a root container, and form elements. +At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, form elements, widgets, a root container. Look at our depressingly simple form. ![](images/fig1_simpleform.jpg) @@ -439,16 +466,16 @@ Look at our depressingly simple form. # Generalization -Acknowledged: we constructed a fully layered chocolate cake. -And you might have realized by now that I keep promising too much cake. -So, how about if I tell you that, instead of a single cake, you can create a bakery? +Acknowledged: we constructed a very simple, but already fully layered chocolate cake. +(And you might have the feeling by now that I keep promising too much cake.) +So, how about if I tell you that, instead of a single cake, you can create an entire bakery? Because, after all, this is Python! ## Functions -For example, we had that text element above. +For example, we saw somewhat cumbersome code for creating that text element above. Let's turn it into a function. ```{python form-text-function} @@ -471,8 +498,13 @@ Or... How about... An **Object-Oriented Approach**? ```{python form-widget-object} +# define a FieldWidget class, +# which assembles all the actions necessary to create a form element, set a widget, +# and add everything to the form. class FieldWidget(object): def __init__(self, field_label, parent_container, widget = None): + # The "constructor" of a FieldWidget, + # which in this case does all the work of adding it to the form. self.label = field_label self.parent = parent_container @@ -482,6 +514,7 @@ class FieldWidget(object): self.AddFormElement() def GetIndex(self): + # a simple "getter" function which uses the field lookup return field_index_lookup(self.label) def SetWidget(self, widget): @@ -505,6 +538,8 @@ class FieldWidget(object): self.parent.addChildElement(form_element) def __str__(self): + # functions with double underscores are Python "magic functions": + # this one defines how an object of this class is printed. return f"A form field widget labeled {self.label}, stored under {self.parent}." @@ -520,7 +555,7 @@ To control visibility, containers can help! ## Containers The goal is to display `Answer 2A` and `Answer 2B`, depending on the choice in `Answer 1`. -In real life examples, there are many more questions and answers, and you might not want to show them at the same time, thus huge trees of forms evolve. +In real life examples, there are many more questions and answers, and you might not want to show them at the same time (I envision huge, dynamic trees of forms evolving, now you know how to dynamically program them). Do not Repeat Yourself: two answers, two containers, this calls for a function. @@ -535,7 +570,7 @@ def CreateContainer(label, parent = root_container, visibility_condition = None) # prepare the container container = QgsAttributeEditorContainer(name = label, parent = parent) - # set visibility + # set visibility to be dynamically controlled if visibility_condition is not None: visexp = QgsExpression(visibility_condition) container.setVisibilityExpression(QgsOptionalExpression(visexp)) @@ -548,7 +583,7 @@ I get why you might find the above expressions extra confusing: we effectively u Express yourself! And accept the strange beauty of an organically grown object-oriented construct. -In practice, you deal with these things by defining your own wrapper functions. +In practice, you deal with this sort of things by defining your own wrapper classes and functions. ## Application: Question 2 @@ -579,9 +614,16 @@ question_widgets["Answer 2A"] = QgsEditorWidgetSetup( # The integer field shall have a list of possible values. +# Note the structure of the map dict is {'displayed text': data_value, ...} question_widgets["Answer 2B"] = QgsEditorWidgetSetup( \ 'ValueMap', \ - {'map': {'The Original': 1, 'Reloaded': 2, 'Revolutions': 3, 'Resurrections': 4, 'I have never seen any!': 0}} \ + {'map': { \ + 'The Original': 1, \ + 'Reloaded': 2, \ + 'Revolutions': 3, \ + 'Resurrections': 4, \ + 'I have never seen any!': 0 \ + }} \ ) ``` @@ -620,16 +662,18 @@ Still, things can go wrong. ## Braking Vases Whenever PyQGIS does not work as intended, fire up QGIS, run the Python console, and paste in some of your commands to check on the fly whether they do what they are supposed to do. -But why should it go wrong? +Some basic helpers in Python are `print(dir())` and `help()`, and those work just as well within QGIS. + +But why should it not work as intended, eh? -Ah, and don't worry about shutting down the QGIS app. +Ah, and never mind shutting down the QGIS app. ```{python finalize-qgis} LayerSaveAndExitQGIS() ``` -> Oh… What’s really going to bake your noodle later on is, would you still have broken it if I hadn’t said anything. +> *Oh… What’s really going to bake your noodle later on is, would you still have broken it if I hadn’t said anything.* # Summary @@ -643,5 +687,24 @@ I hope to have given you some directions of how to auto-construct custom forms w If you have a meaningful way to store your questionnaires, determination keys, and field data assembly structures, take it from here and bring them to QGIS. I mentioned the advantages above. +You might use R to handle your GIS data, and only use Python for parsing it to QGIS. +And you could spin up a [QFieldCloud](https://qfield.cloud) for sync or a custom [PostGIS server](https://docs.qgis.org/3.40/en/docs/training_manual/spatial_databases/spatial_functions.html) as a data source. +Finally, [QField](https://qfield.org) is an outstandig app, a highly optimized mobile phone interface to your QGIS projects. +All of these are part of the "QGIS Matrix", and in this tutorial you got introduced to its Python foundation. + As always, questions and feedback are welcome! + + +# Versions + +The following software versions were used at the time of writing: + +``` +python 3.13.2-1 +qgis 3.42.1-2 +qt5-base 5.15.16+kde+r130-4 +python-pyqt5 5.15.11-2 +``` From 75f9834cdc04e340cc3e271afc93b1fee259f2a1 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Wed, 9 Apr 2025 14:31:23 +0200 Subject: [PATCH 3/8] qgis-forms: remove "python" category --- content/tutorials/qgis_forms/index.qmd | 2 +- static/list_of_categories | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/content/tutorials/qgis_forms/index.qmd b/content/tutorials/qgis_forms/index.qmd index 6035a849e..f614c146e 100644 --- a/content/tutorials/qgis_forms/index.qmd +++ b/content/tutorials/qgis_forms/index.qmd @@ -25,7 +25,7 @@ title: "Scripted Generation of GIS Data Forms Using PyQGIS" description: "Editing a QGIS project without opening QGIS." date: "2025-04-09" authors: [falkmielke] -categories: ["gis", "python", "development"] +categories: ["gis", "development"] tags: ["python", "spatial", "gis", "qgis", "forms", "fieldwork"] number-sections: true link-citations: true diff --git a/static/list_of_categories b/static/list_of_categories index 98e390b0e..2855a2478 100644 --- a/static/list_of_categories +++ b/static/list_of_categories @@ -1,5 +1,4 @@ r -python statistics gis databases From 41ef1dbfbc5245a6923d90e55ad7d901f58a5904 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Wed, 9 Apr 2025 14:34:19 +0200 Subject: [PATCH 4/8] qgis-forms: error in the `md` file --- content/tutorials/qgis_forms/index.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/content/tutorials/qgis_forms/index.md b/content/tutorials/qgis_forms/index.md index c9200f974..4dee9f691 100644 --- a/content/tutorials/qgis_forms/index.md +++ b/content/tutorials/qgis_forms/index.md @@ -1,6 +1,3 @@ -# Constructing Form Elements - - --- title: "Scripted Generation of GIS Data Forms Using PyQGIS" description: "Editing a QGIS project without opening QGIS." From 839c405a28b1516d50086b75018da2e9d377ffe0 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Wed, 9 Apr 2025 14:39:12 +0200 Subject: [PATCH 5/8] qgis-forms: image; python category --- content/tutorials/qgis_forms/index.qmd | 7 +++---- static/list_of_categories | 1 + 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/tutorials/qgis_forms/index.qmd b/content/tutorials/qgis_forms/index.qmd index f614c146e..e5e9d67ed 100644 --- a/content/tutorials/qgis_forms/index.qmd +++ b/content/tutorials/qgis_forms/index.qmd @@ -25,7 +25,7 @@ title: "Scripted Generation of GIS Data Forms Using PyQGIS" description: "Editing a QGIS project without opening QGIS." date: "2025-04-09" authors: [falkmielke] -categories: ["gis", "development"] +categories: ["gis", "development", "python"] tags: ["python", "spatial", "gis", "qgis", "forms", "fieldwork"] number-sections: true link-citations: true @@ -48,13 +48,12 @@ What fun it was. I find it a pity that we do not do this any more. ````{=markdown} -```{=html} -The image of a toddler's face after eating chocolate. -``` +![The image of a toddler's face after eating chocolate.]("https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop" "Foto by Wilfried Santer, via Unsplash") ```` `
Photo by Wilfried Santer on Unsplash

`{=markdown} + If you still feel brave, consider taking up this challenge again next weekend. I would not consider this a totally infantile exercise: is is an exercise in the art of reductionism, experiencing our dependence on the trivial tools which we are so much used to, growing appreciation for everyday actions, gaining a new, yet familiar perspective. And, as is the causality of things, you might remember this notebook next time you see chocolate cake. diff --git a/static/list_of_categories b/static/list_of_categories index 2855a2478..98e390b0e 100644 --- a/static/list_of_categories +++ b/static/list_of_categories @@ -1,4 +1,5 @@ r +python statistics gis databases From 1859db4923bfe6b5af073916fd35dd9c9973d6ab Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Wed, 9 Apr 2025 14:39:53 +0200 Subject: [PATCH 6/8] qgis-forms: see before ++md file --- content/tutorials/qgis_forms/index.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/content/tutorials/qgis_forms/index.md b/content/tutorials/qgis_forms/index.md index 4dee9f691..ca0f71470 100644 --- a/content/tutorials/qgis_forms/index.md +++ b/content/tutorials/qgis_forms/index.md @@ -3,7 +3,7 @@ title: "Scripted Generation of GIS Data Forms Using PyQGIS" description: "Editing a QGIS project without opening QGIS." date: "2025-04-09" authors: [falkmielke] -categories: ["gis", "python", "development"] +categories: ["gis", "development", "python"] tags: ["python", "spatial", "gis", "qgis", "forms", "fieldwork"] number-sections: true link-citations: true @@ -23,9 +23,7 @@ As a kid, you might have taken the challenge of eating chocolate cake without us What fun it was. I find it a pity that we do not do this any more. -```{=html} -The image of a toddler's face after eating chocolate. -``` +![The image of a toddler's face after eating chocolate.]("https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop" "Foto by Wilfried Santer, via Unsplash")
Photo by Wilfried Santer on Unsplash

From 024b756352fd59112dd7bb7b69c24f3717431451 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Wed, 9 Apr 2025 14:59:55 +0200 Subject: [PATCH 7/8] qgis-forms: move images, add result --- content/tutorials/qgis_forms/index.md | 24 +++++++++++++----- content/tutorials/qgis_forms/index.qmd | 19 +++++++++----- .../tutorials/qgis_forms}/fig1_simpleform.jpg | Bin .../tutorials/qgis_forms/fig2_dynamicform.jpg | Bin 0 -> 260739 bytes 4 files changed, 31 insertions(+), 12 deletions(-) rename {content/tutorials/qgis_forms/images => static/images/tutorials/qgis_forms}/fig1_simpleform.jpg (100%) create mode 100644 static/images/tutorials/qgis_forms/fig2_dynamicform.jpg diff --git a/content/tutorials/qgis_forms/index.md b/content/tutorials/qgis_forms/index.md index ca0f71470..e3228e89e 100644 --- a/content/tutorials/qgis_forms/index.md +++ b/content/tutorials/qgis_forms/index.md @@ -23,7 +23,7 @@ As a kid, you might have taken the challenge of eating chocolate cake without us What fun it was. I find it a pity that we do not do this any more. -![The image of a toddler's face after eating chocolate.]("https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop" "Foto by Wilfried Santer, via Unsplash") +![The image of a toddler's face after eating chocolate.](https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop "Foto by Wilfried Santer, via Unsplash")
Photo by Wilfried Santer on Unsplash

@@ -42,9 +42,7 @@ It is worthwile to train using and understanding this feature. Prepare to leave the world you know (the QGIS GUI), and enter *The Matrix*. -```{=html} -Digital rain: green letters falling across the screen (The Matrix). -``` +[![Digital rain: green letters falling across the screen (The Matrix).](https://upload.wikimedia.org/wikipedia/commons/c/cc/Digital_rain_animation_medium_letters_shine.gif?20171014215546 "Jahobr, CC0, via Wikimedia Commons")](https://commons.wikimedia.org/wiki/File:Digital_rain_animation_medium_letters_shine.gif) Because, you know, the immediate utility of this skill is much more obvious than in the cake analogy. If you have QGIS under your scripts, you can automate data chains, version control data sources, document changes, dynamically customize elements, and learn about the inner workings of this fabulous, open GIS software program. @@ -81,6 +79,9 @@ from qgis.PyQt.QtCore import QMetaType, QVariant import pathlib as pl ``` + +# Constructing Form Elements + The more I think about it, the more I like the chocolate cake analogy. Because, you see: just like in the *good* chocolate tarts, a QGIS project consists of many layers which are stapled one above the other. We will work our way from the ground up. @@ -377,8 +378,12 @@ I found this immensely helpful to find my way around. At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, form elements, widgets, a root container. Look at our depressingly simple form. -![](images/fig1_simpleform.jpg) -
A first form widget. The red circle indicates the toolbar used for editing a layer, and adding features, which is what opens the form.

+
+A simple QGIS form. +
+A first form widget. The red circle indicates the toolbar used for editing a layer, and adding features, which is what opens the form. +
+
# Generalization @@ -550,6 +555,13 @@ for answer, question in questions.items(): root_container.addChildElement(container) ``` +
+A more advanced QGIS form with dynamically changing content, all made in Python. +
+A more advanced QGIS form with dynamically changing content, all made in Python. +
+
+ I hope you see how this scales. The functions and objects give dedicated structure to the otherwise cryptic objects in PyQGIS, redundancies are reduced, which facilitates debugging. diff --git a/content/tutorials/qgis_forms/index.qmd b/content/tutorials/qgis_forms/index.qmd index e5e9d67ed..ebf44031d 100644 --- a/content/tutorials/qgis_forms/index.qmd +++ b/content/tutorials/qgis_forms/index.qmd @@ -48,7 +48,7 @@ What fun it was. I find it a pity that we do not do this any more. ````{=markdown} -![The image of a toddler's face after eating chocolate.]("https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop" "Foto by Wilfried Santer, via Unsplash") +![The image of a toddler's face after eating chocolate.](https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop "Foto by Wilfried Santer, via Unsplash") ```` `
Photo by Wilfried Santer on Unsplash

`{=markdown} @@ -73,9 +73,7 @@ It is worthwile to train using and understanding this feature. Prepare to leave the world you know (the QGIS GUI), and enter *The Matrix*. ````{=markdown} -```{=html} -Digital rain: green letters falling across the screen (The Matrix). -``` +[![Digital rain: green letters falling across the screen (The Matrix).](https://upload.wikimedia.org/wikipedia/commons/c/cc/Digital_rain_animation_medium_letters_shine.gif?20171014215546 "Jahobr, CC0, via Wikimedia Commons")](https://commons.wikimedia.org/wiki/File:Digital_rain_animation_medium_letters_shine.gif) ```` @@ -459,8 +457,11 @@ I found this immensely helpful to find my way around. At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, form elements, widgets, a root container. Look at our depressingly simple form. -![](images/fig1_simpleform.jpg) -`
A first form widget. The red circle indicates the toolbar used for editing a layer, and adding features, which is what opens the form.

`{=markdown} + +
+A simple QGIS form. +
A first form widget. The red circle indicates the toolbar used for editing a layer, and adding features, which is what opens the form.
+
# Generalization @@ -652,6 +653,12 @@ for answer, question in questions.items(): ``` +
+A more advanced QGIS form with dynamically changing content, all made in Python. +
A more advanced QGIS form with dynamically changing content, all made in Python.
+
+ + I hope you see how this scales. The functions and objects give dedicated structure to the otherwise cryptic objects in PyQGIS, redundancies are reduced, which facilitates debugging. diff --git a/content/tutorials/qgis_forms/images/fig1_simpleform.jpg b/static/images/tutorials/qgis_forms/fig1_simpleform.jpg similarity index 100% rename from content/tutorials/qgis_forms/images/fig1_simpleform.jpg rename to static/images/tutorials/qgis_forms/fig1_simpleform.jpg diff --git a/static/images/tutorials/qgis_forms/fig2_dynamicform.jpg b/static/images/tutorials/qgis_forms/fig2_dynamicform.jpg new file mode 100644 index 0000000000000000000000000000000000000000..492db1fd12f29ae4757c8d91fb185c7983f91a08 GIT binary patch literal 260739 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Ξ7z?TR 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

dri}N%86o!)tmN6D!PH$-!m86H7 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 I?cde^04-7zI{*Lx literal 0 HcmV?d00001 From 154a0a8941df58b8eaa42c8d0116a3233c233166 Mon Sep 17 00:00:00 2001 From: Falk Mielke Date: Thu, 10 Apr 2025 08:00:28 +0200 Subject: [PATCH 8/8] qgis-forms: proefread. --- content/tutorials/qgis_forms/index.md | 82 ++++++++++++++++--------- content/tutorials/qgis_forms/index.qmd | 85 +++++++++++++++++--------- 2 files changed, 109 insertions(+), 58 deletions(-) diff --git a/content/tutorials/qgis_forms/index.md b/content/tutorials/qgis_forms/index.md index e3228e89e..7018eb475 100644 --- a/content/tutorials/qgis_forms/index.md +++ b/content/tutorials/qgis_forms/index.md @@ -20,23 +20,23 @@ format: Life was good before we were exposed to its real challenges, wasn't it? As a kid, you might have taken the challenge of eating chocolate cake without using your hands. -What fun it was. -I find it a pity that we do not do this any more. +What fun that was. +I find it a pity that we "grown-ups" do not do this any more. ![The image of a toddler's face after eating chocolate.](https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop "Foto by Wilfried Santer, via Unsplash")
Photo by Wilfried Santer on Unsplash

-If you still feel brave, consider taking up this challenge again next weekend. +If you still feel brave, how about taking that challenge up again next weekend? I would not consider this a totally infantile exercise: is is an exercise in the art of reductionism, experiencing our dependence on the trivial tools which we are so much used to, growing appreciation for everyday actions, gaining a new, yet familiar perspective. And, as is the causality of things, you might remember this notebook next time you see chocolate cake. In a way, this tutorial attempts to do something similar to eating cake without using your hands. -I will demonstrate how to **edit a QGIS project -- without opening QGIS.** +I will demonstrate how to **edit a QGIS project -- without opening QGIS**, with a particular focus on creating dynamic forms. -Please do not get me wrong: QGIS is an outstanding software tool by itself. +Please do not get this wrong: QGIS is an outstanding software tool by itself. The interface is simple and intuitive, yet gives you powerful options to manipulate spatial data from a variety of sources. -Yet there are a few FOSS tools which go one step further[^1]: they expose their inner workings by enabling scripting in a programming language. +There are a few FOSS tools which go a step further than the norm[^1]: they expose their inner workings by enabling scripting in a programming language. QGIS has a Python back-end, and exposes it via an internal editor. It is worthwile to train using and understanding this feature. @@ -45,7 +45,11 @@ Prepare to leave the world you know (the QGIS GUI), and enter *The Matrix*. [![Digital rain: green letters falling across the screen (The Matrix).](https://upload.wikimedia.org/wikipedia/commons/c/cc/Digital_rain_animation_medium_letters_shine.gif?20171014215546 "Jahobr, CC0, via Wikimedia Commons")](https://commons.wikimedia.org/wiki/File:Digital_rain_animation_medium_letters_shine.gif) Because, you know, the immediate utility of this skill is much more obvious than in the cake analogy. + +{{% callout emphasize %}} If you have QGIS under your scripts, you can automate data chains, version control data sources, document changes, dynamically customize elements, and learn about the inner workings of this fabulous, open GIS software program. +{{% /callout %}} + On the way, you will learn about the basic components and elements of QGIS, and GIS in general, and I might sprinkle in a Python trick or two. You will see that scripting QGIS is just a piece of cake. @@ -55,7 +59,7 @@ And enjoy reading! # QGIS Interface and References -Introducing you to QGIS is beyond the scope of this tutorial, since there are excellent sources available online. +Introducing QGIS from the beginning is beyond the scope of this tutorial, but there are excellent sources available online. - The official documentation: - General youtube series by "GISWorld": \< https://www.youtube.com/playlist?list=PLCxnvDblgXGQHKgnbRTFB6a6AeKqYy9-9\> @@ -64,7 +68,7 @@ Introducing you to QGIS is beyond the scope of this tutorial, since there are ex - See also `QGISProcess` for R bindings: I personally found the trickiest part to be figuring out the QGIS-specific vocabulary. -If you have a background in geospatial analysis, you might struggle more with the workings of Python. +If you have a background in geospatial analysis, but did not use Python before, you might struggle more with the workings of that programming language. I will attempt to facilitate both. The code below is designed to be standalone, for the sake of this tutorial. @@ -116,6 +120,7 @@ Certainly set your project CRS, otherwise all data is flawed and all hope is los ``` python project = QgsProject.instance() # taking a new QGIS project instance as our project. +# at INBO we usually turn to EPSG:31370 BD72 / Belgian Lambert 72 project_crs = QgsCoordinateReferenceSystem.fromEpsgId(31370) project.setCrs(project_crs) ``` @@ -137,6 +142,7 @@ def SaveAndExitQGIS(quit_app = True): save_check = project.write(str(save_filename)) if quit_app: + # you could skip app exiting to just save intermediate states app.exitQgis() ``` @@ -172,21 +178,21 @@ layer_provider = "memory" layer = QgsVectorLayer("Point", layer_name, layer_provider) ``` -> **Note** -> -> Layers are the central connection between your data storage and the user interface. -> They hold attributes in an attribute table (the data), and control data entry and visualization via their *layer properties*. +{{% callout note %}} +Layers are the central connection between your data storage and the user interface. +They hold attributes in an attribute table (the data), and control data entry and visualization via their *layer properties*. +{{% /callout %}} -Note that you will not see your layer on the project unless you add it via `project.addMapLayer(layer)`. +You will not see your layer on the project unless you add it via `project.addMapLayer(layer)`. However, right now, the layer is initialized and empty, and I will add it after finishing all preparation. -This is a general pattern of how PyQGIS works: you create an object, manipulate/fill/style it, and then associate it to the appropriate structure. +This is a general pattern of how PyQGIS works: you create an object, manipulate/fill/style it, and then associate it to the appropriate upstream structure. ## Attributes, Fields, and Features One of the first things to check on your layers is the **attribute table**. Data in the layers is organized in **fields** (columns). @@ -198,7 +204,7 @@ However, to get to that, it is important to have a meaningful data structure on **The Attribute Table is exactly that:** a visual display of the data table which stores your data. Thus, the first thing we need to do is get all the relevant fields (i.e. columns) to the attribute table (assuming they are not previously loaded from an external source). -On the Python side, we want to access the `dataProvider` of the layer, which you can access by calling the `.dataProvider()` function of the layer class. +On the Python side, we want to access the `dataProvider` of the layer, which you can access by calling the `.dataProvider()` function (or "method") of the layer class. Through that data provider, we can add the fields we would fill in later. ``` python @@ -218,20 +224,22 @@ layer.updateFields() # feed changes on the vector layer to the datasource field_index_lookup = lambda field_label: layer.fields().indexFromName(field_label) ``` -The `addAttributes()` function takes a list of `QgsField` elements, which you could as well predefine. +The `addAttributes()` function takes a list of `QgsField` elements, which you could as well predefine outside the project context. You see that here I initialized three question fields: a Boolean, an Integer, a String variable. Those data types come directly [from the Qt back-end](https://doc.qt.io/qt-6/qmetatype.html#Type-enum), i.e. the part that contributes the Q to QGIS. You may think of Qt as a layer even below the `app`. Yet except when searching data types and basic GUI elements, you rarely have to dig this deep. Finally, the convenience function I defined there will help us finding the internal index for any field we want to access below. -It should be updated each time the fields of a layer are updated. +It should be updated each time the fields of a layer change in any way. So far, so good: if you run all the above code, you should have a QGIS project with a point vector layer and an attribute table prepared, though no form yet. ## Forms, Containers, and Widgets +(There is a [basic lesson about forms](https://docs.qgis.org/3.40/en/docs/training_manual/create_vector_data/forms.html) in the QGIS documentation; yet of course we will not open QGIS.) + ### Form Configurator The more fields to collect, the less user-friendly attribute management gets. @@ -307,7 +315,7 @@ checkbox_widget = QgsEditorWidgetSetup( \ 'CheckBox', { \ 'AllowNullState': True, \ 'CheckedState': 'red', \ - 'TextDisplayMethod': 1, \ + 'TextDisplayMethod': 0, \ 'UncheckedState': 'blue' \ }) @@ -322,7 +330,7 @@ We have not yet configured our form, or attached a checkbox to the form config's This is done as follows: ``` python -# Note: the `name` must be equal to the field label +# IMPORTANT: the `name` must be equal to the field label, and the index must match form_element = QgsAttributeEditorField( \ name = this_field_label, \ idx = field_index_lookup(this_field_label), \ @@ -375,8 +383,11 @@ I found this immensely helpful to find my way around. ### Recap +{{% callout note %}} At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, form elements, widgets, a root container. -Look at our depressingly simple form. +{{% /callout %}} + +But look at our depressingly simple form.
A simple QGIS form. @@ -385,10 +396,14 @@ A first form widget. The red circle indicates the toolbar used for editing a lay
+QGIS offers a feature to load `.ui` files which store forms for re-use. +However, this leaves the problem of changing dependencies and non-continuous integration. +Therefore, in this tutorial, we will follow a different path to scale our user interface. + # Generalization Acknowledged: we constructed a very simple, but already fully layered chocolate cake. -(And you might have the feeling by now that I keep promising too much cake.) +(Tasty, but you might have the feeling by now that I keep promising too much cake.) So, how about if I tell you that, instead of a single cake, you can create an entire bakery? Because, after all, this is Python! @@ -459,7 +474,7 @@ class FieldWidget(object): return f"A form field widget labeled {self.label}, stored under {self.parent}." ``` -This can be used to quickly add Answer 2 to the form. +This can be used to quickly add Answer 2 to the form (patience, please, we will get to that). But maybe those should not be visible from the start. To control visibility, containers can help! @@ -492,11 +507,12 @@ I get why you might find the above expressions extra confusing: we effectively u Express yourself! And accept the strange beauty of an organically grown object-oriented construct. -In practice, you deal with this sort of things by defining your own wrapper classes and functions. +In practice, you deal with this sort of things by defining your own wrapper classes and functions with a simple name that you find meaningful. ## Application: Question 2 We still need widgets to decide how the user is supposed to answer our questions, don't we? +Here some examples. ``` python question_widgets = {} @@ -534,24 +550,30 @@ question_widgets["Answer 2B"] = QgsEditorWidgetSetup( \ ) ``` -Behold how this can quickly create a slightly more involved and dynamic form. +Behold how these ingredients can quickly be baked into a slightly more involved and dynamic form cake. ``` python +# define your questions and answers questions = { "Answer 2A": "When was the date that you first saw The Matrix?", \ "Answer 2B": "Which of the Matrix movies is the best?", \ } + for answer, question in questions.items(): + # create one container per question container = CreateContainer( label = answer.replace("Answer", "Block"), parent = root_container, visibility_condition = "\"Answer 1\" = " + ("TRUE" if "2A" in answer else "FALSE") ) + # add the question text AddInfoText(question, label = answer.replace("Answer", "Question"), parent = container) + # ... followed by the form widget widget = FieldWidget(answer, container, widget = question_widgets[answer]) + # finally, append the container (with the text and form widget) to the root. root_container.addChildElement(container) ``` @@ -567,7 +589,7 @@ The functions and objects give dedicated structure to the otherwise cryptic obje Still, things can go wrong. -## Braking Vases +## Breaking Vases Whenever PyQGIS does not work as intended, fire up QGIS, run the Python console, and paste in some of your commands to check on the fly whether they do what they are supposed to do. Some basic helpers in Python are `print(dir())` and `help()`, and those work just as well within QGIS. @@ -588,14 +610,14 @@ Congratulations! This may have been your first steps to the QGIS Python console. Maybe your first steps in Python at all. -I hope to have given you some directions of how to auto-construct custom forms with PyQGIS. +I hope to have given you some directions of how to bake custom forms with PyQGIS. If you have a meaningful way to store your questionnaires, determination keys, and field data assembly structures, take it from here and bring them to QGIS. I mentioned the advantages above. -You might use R to handle your GIS data, and only use Python for parsing it to QGIS. +Or you might use R to handle your GIS data, and only use Python for parsing it to QGIS. And you could spin up a [QFieldCloud](https://qfield.cloud) for sync or a custom [PostGIS server](https://docs.qgis.org/3.40/en/docs/training_manual/spatial_databases/spatial_functions.html) as a data source. Finally, [QField](https://qfield.org) is an outstandig app, a highly optimized mobile phone interface to your QGIS projects. -All of these are part of the "QGIS Matrix", and in this tutorial you got introduced to its Python foundation. +All of these are part of the "QGIS Matrix", and this tutorial introduced the strange Python objects which turn all of the bits and bytes to something you can make sense of. As always, questions and feedback are welcome! @@ -611,4 +633,4 @@ pacman -Qv python qgis qt5-base python-pyqt5 qt5-base 5.15.16+kde+r130-4 python-pyqt5 5.15.11-2 -[^1]: "Blender" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly. +[^1]: "[Blender](https://www.blender.org)" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly; I also saw a Python console in [Gimp](https://www.gimp.org). Which is excellent. diff --git a/content/tutorials/qgis_forms/index.qmd b/content/tutorials/qgis_forms/index.qmd index ebf44031d..1d251be68 100644 --- a/content/tutorials/qgis_forms/index.qmd +++ b/content/tutorials/qgis_forms/index.qmd @@ -44,8 +44,8 @@ format: Life was good before we were exposed to its real challenges, wasn't it? As a kid, you might have taken the challenge of eating chocolate cake without using your hands. -What fun it was. -I find it a pity that we do not do this any more. +What fun that was. +I find it a pity that we "grown-ups" do not do this any more. ````{=markdown} ![The image of a toddler's face after eating chocolate.](https://images.unsplash.com/flagged/photo-1557749846-14320a49d3ed?q=80&w=640&auto=format&fit=crop "Foto by Wilfried Santer, via Unsplash") @@ -54,21 +54,21 @@ I find it a pity that we do not do this any more. `
Photo by Wilfried Santer on Unsplash

`{=markdown} -If you still feel brave, consider taking up this challenge again next weekend. +If you still feel brave, how about taking that challenge up again next weekend? I would not consider this a totally infantile exercise: is is an exercise in the art of reductionism, experiencing our dependence on the trivial tools which we are so much used to, growing appreciation for everyday actions, gaining a new, yet familiar perspective. And, as is the causality of things, you might remember this notebook next time you see chocolate cake. In a way, this tutorial attempts to do something similar to eating cake without using your hands. -I will demonstrate how to **edit a QGIS project -- without opening QGIS.** +I will demonstrate how to **edit a QGIS project -- without opening QGIS**, with a particular focus on creating dynamic forms. -Please do not get me wrong: QGIS is an outstanding software tool by itself. +Please do not get this wrong: QGIS is an outstanding software tool by itself. The interface is simple and intuitive, yet gives you powerful options to manipulate spatial data from a variety of sources. -Yet there are a few FOSS tools which go one step further[^1]: they expose their inner workings by enabling scripting in a programming language. +There are a few FOSS tools which go a step further than the norm[^1]: they expose their inner workings by enabling scripting in a programming language. QGIS has a Python back-end, and exposes it via an internal editor. It is worthwile to train using and understanding this feature. -[^1]: "Blender" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly. +[^1]: "[Blender](https://www.blender.org)" is another example, where you can even record your actions as a Python script macro, and manipulate commands on the fly; I also saw a Python console in [Gimp](https://www.gimp.org). Which is excellent. Prepare to leave the world you know (the QGIS GUI), and enter *The Matrix*. @@ -78,7 +78,11 @@ Prepare to leave the world you know (the QGIS GUI), and enter *The Matrix*. Because, you know, the immediate utility of this skill is much more obvious than in the cake analogy. + +`{{% callout emphasize %}}`{=markdown} If you have QGIS under your scripts, you can automate data chains, version control data sources, document changes, dynamically customize elements, and learn about the inner workings of this fabulous, open GIS software program. +`{{% /callout %}}`{=markdown} + On the way, you will learn about the basic components and elements of QGIS, and GIS in general, and I might sprinkle in a Python trick or two. @@ -91,7 +95,7 @@ And enjoy reading! # QGIS Interface and References -Introducing you to QGIS is beyond the scope of this tutorial, since there are excellent sources available online. +Introducing QGIS from the beginning is beyond the scope of this tutorial, but there are excellent sources available online. - The official documentation: - General youtube series by "GISWorld": < https://www.youtube.com/playlist?list=PLCxnvDblgXGQHKgnbRTFB6a6AeKqYy9-9> @@ -101,7 +105,7 @@ Introducing you to QGIS is beyond the scope of this tutorial, since there are ex I personally found the trickiest part to be figuring out the QGIS-specific vocabulary. -If you have a background in geospatial analysis, you might struggle more with the workings of Python. +If you have a background in geospatial analysis, but did not use Python before, you might struggle more with the workings of that programming language. I will attempt to facilitate both. @@ -160,6 +164,7 @@ Certainly set your project CRS, otherwise all data is flawed and all hope is los ```{python qgis-project} project = QgsProject.instance() # taking a new QGIS project instance as our project. +# at INBO we usually turn to EPSG:31370 BD72 / Belgian Lambert 72 project_crs = QgsCoordinateReferenceSystem.fromEpsgId(31370) project.setCrs(project_crs) ``` @@ -184,6 +189,7 @@ def SaveAndExitQGIS(quit_app = True): save_check = project.write(str(save_filename)) if quit_app: + # you could skip app exiting to just save intermediate states app.exitQgis() ``` @@ -227,14 +233,16 @@ layer = QgsVectorLayer("Point", layer_name, layer_provider) ``` -:::{.callout-note} + +`{{% callout note %}}`{=markdown} Layers are the central connection between your data storage and the user interface. They hold attributes in an attribute table (the data), and control data entry and visualization via their *layer properties*. -::: +`{{% /callout %}}`{=markdown} + -Note that you will not see your layer on the project unless you add it via `project.addMapLayer(layer)`. +You will not see your layer on the project unless you add it via `project.addMapLayer(layer)`. However, right now, the layer is initialized and empty, and I will add it after finishing all preparation. -This is a general pattern of how PyQGIS works: you create an object, manipulate/fill/style it, and then associate it to the appropriate structure. +This is a general pattern of how PyQGIS works: you create an object, manipulate/fill/style it, and then associate it to the appropriate upstream structure. ## Attributes, Fields, and Features @@ -242,7 +250,7 @@ This is a general pattern of how PyQGIS works: you create an object, manipulate/ One of the first things to check on your layers is the **attribute table**. Data in the layers is organized in **fields** (columns). @@ -256,7 +264,7 @@ However, to get to that, it is important to have a meaningful data structure on Thus, the first thing we need to do is get all the relevant fields (i.e. columns) to the attribute table (assuming they are not previously loaded from an external source). -On the Python side, we want to access the `dataProvider` of the layer, which you can access by calling the `.dataProvider()` function of the layer class. +On the Python side, we want to access the `dataProvider` of the layer, which you can access by calling the `.dataProvider()` function (or "method") of the layer class. Through that data provider, we can add the fields we would fill in later. ```{python layer-data} @@ -276,7 +284,7 @@ layer.updateFields() # feed changes on the vector layer to the datasource field_index_lookup = lambda field_label: layer.fields().indexFromName(field_label) ``` -The `addAttributes()` function takes a list of `QgsField` elements, which you could as well predefine. +The `addAttributes()` function takes a list of `QgsField` elements, which you could as well predefine outside the project context. You see that here I initialized three question fields: a Boolean, an Integer, a String variable. Those data types come directly [from the Qt back-end](https://doc.qt.io/qt-6/qmetatype.html#Type-enum), i.e. the part that contributes the Q to QGIS. You may think of Qt as a layer even below the `app`. @@ -284,7 +292,7 @@ Yet except when searching data types and basic GUI elements, you rarely have to Finally, the convenience function I defined there will help us finding the internal index for any field we want to access below. -It should be updated each time the fields of a layer are updated. +It should be updated each time the fields of a layer change in any way. So far, so good: @@ -293,6 +301,9 @@ if you run all the above code, you should have a QGIS project with a point vecto ## Forms, Containers, and Widgets +(There is a [basic lesson about forms](https://docs.qgis.org/3.40/en/docs/training_manual/create_vector_data/forms.html) in the QGIS documentation; yet of course we will not open QGIS.) + + ### Form Configurator The more fields to collect, the less user-friendly attribute management gets. @@ -379,7 +390,7 @@ checkbox_widget = QgsEditorWidgetSetup( \ 'CheckBox', { \ 'AllowNullState': True, \ 'CheckedState': 'red', \ - 'TextDisplayMethod': 1, \ + 'TextDisplayMethod': 0, \ 'UncheckedState': 'blue' \ }) @@ -397,7 +408,7 @@ This is done as follows: ```{python add-form-element} -# Note: the `name` must be equal to the field label +# IMPORTANT: the `name` must be equal to the field label, and the index must match form_element = QgsAttributeEditorField( \ name = this_field_label, \ idx = field_index_lookup(this_field_label), \ @@ -437,6 +448,7 @@ QGIS has many more widget options, which are controlled from the *attribute edit [Many different attribute editor elements exist](https://qgis.org/pyqgis/3.40/core/QgsAttributeEditorElement.html), and we already saw "Fields", which effectively change the data, or "TextElements", which are informative text; we will see "Containers" below, and there are also "spacers" and "HTML" elements. + In terms of widgets for the Field elements, there a multitude of customization options, which might be hard to put in a general overview. If you have a widget in mind, and would like to create it in python, [the following code](https://gis.stackexchange.com/a/346374) can be used to extract widget configurations from the QGIS Python console. Create a layer with a layer name of choice, manually create and configure a widget in the Drag and Drop Layout designer, and track it in the console with the following code: @@ -454,8 +466,12 @@ I found this immensely helpful to find my way around. ### Recap + +`{{% callout note %}}`{=markdown} At this stage, we have a already encountered quite a lot of QGIS jargon: layers, attributes (fields and features), the data provider, the form configurator, form elements, widgets, a root container. -Look at our depressingly simple form. +`{{% /callout %}}`{=markdown} + +But look at our depressingly simple form.
@@ -464,10 +480,15 @@ Look at our depressingly simple form.
+QGIS offers a feature to load `.ui` files which store forms for re-use. +However, this leaves the problem of changing dependencies and non-continuous integration. +Therefore, in this tutorial, we will follow a different path to scale our user interface. + + # Generalization Acknowledged: we constructed a very simple, but already fully layered chocolate cake. -(And you might have the feeling by now that I keep promising too much cake.) +(Tasty, but you might have the feeling by now that I keep promising too much cake.) So, how about if I tell you that, instead of a single cake, you can create an entire bakery? Because, after all, this is Python! @@ -546,7 +567,7 @@ class FieldWidget(object): ``` -This can be used to quickly add Answer 2 to the form. +This can be used to quickly add Answer 2 to the form (patience, please, we will get to that). But maybe those should not be visible from the start. To control visibility, containers can help! @@ -576,6 +597,7 @@ def CreateContainer(label, parent = root_container, visibility_condition = None) container.setVisibilityExpression(QgsOptionalExpression(visexp)) return container + ``` I get why you might find the above expressions extra confusing: we effectively use @@ -583,12 +605,13 @@ I get why you might find the above expressions extra confusing: we effectively u Express yourself! And accept the strange beauty of an organically grown object-oriented construct. -In practice, you deal with this sort of things by defining your own wrapper classes and functions. +In practice, you deal with this sort of things by defining your own wrapper classes and functions with a simple name that you find meaningful. ## Application: Question 2 We still need widgets to decide how the user is supposed to answer our questions, don't we? +Here some examples. ```{python question-2-widgets} @@ -629,25 +652,31 @@ question_widgets["Answer 2B"] = QgsEditorWidgetSetup( \ ``` -Behold how this can quickly create a slightly more involved and dynamic form. +Behold how these ingredients can quickly be baked into a slightly more involved and dynamic form cake. ```{python question-2-scripted} +# define your questions and answers questions = { "Answer 2A": "When was the date that you first saw The Matrix?", \ "Answer 2B": "Which of the Matrix movies is the best?", \ } + for answer, question in questions.items(): + # create one container per question container = CreateContainer( label = answer.replace("Answer", "Block"), parent = root_container, visibility_condition = "\"Answer 1\" = " + ("TRUE" if "2A" in answer else "FALSE") ) + # add the question text AddInfoText(question, label = answer.replace("Answer", "Question"), parent = container) + # ... followed by the form widget widget = FieldWidget(answer, container, widget = question_widgets[answer]) + # finally, append the container (with the text and form widget) to the root. root_container.addChildElement(container) ``` @@ -665,7 +694,7 @@ The functions and objects give dedicated structure to the otherwise cryptic obje Still, things can go wrong. -## Braking Vases +## Breaking Vases Whenever PyQGIS does not work as intended, fire up QGIS, run the Python console, and paste in some of your commands to check on the fly whether they do what they are supposed to do. Some basic helpers in Python are `print(dir())` and `help()`, and those work just as well within QGIS. @@ -689,14 +718,14 @@ This may have been your first steps to the QGIS Python console. Maybe your first steps in Python at all. -I hope to have given you some directions of how to auto-construct custom forms with PyQGIS. +I hope to have given you some directions of how to bake custom forms with PyQGIS. If you have a meaningful way to store your questionnaires, determination keys, and field data assembly structures, take it from here and bring them to QGIS. I mentioned the advantages above. -You might use R to handle your GIS data, and only use Python for parsing it to QGIS. +Or you might use R to handle your GIS data, and only use Python for parsing it to QGIS. And you could spin up a [QFieldCloud](https://qfield.cloud) for sync or a custom [PostGIS server](https://docs.qgis.org/3.40/en/docs/training_manual/spatial_databases/spatial_functions.html) as a data source. Finally, [QField](https://qfield.org) is an outstandig app, a highly optimized mobile phone interface to your QGIS projects. -All of these are part of the "QGIS Matrix", and in this tutorial you got introduced to its Python foundation. +All of these are part of the "QGIS Matrix", and this tutorial introduced the strange Python objects which turn all of the bits and bytes to something you can make sense of. As always, questions and feedback are welcome!