Rust tool voor omzetten BAG naar DuckDB en export naar o.a. PostGIS en GeoPackage

Hoi allemaal,

Op codeberg staat mijn BAG of Rust projectje dat de maandelijkse BAG extract omzet naar een DuckDB database en alle adressen kan exporteren naar Parquet, TSV, JSON, DuckDB, GeoPackage en PostGIS.

Bij een export worden eventuele meerdere panden gecombineerd. Ook nevenadressen worden meegenomen als aparte entries (velden hoofd_id en neven_id geven aan of het een hoofd- of nevenadres is). Buurten en wijken uit de CBS gebiedsindelingen worden gecombineerd met de adressen op basis van locatie. Export naar PostGIS en DuckDB exporteert direct ook (geometrie van) alle buurten, wijken, woonplaatsen, gemeenten en provincies als aparte tabellen.

Een aantal exports (waaronder de geopackage) zijn hier te downloaden, deze worden nachtelijks automatisch bijgewerkt.

Geen idee of dit voor anderen interessant of nuttig is, maar mocht je opmerkingen of wensen hebben laat het dan vooral weten :slight_smile:

Groetjes en fijne feestdagen! :christmas_tree:

Remco

5 likes

Met dank aan PeeWee32 zijn opmerkzaamheid en tips heb ik nog een storende fout uit mijn code (en mijn aannames) gehaald.

Er blijven dan nog steeds heel wat dubbele of driedubbele adressen over, maar bij de enkele tientallen die ik heb gecheckt kwam dat precies zo voor in de BAG viewer.

Nu wil ik geen data weghalen uit de database om dat te verhelpen, maar met twee VIEWs op de bron tabel is het gelukkig snel op te lossen door bij meerdere entries voor hetzelfde adres de gegevens van die met de meest recente begindatum geldigheid te nemen. Daar zit natuurlijk een aanname in, maar als het doel is geen dubbelingen te hebben dan leek me dat best een aardige aanname :slightly_smiling_face:.

Voor de technisch geïnteresseerden:

CREATE OR REPLACE VIEW '_num' AS 
    SELECT _num_raw.*, coalesce(postcode,opr_id) as deduplicator 
    FROM '_num_raw' LEFT JOIN 'cutoff' ON (1=1) 
    WHERE ((begindatum_geldigheid <= cutoff) 
    AND ((einddatum_geldigheid IS NULL) OR (einddatum_geldigheid > cutoff)))
    AND tijdstip_inactief IS NULL
    AND status = 'Naamgeving uitgegeven'
    ORDER BY begindatum_geldigheid DESC;

CREATE OR REPLACE VIEW num AS 
    SELECT 
        first(id) AS id,
        first(status) AS status, 
        first(geconstateerd) AS geconstateerd, 
        first(begindatum_geldigheid) AS begindatum_geldigheid, 
        first(einddatum_geldigheid) AS einddatum_geldigheid, 
        first(tijdstip_inactief) AS tijdstip_inactief, 
        first(object_type) AS object_type,
        first(postcode) as postcode,
        huisnummer,huisletter,toevoeging,
        first(wpl_id) AS wpl_id,
        first(opr_id) as opr_id,
        deduplicator,
    FROM _num GROUP BY ALL;

Verder heb ik ook nog bepaling van het woningtype toegevoegd, zoveel mogelijk het proces volgend zoals beschreven in bijlage 1 van de productbeschrijving Woningtypering van het Kadaster. Dat lijkt al verdraaid goed te werken afgaand op mijn eigen woonwijk, al zie ik nog een paar dingen (in rood hieronder) waar ik nog een keer dieper in wil duiken.

De nachtelijke exports hebben nu dus ook een veld woningtype, met dezelfde letters als gebruikt in de woningtypering: (A)ppartement, (T)ussenwoning, (H)oekwoning 2onder1(K)ap, (V)rijstaand of N voor geen woning. De rode gebouwen boven hebben geen waarde (NULL), wat betekent dat er geen woningtype kon worden vastgesteld.

Groetjes,

Remco

1 like