(English) AmsterdamTimeMachine

Via twitter: AmsterdamTimeMachine.nl.

Jan Hartman’s en WebMappers bloed, zweet en traantjes om een oude set kaarten van Amsterdam te georefereren: http://amsterdamtimemachine.nl.

6 XYZ-Map services met kaarten van Amsterdam, vanaf 1625 om een inkijkje in de geschiedenis van Amsterdam te hebben. En natuurlijk zo in QGIS te laden :-)

Altijd al eens de Waag willen zien in 1625?

debroen

Of Hollands Glorie op het IJ (als je de kaart teminste 135 graden draait :-) ):

vbercenrode

En wist je dat er OOK een Waag was op De Dam?

vberckenrodededam

Ga naar http://amsterdamtimemachine.nl voor de xyz url’s of download dit zip bestand met een QGIS project file.

Het zipje bevat een .qgs bestand welke je NU zo al project kunt laden in QGIS 2.18 of QGS 3.x. Maar er zit ook een bestandje ‘amsterdamtimemachine.nl.xml’ in, die je kunt importeren als setje ‘XYZ-services’ MITS je een QGIS versie nieuwer dan 3.1 hebt (dus als je een ontwikkelversie hebt, OF als je nog even wacht tot 3.2).

Happy QGISsing…

Maak een QgsLocator (Plugin) met PyQGIS

Wat is een Locator (plugin)

Een paar maanden geleden, voegde Nyall Dawson stilletjes een klein zoekinvoer(widget) toe aan QGIS: zie de linker benedenhoek:

locatorbel

Mensen die bekend zijn met QtCreator (de Qt-ontwikkelomgeving) zouden het kunnen herkennen als een ‘QtCreator Locator’ clone: een manier om (heel) snel in een project te kunnen zoeken op: woorden, classes, favorieten, help-onderwerken, bestanden enz enz.. Het is eigenlijk een alles kunnen om razendsnel iets op te zoeken OF op te starten. Zie ook de originele Qt documentatie.

Nyall had het briljante idee om zoiets ook toe te voegen aan QGIS… en hij deed dat ook. In de code heet dit een QgsLocator en het laad/registreert zogenaamde ‘QgsLocatorFilters’.
In een nieuwe QGIS kun je daar al direct zoeken op: Acties, Processing Algorithmen, Ruimtelijke Favorieten, Features in de actieve laag, Projectlagen en Project Layouts.
Om even te proberen, tik ‘bel…’ en je ziet dat er wat (buffer) gerelateerde Processing Algoritmen beschikbaar zijn.

Door er dan op te dubbelklikken start je het algorithme, of eigenlijk je start het in processing, supersnel en handig. Maar als je net een kaart van de wereld hebt geladen zoals in bovenstaand plaatje en je klikt daar op ‘Belgium’ dan zoom je naar dat object.

Maar het mooiste nog (vind ik), is dat je als (python) ontwikkelaar heel ‘gemakkelijk’ zelf zo’n QgsLocatorFilter kunt bouwen.

Het eerste wat er bij mij opkwam was: ‘Dit moet je gebruiken om een geocoder aan te roepen…’.

Dus, meteen proberen…

De Locator plugin bouwen

De crux is, om de zogenaamde ‘QgsLocatorFilter’ te implementeren ( Zie de QGIS API documentatie, de PyQGIS Api of de cpp headerfile).

Jouw implementatie van die Class is dan eigenlijk het werkpaard van je Locator Filter. Het zal de invoertekst nemen, hier iets mee doen (in ons geval naar een Online Geocoder sturen), the resultaten verzamelen en dan een rij ‘QgsLocatorResult’-objectjes ervan maken die dan in die zoekrij worden getoond. En het bepaalt wat er wordt gedaan wanneer de gebruiker op een zoekresultaat klikt.

Daarnaast moet je die Class natuurlijk nog even in QGIS lijmen:
– een mini plugin die je dan in de QGIS plugin repo kan zetten, zodat gebruikers je filter kunnen downloaden
– in de plugin ‘registeer’ je je QgsLocatorFilter zodat QGIS die opppikt en toont in de Locator zoekwidget (zie de Nominatim Locator Plugin als je wilt zien hoe dat wordt gedaan)

Sommige geocoders (Google…) hebben tegenwoordig een ‘api key’ nodig om te blijven werken. Daarvoor moet je op het kleine vergrootglas icoontje klikken, zodat er een menu verschijnt en je op ‘Configureren’ kan klikken.

configuremenu

Dat brengt je dan in de ‘Locator’ tab in de Opties Dialoog:

locatoroptions

Je kunt er daar voor kiezen om een Locator Filter altijd te activeren of juist uit te zetten.

Helemaal rechts zie je een (nu niet aktieve) configureerknop. Als jouw Locator ‘True’ retourneert in de code wanneer hasConfigWidget() wordt aangeroepen, dan wordt die knop actief en kun je zelf een (klein) configuratiedialoogje bouwen en tonen.

Een voorbeeldgeocoder: Nominatim_Locator_Plugin

Nominatim (latijn, ‘op naam’) is volgens de OpenStreetMap wiki “a tool to search OSM data by name and address and to generate synthetic addresses of OSM points (reverse geocoding)”. Lees erover in de OSM wiki of de OSM api informatie.

Ik heb nu een ‘Nominatim_Locator_Plugin’ gebouwd die precies dat doet: de QgsLocatorFilter interface implementeren. Je kunt deze zelf via de Plugin Manager van QGIS installeren: zoek op ‘Nominatim’ en installeer de ‘Nominatim Locator Filter’ plugin. Of … bekijk gewoon de Python code.

In die code zie dat dat we in de ‘fetchResults’ wachten tot de gebruiker 2 letters heeft getikt, en dan pas gaan zoeken.
De Nominatim service is nog een speciaal geval: het is gratis, maar het is NIET toegestaan het als een ‘suggest-service’ te gebruiken. Je mag dus niet letter voor letter zoeken, maar alleen op een volledig adres zoeken. Om hieraan te gehoorzamen heb ik toegevoegd dat je zoekterm moet eindigen op een ‘spatie': pas dan wordt het verzoek naar Nominatim gestuurd.

Het supermooie met Nominatim en OpenStreetMap is dat het alle talen kan verwerken. Dus als je in het nederlands
‘vrijheidsbeeld’ intikt, dan krijg je dus gewoon resultaat:

vrijheidsbeeld

Wat technische details
De methoden die je moet implementeren en de beschrijving ervan vind je in de api docs van de qgslocatorfilter.h headerfile.

Een belangrijk ding om je bewust van te zijn is dat het zoeken/ontvangen/tonen van de resultaten allemaal plaatsvindt buiten de ‘applicatie’-thread om. Ik dacht slim te zijn en dus de ‘requests’ naar de services asynchroon af te vuren, maar dat eindigde met een ‘gevecht om threads’. Dus mijn tip: gebruik synchrone HTTP voor je aanroepen.

Dit brengt me op welke Python module je moet gebruiken voor het HTTP-verkeer. In QGIS 2 plugins gebruikte men vaak de Requests-module, of gewoon httplib2 of bouwde hun eigen NetworkAccessManagers.
Het nadeel van het gebruiken van die externe of zelfgemaakte oplossingen is dat QGIS eigen Netwerkinstellingen zoals ‘Proxy Settings’ of ‘Network Timeout’ vaak genegeerd werden…

Voor deze plugin gebruikte ik deze module networkaccessmanager.py.

Het mooie eraan is dat het probeert om een dunne schil te zijn rondom QGIS’ eigen QgsNetworkAccessManager (die op zijn beurt weer een schil is om Qt’s QnetworkAccessManager).
Het gebruikt alle Proxy-instellingen die een gebruiker heeft ingesteld, en het kan ook uitstekend samenwerken met QGIS’ eigen authorisatie-modules en -configuraties, dus het HTTP verkeer wordt geauthoriseerd en geleid volgens de eigen systeeminstellingen.

De Boundless oplossing werkt goed, maar het zou nog mooier zijn als de (beetje kale) QgsNetworkAccessManager C++ implementatie kon worden uitgebreid om ‘m wat Python/gebruiksvriendelijke te maken. Zodat het wat eenvoudiger wordt om redirects, timeouts en speciale headers te behandelen. En zoals in de Boundless module ook kan: kiezen of je de requests synchroon of asynchroon (niet blokkerend) wilt hebben.

Ik heb hiervoor een QEP (QGIS Enhancement Proposal) aangemaakt, ik hoop dat er meer mensen in geinteresseerd zijn.

Toekomst

Een OpenSource project is natuurlijk nooit ‘klaar’, in de positieve zin van ‘nooit af’ :-)

Terwijl je aan het programmeren bent borrelen de ideeen al weer op:

– toch een configuratieschermpje toevoegen aan Nominatim, om bijvoorbeeld te kunnen zoeken op OSM tags (wat dacht je van “alle cafe’s in de de kaart die ik nu voor mijn neus heb”, of nog beter: hier in de buurt :-) )

– de ‘accept-language option’ van Nominatim gebruiken (als in gebruik de huidige ingestelde taal) om zo te kunnen zoeken op: Эйфелева башня of eiffeltoren en dan ook van OSM de resultaten in die taal terug te krijgen.

eiffeltowerrussion

– zoeken met de Google Maps api. Heb je dan wel een ‘api key’ voor nodige dus zul je een configuratieschermpje moeten maken (heb ik al af :-) )

– De PDOK locatieserver gebruiken…. uh… intussen af PDOK Locatieserver Locator Filter:

pdok_nominatim_postcode

– of andere interessante zoekservices gebruiken

Ik hoop dat ik wat interesse heb gewekt, en zie de ‘locators’ wel verschijnen op plugins.qgis.org

Ah, en nog wat tips voor Python QGIS / PyQGIS programmeurs:

Latest Python API docs (thanks Denis): https://qgis.org/pyqgis/master/

https://qgis.org/api/api_break.html (all QGIS2.x – QGIS3.x api breaks and fixes)

PDOK services plugin: nieuwe versie + services

Er zijn (zowel voor QGIS 2.x als voor QGIS 3.x) nieuwe versies van de PdokServicePlugin beschikbaar.

Altijd al eens willen zien hoeveel Rijksmonumenten er zijn?

pdokrijksmonumenten

Of welke Postcode6 gebieden de kortste (of langste) aanrijdtijd hebben voor de brandweer?

pdokpc6brandweerbereikbaarheidwms

Of misschien de WFS voor de Postcode4 gebieden gebruiken?

pdokpc4wfs

Naast het fixen van een aantal bugs, is de belangrijkste aanpassing een update van de PDOK-services lijst.

De nieuwe lagen op een rijtje (we gaan van 8645 naar 9684 lagen!):

# Nieuwe luchtfotos: 2017
# Beschermde Gebieden INSPIRE (geharmoniseerd)
# BRO Bodemkaart 1:50.000
# BRO Geomorfologischekaart 1:50.000
# BRO Geotechnisch sondeeronderzoek (CPT)
# CBS Postcode4 statistieken
# CBS Postcode4 statistieken
# CBS Postcode6 statistieken
# Hydrografie – Netwerk RWS (INSPIRE geharmoniseerd)
# Hydrografie – Physical Waters (INSPIRE geharmoniseerd)
# Statistical Units Grid
# Vervoersnetwerken – Gemeenschappelijke elementen (INSPIRE geharmoniseerd)
# Vervoersnetwerken – Kabelbanen (INSPIRE geharmoniseerd)
# Vervoersnetwerken – Luchttransport (INSPIRE geharmoniseerd)
# Vervoersnetwerken – Spoorwegen (INSPIRE geharmoniseerd)
# Vervoersnetwerken – Waterwegen (INSPIRE geharmoniseerd)
# Vervoersnetwerken Waterwegen RWS (INSPIRE geharmoniseerd)
# Vervoersnetwerken – Wegen (INSPIRE geharmoniseerd)
# Vervoersnetwerken Wegen RWS (INSPIRE geharmoniseerd)

Je eerste 3-D kaart in QGIS 3.0

Hoera, QGIS 3.0 ondersteunt het maken van 3-D kaartbeelden! Maar wat komt daar allemaal bij kijken? Wat zijn de “let-opjes”? Deze blog helpt je om in een paar minuten een eerste indrukwekkend 3-D kaartbeeld op het scherm te toveren. Bedenk wel dat de 3-D view nog wat buggy is in QGIS 3.0; word niet ontmoedigd door een crash zo nu en dan.

1. Zorg ervoor dat je Richard’s onvolprezen PDOK plugin hebt geïnstalleerd.
2. Maak een nieuw project aan in QGIS met CRS EPSG:28992.
3. Voeg via de PDOK plugin de “ahn2_5m” WCS laag toe aan je project. Je zou een zwart vlak moeten zien verschijnen. Vink de zichtbaarheid ervan uit.
4. Voeg via de PDOK plugin de “opentopo” kaart toe aan je project. OpenTopo heeft van zichzelf al hillshading, dus dat helpt voor het realisme van het eindresultaat.
5. Zoom de kaart in naar een gebied met wat reliëf, bijvoorbeeld de Grebbeberg, Veluwezoom of het Zuid-Limburgs landschap. Zoom in tot ten minste 1:10.000.
6. Open de eigenschappen van de ahn2_5m laag, ga naar transparantie, en voeg bij “extra waarde voor geendata” de waarde -3.4028234663852886e+38 in. Als je dit vergeet dan probeert QGIS op water (waar geen goede AHN2 waarden zijn) heel diep te gaan en daar loopt hij op vast.
7. Kies in het menu “beeld” voor “nieuwe 3D kaartweergave” en wacht geduldig totdat hij de initiële tegels heeft geladen.
8. Klik op het gereedschap menu-icoon, en stel de ahn2_5m in als de hoogtelaag. Stel een verticale schaal in van 2 of 3 (of meer als je wilt lachen).
8. Stel de grootte van je 3D-window met de muis naar smaak in. Zoom desgewenst nog iets meer in. Wacht weer totdat de tegels zijn geladen.
9. Houd de Shift toets ingedrukt terwijl je met de muisknop ingedrukt naar links-rechts beweegt (x,y roteren) en naar boven-beneden (z roteren).
10. Druk op printscreen of kies save as image uit het menu.

Zo kun je bijvoorbeeld de volgende kaartbeelden maken.

201803-3d-lemelerberg

Lemeler- en Archemerberg, Overijssel.

201803-3d-gulperberg

Zicht op de Gulperberg, Zuid-Limburg.

Dit is natuurlijk slechts het begin. Als je data hebt over hoogtes van gebouwen, dan is dat een volgende stap. Maar het maken van je eerste 3-D kaart kan dus echt in vijf minuten.

Zie ook een 3D animatiefilmpje van Valkenburg met de AHN2 en luchtfoto data van PDOK: https://www.youtube.com/watch?v=VxOlIFe9WHw

Andere tips? Deel ze vooral hier!

Jan-Willem van Aalst

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.

Diagrammen met objecten per locatie

Stel je hebt een lijst met verschillende objecten die je als volgt op een kaart wil tonen:

screenshot-from-2018-02-16-11-16-07

Diagrammen in QGIS verwachten dat voor elke staaf of punt een kolom bestaat, maar onze objecten zitten allemaal onder elkaar in een kolom:

screenshot-from-2018-02-16-11-28-45

En de geometrie is opgeslagen in een goeie ouwe shapefile:

Shapfile 'cities.shp'
Shapfile ‘cities.shp’

We kunnen dus het veld ‘code’ gebruiken om de tabellen te koppelen en te groeperen tot een rij per locatie.

Omdat QGIS vector-koppelingen geen 1:n relaties aankunnen, gaan we hiervoor een virtuele kaartlaag gebruiken. Hierin kun je alle sql gebruiken die door sqlite wordt ondersteund, inclusief JOIN en GROUP BY.

Dus we maken een nieuwe virtuele kaartlaag ‘cities_grouped’ met deze sql query:

SELECT
  c.name,
  c.code,
  group_concat(amenity) AS amenities,
  CASE WHEN INSTR(group_concat(amenity),'university') > 0 THEN 1 ELSE 0 END AS university,
  CASE WHEN INSTR(group_concat(amenity),'airport') > 0 THEN 1 ELSE 0 END AS airport,
  CASE WHEN INSTR(group_concat(amenity),'station') > 0 THEN 1 ELSE 0 END AS station,
  CASE WHEN INSTR(group_concat(amenity),'harbor') > 0 THEN 1 ELSE 0 END AS harbor,
  count(*) AS cnt,
  c.geometry
FROM amenities a
LEFT JOIN cities c ON a.code = c.code
GROUP BY c.code, c.geometry

De attributentabel van deze laag ziet er dan zo uit:

Virtual attribute table 'cities_grouped'
Virtual attribute table ‘cities_grouped’

Nu kunnen we diagrammen gebruiken als symbologie voor deze nieuwe kaartlaag, waarbij we de nieuwe kolommen university, airport, station en harbor invoegen. Ik heb de count kolom (‘cnt’) gebruikt voor het instellen van de grafiekgrootte en label-afstand.

Ik hoop dat je hier wat aan hebt, en als je een makkelijkere manier weet om dit te doen hoor ik het graag!

Programma gebruikersmiddag compleet!

Okee, niet heel snel (volgende week woensdag is het al zover), maar het programma voor de gebruikersmiddag staat nu helemaal!

QGIS gebruikersdag

Mocht je hem nog niet gezien hebben: Woensdag 31 januari met inloop vanaf 12:00, IHE Delft (tegenover NS-station Delft), de allereeerste Gebruikersmiddag QGIS in Nederland. Inschrijven kan nog via Eventbrite.

Het programma zelf zit er als volgt uit:

  • 12:00 Inloop met broodjes
  • 13:00 Plenair programma (Engels, vanwege aanwezigheid internationale studenten)
    • IHE Rector Prof. Eddy Moors verzorgt de formele aftrap
    • Hans van der Kwast: Wat doet een instituut als IHE met QGIS?
    • Raymond Nijssen: Wat is er nieuw in QGIS3?
  • 14:15 Twee paralleltracks (een Engelstalig, een Nederlandstalig), een doctor’s office voor al je QGIS-problemen, en ruimte om met elkaar QGIS-zaken aan te pakken (neem je laptop mee!)
NL-spoor EN-track
14:15 Marco Duiker – praktische oplossingen voor BAG en BGT problemen in QGIS

https://geo-academie.nl/marco/

http://www.qgis.nl/author/marcoduiker/

Claudia Ruz Vargas – QGIS plugins for groundwater monitoring and modelling

https://www.un-igrac.org/staff/claudia-ruz-vargas

14:35 Jan-Willem van Aalst – Gebruik van QGIS bij het maken van OpenTopo en de Gemeentenatlas.nl

http://www.qgis.nl/author/janwillemvanaalst/
@janwillemvaalst

Leya Zgheib – Using QGIS for analysis in the Kafue Flats, Zambia

MSc Student IHE Delft, Environmental Sciences

14:55 Joost Deen – Gebruik en naar de hand zetten van QGIS bij de brandweer (Veiligheidsregio Noord-Holland Noord)
@OosJoost
Jonas van Schrojenstein – QGIS as a gui for hydrographical modelling
https://www.linkedin.com/in/jonas-van-schrojenstein-lantman-4584002/
15:15 pauze break
15:45 Nico de Graaff – QGIS in het applicatielandschap van Datalab Amsterdam
@njdegraaff
Niel de Jong – Preparing data for an effective humanitarian response in Malawi
@Niel_Aquanaut
https://www.linkedin.com/in/niel-de-jong-6063687b/
16:05 Marco van Antwerpen en Erik Leemrijze – De Zeeuwse aanpak: de QGIS samenwerking van provincie en gemeenten Pratik Tiwari – River hydro-potential and selection of possible hydropower sites using open source software and open data.

Student IHE Delft, Water Science and Engineering

16:25 Hoe verder? Een afsluitend gesprek met de zaal over de QGIS gebruikersmiddag en hoe we een mogelijk gezamenlijke toekomst willen organiseren. Martijn Meijers – Auto-refreshing the QGIS map pane for visual debugging algorithms

https://www.linkedin.com/in/bmmeijers/

http://www.gdmc.nl/martijn/

  • 16:45 Borrel
  • 18:00 Voor wie wil: afsluitend eten in het Post(GIS)kantoor, Hippolytusbuurt 14, Delft (inventarisatie volgt).

Kortom, wij hebben er zin in, en we gaan er een mooie middag van maken! Tot volgende week, ook namens Hans van der Kwast,

Erik Meerburg.

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

PDOK services plugin: nieuwe services EN PDOK Locatieserver!

Een korte post om te laten weten dat er nieuwe versies beschikbaar zijn van de ‘PDOK services plugin’.

De Bodemkaart 1:50000 als WMS en WFS
De Bodemkaart 1:50000 als WMS en WFS

Voor QGIS3 is er de versie 3.1.0, en voor QGIS 2.x is er 0.16.

De belangrijkste verandering is nodig omdat de PDOK Geocoderservice (die nu wordt gebruikt) aan het eind van dit jaar verdwijnt.
Daarvoor in de plaats komt de PDOK Locatieserver (https://www.pdok.nl/nl/producten/pdok-locatieserver)
en die wordt nu in de plug als service aangeroepen.

Op dit moment alleen de zogenaamde ‘free’ service, maar in een volgende versie OF plugin zal de ‘suggest’ service
worden gebruikt in combinatie met de QgsLocator interface van QGIS.

Zoeken op Apollolaan in Amsterdam
Zoeken op Apollolaan in Amsterdam

Nieuwe services

Daarnaast zijn er een aantal nieuwe lagen bijgekomen: we springen van 7570 naar 8645 lagen!

De belangrijkste op een rijtje:

# Administratieve Eenheden (INSPIRE geharmoniseerd)
# BAG Terugmeldingen
# CBS Wijken en Buurten 2017
# Geluidskaarten Schiphol
# Geluidskaarten spoorwegen
# Geografische Namen (INSPIRE geharmoniseerd)
# Geomorfologischekaart 1:50.000 (zie screenshot: de Bodemkaart van Nederland)
# Transport Netwerken – Kabelbanen (INSPIRE geharmoniseerd)
# Vervoersnetwerken – Waterwegen (INSPIRE geharmoniseerd)

TopRaster lagen

Een set van al langer bestaande WMS lagen is de TopRaster kaartlagen: top25/50/100/250/500/1000raster. Nadeel van de inrichting is echter dat ze schaalafhankelijk zijn, MAAR daarbij in de schalen dat ze NIET zichtbaar zijn een wit vlak teruggeven. Daardoor is zo’n kaartlaag niet bruikbaar als tussenlaag in een project.

Om nu te zorgen dat de set van Raster services te gebruiken zijn, kun je ze natuurlijk stapelen, en QGIS zelf die kaartlagen uit laten schakelen wanneer ze niet in ‘zichtbereik’ zijn. Dat heb ik gedaan, je ziet dan zoiets:

Naarden in de 1:25000 Raster kaart
Naarden in de 1:25000 Raster kaart

Het is even wat gepiel, maar dan heb je een projectje wat je eventueel kunt gebruiken als basis project. Ik heb de project file even gezipped, en die is hier: PDOK TopRaster project te downloaden. Wel even unzippen voordat je het project kunt openen.

Plezier weer met QGIS en de plugin(s).

3D data visualiseren met expressies

Laatst kreeg ik de vraag om de blootstelling aan geluidsoverlast in beeld te brengen voor een aantal woningen. Op zich niet moeilijk, ware het niet dat het hier ging om gebouwen met meerdere woonlagen. De woningen (puntlocaties) lagen pal bovenop elkaar.

selection_005De tabel maakt veel duidelijk. Naast een X en Y coördinaat zit er ook een Z-waarde in: dat is de hoogte. De kolom DB geeft het geluidsniveau aan per woning. Je krijgt op één plek (XY) dus meerdere DB waarden, met elk een eigen hoogte.

selection_004

Tsja, hoe geef je dat nou mooi weer? Mijn eerste idee was: een staafdiagram voor elke XY locatie. En dan met de kleur (geclassificeerde DB waarde) voor alle woningen netjes boven mekaar in de grafiek. Dat valt echter tegen: in QGIS kun je naast taartdiagrammen (pie chart) en tekstdiagrammen alleen histogrammen maken. En dat wou ik nou net niet.

Punt verplaatsing (Point Displacement) dan?

selection_006Je krijgt dan een hele zwik opties om ervoor te zorgen dat je alle punten netjes ziet. Alleen …. ik kon geen invloed krijgen op waar welk punt precies terecht kwam: je wil natuurlijk wel degene met de hoogste Z-waarde boven de op één na hoogste Z-waarde, enz enz. Werkte dus ook niet.

Toen bedacht ik me nog iets. Je kan namelijk ook marker symbolen verschuiven. Als je bij Style de Symbol selector kiest kun je naast grootte, hoek e.d. ook een Offset X,Y kiezen.

symbol-selector_007Nou levert het verplaatsen van alle symbolen met een vaste X en Y Offset uiteraard niet direct het gewenste resultaat op. Wat echter wel heel veel mogelijkheden biedt is de expressie knop (epsilon teken) rechts van de X en Y waarden. Hier kun je namelijk de Offset afhankelijk maken van de waarden in de tabel. Dat biedt mogelijkheden, ik heb immers een kolom met Z-waarden …

Nou is het wel even puzzelen hoe zo’n expressie eruit moet zien. Na wat prutsen kwam ik er achter dat de expressie ‘0, 100′ wel wat deed: elk punt werd 0 mm opzij (X) en 100 mm naar beneden (Y) verplaatst. Moet ie 100 mm naar boven, dan heb je dus een negatieve Y nodig. En de hele expressie moet tussen enkele quootjes: het is feitelijk een letterlijke tekst.

selection_008Maar we zijn er nog niet. Ik wou wat met die Z-waarde. Nou kun je in zo’n expressie ook Fields and Values gebruiken, en dus kun je nu wat knutselen met die Z-waarde. Na weer wat trial & error was ik er uit:

‘0, ‘|| to_string(-1 * “z”)

Het eerste deel is makkelijk: omdat ik geen verschuiving in de X richting wil wordt dat gewoon ‘0, ‘. In dat laatste stuk pak ik de waarde in de kolom “z”. Die vermenigvuldig ik met -1 (negatieve Z -> de symbolen worden naar boven verplaatst). Het resultaat daarvan is echter een getal, dus voor de functie moet je er vervolgens met to_string nog tekst van maken. En met || voeg je dat dan weer samen met die 0 voor de X richting.

Van het resultaat werd ik toch wel blij:

qgis-2-14-11-essen-verschovenpuntenmetexpressies_010Het werkt dus! Ik zie de symbolen nu netjes boven elkaar, afhankelijk van de Z-waarde, terwijl de kleur de DB waarde weergeeft. Nou ja, nétjes? Er zitten wat gaten in, maar dat komt doordat er wat gegevens missen. De functie doet alles goed. Ter illustratie: de rondjes zijn de oorspronkelijke punten.

De mogelijkheden van de expressies zijn werkelijk fantastisch, ik ben daarna helemaal los gegaan. Bijvoorbeeld: bij torenflats van meer dan 10 verdiepingen de eerste 10 boven elkaar, en dan 11 t/m 20 in een nieuwe rij daarnaast? Kan! En ook bij tekstlabels kun je dit soort expressies gebruiken: de labels precies in de blokjes krijgen is grotendeels een kwestie van copy / paste van dezelfde expressie.

Veel succes met knutselen!