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.

QGIS gebruikersmiddagnieuws

De laatste voorbereidingen voor de allereerste QGIS gebruikersmiddag op 31 januari lopen. Tenminste, als we het in onze onderlinge gesprekken hebben over de naamkaartjes voor bezoekers en cadeautjes voor sprekers, dan kan je wel stellen dat het de laatste voorbereidingen zijn.

QGIS gebruikersdagIk leg er nog maar een keer de nadruk op: het is een evenement voor en door QGIS gebruikers. Er is ruim de tijd om met elkaar in gesprek te gaan, er is ruimte waar je met elkaar je laptop kan openklappen en problemen of juist leuke dingen met elkaar kan delen, een beetje showen waar je mee bezig bent, kijken wat anderen doen, en Richard Duivenvoorde is aanwezig als dokter om te helpen écht lastige dingen op te lossen.

Ik krijg verschillende vragen over het programma. Ja, dat is er natuurlijk ook! Er is een lezingenprogramma dat nu op een haar na helemaal rond is. Als we echt alles bevestigd hebben komt het netjes op de Eventbrite pagina (en hier). Dat zal vermoedelijk dit weekend zijn, Hans en ik hebben de laatste bevestigingsmails gisteren uitgestuurd.

Tip van de sluier: Joost Deen vertelt over het gebruik van QGIS bij veiligheidsregio’s, Jan-Willem van Aalst over de manier waarop hij de kaarten van OpenTopo en de Gemeentenatlas maakt met QGIS. Jazeker, die worden met QGIS gemaakt! En in het Engelstalig programma (ja, dat is er ook, zodat ook de internationale studenten van het IHE hun ervaringen met QGIS kunnen delen) vertelt Niel de Jong hoe het Rode Kruis QGIS gebruikt om een effectieve inzet mogelijk te maken bij rampen in bijvoorbeeld Malawi, en Claudia Ruz Vargas geeft aan welke plugins het mogelijk maken grondwater te monitoren en te modelleren. En dat is nog niet de helft van het programma!

Kortom, druk middagje. Vol met je eigen favoriete GIS pakket. En had ik al gezegd dat Raymond Nijssen met nieuws komt over QGIS 3? Ja, dat ook nog. Heb je je nog niet aangemeld? Dat kan nog hoor! https://www.eventbrite.nl/e/tickets-qgis-gebruikersdag-39826426915

Kadastrale percelen genereren vanuit BRK

In deze blog beschrijf ik hoe je met QGIS “echte” vlakgerichte Kadastrale Percelen kunt genereren wanneer de BRK gegevens (de Kadastrale Kaart) alleen lijngerichte kadastrale grenzen en perceel punten blijkt te bevatten.

polygonized

Sinds 1 januari 2016 is ook de BRK (Basis Registratie Kadaster) beschikbaar via PDOK. Je kunt deze in GML formaat per provincie downloaden en direkt in QGIS openen.

Deze BRK dataset bevat gegevens over percelen. Elk perceel heeft een unieke ID en bij het kadaster ligt ook vast wie de eigenaar is en de historie. Hier heeft het Kadaster zijn bestaan en belangrijke rol in de samenleving aan te danken! De gegevens in de BRK zijn een momentopname van de perceelsgrenzen en bevat geen eigenaarsgegevens of historie.

Ik had zelf verwacht dat de BRK een polygoonbestand met perceelsgegevens zou bevatten. De ZIP-file bevat echter de bestanden Kadastralegrens.gml (lijnen), Perceel.gml (punten met perceelsgegevens), Annotatie.gml (punten) en Bebouwing.gml (lijnen). Hiervan zijn Annotatie.gml en Bebouwing.gml minder interessant (BAG en BGT bevatten immers al de omtrek van gebouwen en die labels kunnen we prima zelf binnen het vlak genereren) .

Het proces van het omzetten naar perceelvlakken met perceelgegevens bestaat globaal uit de volgende stappen:

1) inlezen van GML bestanden en opslaan als Shape bestanden
2) toevoegen van spatiale indexen aan Shape bestanden
3) omzetten van kadastrale grenzen naar kadastrale vlakken
4) toevoegen van de attributen van perceelpunten aan kadastrale vlakken

1) Download eerst de BRK van Flevoland (of andere provincie) van de downloadpagina:

https://www.pdok.nl/nl/producten/pdok-downloads/basis-registratie-kadaster/kadastrale-kaart

2) in dit voorbeeld pak ik de zip-file van Flevoland uit in de folder C:\data\brk\input\ en maak ik de folder C:\data\brk\output aan waarin ik de resultaatbestanden zal aanmaken.

3) Activeer de Processing Toolbox via het menu Processing >> Toolbox. Zet rechtsonderin QGIS de Render functie (Her)teken uit en zet de interface processing om van Simplified interface naar Advanced interface.
Render of and advanced interface

4) laad de gml-files Kadastralegrens.gml en Perceel.gml
inlezen_gml

5) Sla allebei de bijgeladen GML bestanden op in het shape-formaat, dit kan door deze in het paneel “Lagen” te selecteren en via het menu Kaartlagen >> Opslaan Als… op te slaan als shape-bestand. Dit kan ook via Processing. Zoek in de Processing Toolbox met het zoekveld naar het GDAL/OGR algoritme “Convert format” met convert. Je moet die van OGR hebben (voor omzetten van vectordata). Dubbelklik op het gevonden algoritme en de dialoog opent waarmee je kaartlagen kunt opslaan in verschillende bestandsformaten.

GDAL_convert

6) Zorg ervoor dat de aangemaakte shapebestanden zijn geopend in QGIS. Het toevoegen van een index, doe je via de Laag Eigenschappen. Dubbelklik op de geselecteerde kaartlaag KadastraleGrens en Druk op de knop [Ruimtelijke index aanmaken] (Create spatial index).
Create Spatial Index

7) Het aanmaken van perceelsvlakken uit perceelsgrenzen doen we vervolgens met de Processing Tool, Polygonize. Zoek in de Processing Toolbox met het zoekveld naar “Polygonize”. Dubbelklik op het gevonden algoritme en de  volgende dialoog opent. Wanneer je de optie Create geometry columns aanvinkt , dan worden de attribuutvelden oppervlakte en omtrek aangemaakt in de output layer KadastraleVlak.shp.
grens_naar_vlak

8) Tijdens de uitvoering verschijnt het logbestand van het omzetten van perceelsgrenzen naar vlakken, bij 40% staat deze erg lang stil en lijkt QGIS nergens op te reageren. (sterker nog het scherm van het processing algoritme kan tijdelijk zijn verdwenen). Dit is een proces wat echter veel tijd nodig heeft! Gewoon even geduld hebben, laat QGIS zijn werk doen.
log_polygonize

9) Gebruik het QGIS Processing Algoritme Join attribute by location, Voor het toevoegen van de attributen van Perceel.shp aan KadastraalVlak.shp om deze vervolgens op te slaan in KadastralePercelen.shp. Op de volgende dialoog door hierop te dubbelklikken en vul deze als volgt in. Dit algoritme is een stuk sneller en wanneer je hierna alleen de KadastralePercelen.shp laad en bekijkt, zie je Flevoland zoals getoond aan het begin van deze blog (wellicht in andere kleur). Vergeet ook niet de renderfunctie (Her)teken rechtsonderin de applicatie weer aan te zetten.
join_attributes_to_polygon

Wanneer je een kadastraal perceel selecteert en bekijkt heeft deze de volgende velden.
Eigenschappen Kadastraal Perceel

Door: Diethard Jansen (GIS-hulp)