Waarden in samengestelde velden gebruiken

Bij het inlezen van sommige databronnen voegt Qgis meerdere waarden samen in een veld. Dit komt vooral vaak voor bij het inlezen van een gml-bestand zoals een bestand uit de BGT of een bestemmingsplan (IMRO).
Zo’n veld met meerdere waarden ziet er dan uit zoals in de volgende voorbeelden:bgt_1(BGT)
imro_1(IMRO)
De opzet is heel duidelijk. Als er zoiets staat als

(2:10,50)

dan betekent dat dat er twee waarden zijn opgenomen, in dit geval “10” en “50”.
Deze opzet is best goed leesbaar, maar het valt nog niet  mee om bijvoorbeeld labels te maken op basis van zo’n veld, of de waarden uit te splitsen naar verschillende kolommen met behulp van de field calculator.
Gelukkig is het niet moeilijk om een zogenaamde custom functie aan Qgis toe te voegen waarmee het wel gemakkelijk gaat.
In dit voorbeeld gaan we aan de slag met het zetten van labels op de panden in de BGT. Voeg daarvoor de pand laag toe uit de BGT met behulp van de QGIS plugin, en ga daarna via de eigenschappen van de laag naar het tabblad “labels” en kies voor de Expression Builder als in onderstaand voorbeeld:
labels
Kies daarna voor de Function Editoropen_functio_editor
en maak een nieuw bestand aan.  Plak dan vervolgens het volgende script in het venster:

from qgis.core import *
from qgis.gui import *
@qgsfunction(args='auto', group='Custom')
def values_from_list(string, number, feature, parent):
	"""
	Takes the n-th value from a list in a field where
        the list is written like: (3:value1, value2,value3).
        Such lists are often a result of importing gml. <br />
	<h3>Syntax</h3>
	values_from_list(<i>string</i>, <i>number</i>)
	<h3>Arguments</h3><br/>
	<i>string</i> The string containing the list
                      in format like
                      (3:value1, value2,value3) <br/>
	<i>number</i> The index number of the value
                      in the list to return
	<h3>Examples</h3>
	<pre>values_from_list("text", 1)</pre>
	"""
	components = string.strip('()').split(':',1)
	values_list = components[1]
	try:
		return values_list.split(',')[number - 1]
	except:
		return None

Dit script kun je ivm het kritisch gebruik van spaties en tabs in Python beter overplakken vanuit GitHub). Het venster ziet er dan als het goed is ongeveer zo uit:
add_functionVergeet daarna niet op de knop “>Load” te drukken!
Daarna kun je via het tabblad “Expression” de functie gebruiken. Je vindt deze onder het item “Custom”. Zoals je ziet wordt er netjes een help getoond.create_expressionDe eerste parameter die je meegeeft aan de functie is het veld waaruit je een waarde wilt opvissen, de tweede parameter is de hoeveelste waarde je wilt hebben. Een “2” geeft je dan de tweede waarde opgenomen in het veld. Indien er geen tweede waarde is komt er niks terug (ook geen fout).
In dit voorbeeld gebruiken we het veld “tekst” waarin de huisnummers staan, en de eerste waarde in dat veld.
Nadat je op “OK” hebt geklikt zullen de labels verschijnen, waarbij het eerste nummer wordt gebruikt voor de labels.
bgt_labelled
Uiteraard kun je deze functie nu ook gebruiken in de Field Calculator om bijvoorbeeld de waarden uit te splitsen naar verschillende kolommen.
Overigens is het daadwerkelijke script gedeelte heel compact, de rest is documentatie. Als je een beetje Python kent is het echt heel gemakkelijk om zo’n soort functie te schrijven.

Join the Conversation

3 Comments

  1. Hi, may name is Rodolfo and I am Brazilian, I want to learn QGIS but I don’t to know English good, however, is there any documentation in Portuguese?
    Thank’s
    Rodolfo Cavalcante

  2. Overigens kun je ook met reguliere expressies aan de gang.
    Voor het labelen van de panden in de BGT kun je de volgende expressies gebruiken:
    – Voor de tekst:
    regexp_substr( tekst, '[:](-?\\d*)[,)]*')
    – en de rotatie:
    to_real( regexp_substr( "hoek" , '[:](-?\\d*)[,)]*'))
    Minden makkelijk begrijpbaar, maar het werkt wel.

Leave a comment

Your email address will not be published. Required fields are marked *