Versie 3.5.0 van de PDOKServicesPlugin

OK, het heeft een tijdje (te lang) geduurd. Veel services in de PDOKServiceplugin waren intussen verdwenen. En vooral één van de voor veel mensen interessantste: de kadastrale kaartlagen, deden het niet meer.
Dus een avondje en dagje verder: Update je PDOKServicePlugin eens: 3.5.0! Alles doet het weer. Raymond Nijssen heeft gezorgd voor een modernizering van het PDOK icoontje: niet alleen moderner, maar ook SVG nu… dus meeschalend wanneer je je iconen vergroot.
screenshot-20200619162318-204x46 Read More

Locatieserver: hectometerpaaltjes en percelen

Sinds kort is de PDOK Locatieserver ook gevuld met NWB gegevens (Nationaal Wegen Bestand) van Rijkswaterstaat. Standaard krijg je die bij een bevraging op de Locatieserver echter niet terug in je resultaat (zie de wiki voorbeelden).
Om dat mogelijk te maken moet je de zoek-url uitbreiden met een zogenaamde fq (Filter Query). Dus bijvoorbeeld ALLEEN zoeken naar de eerste tien hectometerpaaltjes op de A1:

https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?q=a1&fq=+type:hectometerpaal

Of i.p.v. alleen zoeken op de typen: gemeente, woonplaats, weg, postcode en adres (de ‘default’ typen), kun je ook aangeven op ALLES te willen zoeken:
https://geodata.nationaalgeoregister.nl/locatieserver/v3/suggest?q=a1&fq=+type:*
In de PDOKServicesPlugin werd nog niet gebruik gemaakt van die Filter/fq mogelijkheid. Sinds vandaag is er een versie beschikbaar die dat WEL heeft. Het Geocoder-tabje in de plugin ziet er nu zo uit:
pdokservicesplugingeocodertab
Zoekend naar de ‘a10’ zie je adressen en wegen.
Wanneer je nu echter ‘Hectometerpaal’-type aanvinkt, verschijnen er ook opeens ‘hectometerpaal’ resultaten:
pdokservicesplugingeocodertabhmp.
Op dezelfde wijze kun je nu in QGIS ook zoeken op kadastrale percelen, door het type ‘Perceel’ aan te klikken: zoekend op ‘haarle’ bijvoorbeeld komen de perceelnummers direkt naar boven:
pdokservicesplugingeocodertab
Maar ook kun je natuurlijk zoeken op de kadastrale ‘aanduiding’, ‘gemeentecode’ of ‘sectie’!
En in combinatie met een mooie ondergrondkaart als de OpenTopokaart, die de Hectometerpaalbordjes daadwerkelijk toont, heb je op deze manier een hele mooie combinatie:
pdokservicesplugingeocoderopentopo
Happy QGISsing 🙂

(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)

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).