-
Notifications
You must be signed in to change notification settings - Fork 0
[NL] LV BAG 2.0 converteren
(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.
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).
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>
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.