Skip to content

[NL] LV BAG 2.0 converteren

Bart Noordervliet edited this page Jul 16, 2024 · 7 revisions

(This page is in Dutch because it describes using xml-to-postgres to convert an open dataset from the Dutch central government.)

xml-to-postgres kan gebruikt worden om de volledige BAG 2.0 Extract te importeren in PostgreSQL. Dit extract wordt sinds november 2021 kosteloos aangeboden door het Kadaster via deze link. Download hiervoor eerst de benodigde xml-to-postgres configuratiebestanden in deze ZIP. Deze voorbeeld-configuraties beperken de import op een paar vlakken: historische records worden weggelaten (d.w.z. records met een 'Historie:eindGeldigheid') en records met een niet-actieve status (bijv. 'Pand gesloopt' of 'Naamgeving ingetrokken'). Deze filters kunnen eenvoudig worden aangepast via de 'incl' en 'excl' opties in de YAML-bestanden. Verder maken deze voorbeeld-configuraties gebruik van de 'conv: gml-to-ewkb' functie om de geometriën in de BAG gelijk in te lezen als PostGIS geometries. Het is mijn indruk dat dit voor de LV-BAG correct werkt, maar het gebruik van deze functie blijft voor eigen risico. Lees vooral ook deze uitleg en disclaimer over GML-conversie.

Scripting

Hieronder een voorbeeld om de BAG Extract gescript te converteren:

#!/bin/sh

echo "Download BAG Extract..."
wget https://service.pdok.nl/kadaster/adressen/atom/v1_0/downloads/lvbag-extract-nl.zip || exit

echo "Unzip..."
unzip lvbag-extract-nl.zip 9999PND*.zip 9999VBO*.zip 9999NUM*.zip 9999WPL*.zip || exit

echo "Process PND..."
unzip -p 9999PND*.zip | xml-to-postgres bag-pand.yaml

echo "Process VBO..."
unzip -p 9999VBO*.zip | xml-to-postgres bag-verblijfsobject.yaml

echo "Process NUM..."
unzip -p 9999NUM*.zip | xml-to-postgres bag-nummeraanduiding.yaml

echo "Process WPL..."
unzip -p 9999WPL*.zip | xml-to-postgres bag-woonplaats.yaml

Dit script gebruikt streaming ZIP input en pakt de bron-XML dus nooit helemaal uit. Piek schijfruimte-gebruik hiermee is 14GB (12 als je tussentijds lvbag-extract-nl.zip verwijdert).

Importeren

Bovenstaand script levert .dump-bestanden op die in PostgreSQL ingelezen kunnen worden met een \copy commando in de psql client, bijv. zo:

psql# \copy bag_pand from 'bag_pand.dump'

Dit vereist wel dat er al een tabel "bag_pand" in de database aanwezig is met dezelfde kolommen in dezelfde volgorde. Tijdens het testen kan het handig zijn als er automatisch een tabel met de juiste kolommen wordt aangemaakt. Je kan dit doen door in elk .yaml-bestand op het hoogste niveau een regel toe te voegen met "emit: drop_table,create_table". Dit maakt van de .dump-files feitelijk SQL-scripts, met daarin een DROP TABLE, een CREATE TABLE met de juiste kolommen en een COPY .. FROM STDIN statement. Deze files kunnen direct naar de psql client gestuurd worden, bijv. zo:

cat *.dump | psql <database>

Performance

Op een redelijk snelle server (Intel Xeon E-2236 CPU @ 3.40GHz) draait deze voorbeeld-conversie in zo'n 16 minuten. De hoeveelheid RAM is niet relevant; het gebruik blijft onder de 10MB omdat xml-to-postgres streaming reads en streaming writes gebruikt en dus nooit meer dan 1 à 2 records tegelijk in het geheugen heeft.

Clone this wiki locally