BAG-Extract

Hieronder staat de handleiding voor het gebruik van de tools voor de BAG, NLExtract-BAG of BAG-Extract geheten.

Handleiding BAG-Extract

BAG-Extract is onderdeel van de NLExtract tools voor het inlezen en verrijken van Kadaster BAG (Basisregistratie Adressen en Gebouwen) GML leveringen in (voorlopig) een Postgres/Postgis database.

BAG Bronbestanden downloaden

De BAG Leveringsbestanden (totaal plm 1.5 GB .zip) worden iedere maand ververst en zijn te downloaden via deze PDOK link: https://geodata.nationaalgeoregister.nl/inspireadressen/atom/inspireadressen.xml (Atom feed). Als je wilt testen met een kleiner bestand kun je via https://data.nlextract.nl/bag/bron/BAG_Amstelveen_2011feb01.zip ook de “BAG Amstelveen” (5.6 MB) downloaden. Let wel dat de bestandsstructuur van de Amstelveen-levering afwijkt van de tegenwoordige BAG-leveringen.

BAG PostGIS dumps downloaden

Als je geen zin/tijd hebt om NLExtract-BAG zelf te installeren en te draaien, dan kun je ook de PostGIS database en CSV adressen dumps downloaden via https://geotoko.nl. Deze worden maandelijks ververst direct na uitkomen nieuwe BAG-levering. Een leveringsbijdrage is vereist.

Wat doet BAG-Extract?

BAG-Extract biedt de volgende functionaliteiten:

  • Laden van een Kadaster BAG Extract vanuit Kadaster (.zip GML) levering

  • Toepassen van Kadaster BAG mutaties vanuit Kadaster (.zip GML) levering (v1.1.5 en hoger)

  • Verrijken BAG met gemeenten en provincies

  • Verrijken: tabel met volledige “ACN-achtige” adressen genereren

  • Geocoderen: afgeleide tabellen en functies

  • Stijlen (SLDs) om de ingelezen BAG data te visualiseren via een WMS

  • Validatie van input vlak geometrie

  • Database VIEWs om bagobjecten te selecteren die actueel, bestaand en valide geometrie hebben

  • Checkpointing: bijhouden welke bestanden reeds verwerkt t.b.v. herstarts en mutatie-verwerking

  • Logging in database zodat gechecked kan worden waar evt fouten zijn en welke bestanden verwerkt

BAG-Extract downloaden

Afhankelijkheden

  • PostgreSQL: relationele database, minimaal versie 9.1, optimaal is versie 9.5, Aangemaakte DB moet UTF8 encoding hebben. zie https://www.postgresql.org

  • PostGIS: spatial extensie PostgreSQL, bijv. opslag geodata, minimaal versie 2.0, optimaal is versie 2.2, zie https://postgis.org

  • Python: versie 2, minimaal versie 2.4.3, beste is 2.7 voor lxml, geen Python 3

  • Python argparse package, voor argument parsing alleen indien Python < 2.7

  • psycopg2: Python PostgreSQL client bibliotheek. Zie https://initd.org/psycopg

  • lxml voor razendsnelle native XML parsing, Zie https://lxml.de

  • GDAL/OGR tools en bibliotheek voor geodata manipulatie. Minimaal 1.8.1. Zie https://gdal.org

  • GDAL/OGR Python bindings Zie www.gdal.org en https://pypi.python.org/pypi/GDAL voor Geometrie parsing/validatie en manipulatie

Installatie (Linux)

Instructies hieronder zijn voor Ubuntu 18.04. Bij andere distributies zal het enigszins afwijken.

  • Bronbestanden downloaden op de achtergrond (duurt wat langer)

    $ wget https://geodata.nationaalgeoregister.nl/inspireadressen/extract/inspireadressen.zip &
    
  • Bag-extract downloaden (pas eventueel versie aan) en uitpakken

    $ wget https://github.com/nlextract/NLExtract/releases/download/1.4.1/nlextract-1.4.1.tar.gz
    $ tar xzvf nlextract-1.4.1.tar.gz
    
  • PostgreSQL + PostGIS. PostgreSQL is een OS relationele database (RDBMS). PostGIS is een extentie die van PostgreSQL een ruimtelijke (spatial) database maakt.

    $ sudo apt-get install postgresql postgresql-contrib postgis
    
  • PostgreSQL locale verbindingen toestaan (wijzig inhoud van pg_hba.conf in onderstaande)

    $ sudo nano /etc/postgresql/10/main/pg_hba.conf
    
        # DO NOT DISABLE!
        # If you change this first entry you will need to make sure that the
        # database superuser can access the database using some other method.
        # Noninteractive access to all databases is required during automatic
        # maintenance (custom daily cronjobs, replication, and similar tasks).
        #
        # Database administrative login by Unix domain socket
        local   all             postgres                                peer
    
        # TYPE  DATABASE        USER            ADDRESS                 METHOD
        # "local" is for Unix domain socket connections only
        local   all             all                                     peer
        # IPv4 local connections:
        host    all             all             127.0.0.1/32            trust
        # IPv6 local connections:
        host    all             all             ::1/128                 trust
        # Allow replication connections from localhost, by a user with the
        # replication privilege.
        #local   replication     all                                     peer
        #host    replication     all             127.0.0.1/32            md5
        #host    replication     all             ::1/128                 md5
    
  • PostgreSQL opnieuw opstarten

    $ sudo systemctl restart postgresql
    
  • Database bag aanmaken met benodigde extensies (tekencodering UTF8 is belangrijk en default)

    $ su postgres
    createdb bag
    psql bag
    # CREATE EXTENSION postgis;
    # CREATE EXTENSION postgis_topology;
    \q
    exit
    
  • Python installeren

    sudo apt-get install python-setuptools
    sudo apt-get install python-dev
    sudo apt-get install libpq-dev
    
  • Lxml installeren

    sudo apt-get install libxml2
    sudo apt-get install libxslt1.1
    sudo apt-get install python-lxml
    
  • GDAL (www.gdal.org) met Python bindings voor OGR geometrie-parsing en geometrie-validatie

    sudo apt-get install gdal-bin
    sudo apt-get install python-gdal
    
  • Python package voor PostgreSQL psycopg2

    sudo apt-get install python-psycopg2
    
  • Python package argparse

    sudo apt-get install python-argparse
    

Installatie (Windows)

De installatie van BAG-Extract op Windows werd in het verleden gekenmerkt door lastige installaties, vanwege het feit dat open source ontwikkeling op Windows gefragmenteerd plaatsvindt. Tegenwoordig is het een stuk gemakkelijker om BAG-Extract aan de praat te krijgen. Als je zelf BAG-Extract wilt uitvoeren, voer dan onderstaande beschrijving uit. Voor het gebruiken van de PostGIS-dump, volg dan de instructie die door Geert Doornbos beschikbaar is gesteld (work in progress).

Benodigdheden:

Let bij het downloaden van de software of je de 32-bits of de 64-bits versie gebruikt. De 64-bits versie werkt op de meeste recente computers. De 32-bits versie werkt op alle Windows-computers, maar issues met het geheugen zijn dan niet uitgesloten.

Installatie:

  • PostgreSQL, PostGIS en het aanmaken van een spatial database: zie de instructie voor het terugzetten van de PostgreSQL dump. Kort gezegd komt het op het volgende neer:

    • PostgreSQL: voer de installer uit.

    • PostGIS: via de Stack Builder van PostgreSQL.

    • Aanmaken BAG-gebruiker en database: via pgAdmin III of via de commandline (niet beschreven).

  • Python: voer de installer uit. Python 2.7.11 wordt helaas met een verouderde versie van Pip meegeleverd. Deze dient geüpgrade te worden naar versie 8. Dit is nodig voor het installeren van de Psycopyg-wheel. Commando:

    python -m pip install -U pip
    

    Je kunt ook pip rechtsteeks aanroepen. Voeg dan de Python scripts-directory eerst toe aan de PATH-variabele.

  • Python dependencies:

    python -m pip install <wheel>.whl
    
  • GDAL: voer de installer van QGIS uit. Natuurlijk is niet altijd QGIS nodig, zeker op een server-omgeving. Op een desktop is het wel aan te bevelen, zodat je gelijk het resultaat in de database kunt controleren. Op een server kun je de OSGeo4W-installer gebruiken. Dit is niet getest met NLExtract.

Zie Instellingen voor de configuratie en het gebruik van BAG-Extract.

Installatie (Mac OSX)

Voor Mac OSX zijn meerdere mogelijkheden. Hieronder wordt uitgegaan van MacPorts https://www.macports.org, een Unix package manager waarmee je gemakkelijk tools en bibliotheken en hun afhankelijkheden kunt installeren. MacPorts is sowieso aan te bevelen als je meerdere Unix/Linux tools gaat gebruiken. Python is al aanwezig op de Mac en is bruikbaar, de versie van Python kan afhankelijk zijn van je OSX versie. Probeer te vermijden om Python te installeren tenzij je precies weet wat je doet. Ook het easy_install Python programma zou al aanwezig moeten zijn. Al het onderstaande doe je in de Terminal.

Onder de manier die Just, een van de NLExtract ontwikkelaars gebruikt. (NLExtract werkt dus op de Mac!).

  • Python, 2.6.1 of hoger, liefst 2.7+. 2.6.1 Mac-versie werkt.

  • Python package “argparse” installeren (alleen nodig voor Python < 2.7)

    sudo easy_install argparse
    
  • libxml2 en libxslt: via MacPorts:

    sudo port install libxml2
    sudo port install libxslt
    
  • lxml

    sudo easy_install lxml
    
  • GDAL: KyngChaos (indien MacPorts GDAL-versie < 1.8.1 is) : https://www.kyngchaos.com/software/index Download en install GDAL Complete.

  • GDAL-Python bindings (zijn mogelijk al via GDAL beschikbaar?)

  • Postgres client psycopg2

    sudo python easy_install psycopg2
    

Commando

  • direct via python “python src/bagextract.py”

  • of (Unix,Linux,Mac) via shell script: “bin/BAG-Extract.sh”

  • Windows: voorlopig alleen via “python src/bagextract.py”

Alle commando’s werken onafhankelijk van de plek (directory) waar ze aangeroepen worden

Instellingen

  • extract.conf

    Configuratiebestand dat nodig is bij het uitvoeren van de programma’s. Dit bestand bevat de volgende instellingen: - database naam van de Postgres database - schema [optioneel] schemanaam of schema search path waar de tabellen worden aangemaakt (default “public”) - host host waar de Postgres database draait - user user voor toegang tot de Postgres database - password password van de user voor toegang tot de Postgres database

    Deze settings kunnen via commandline opties of via -f <mijn conf file> overuled worden, bijv. bagextract.py -H localhost -d bag -U postgres -W postgres -c bagextract.py -f mijn.conf -c

Voorbeelden

  1. Help en opties:

    python src/bagextract.py -h of bin/BAG-Extract.sh -h

    Alle commando’s kunnen via Python of shell .sh script uitgevoerd vanaf elke directory.

  2. Initialiseer de database en vul/verrijk met referentie-koppeldata (gemeenten/provincies) (-c):

    python bagextract.py -c
    of
    bag-extract.sh -c
    
    # -c vraagt gebruiker interactief voor bevestinging. Met -j (ja-optie) is er geen prompt. Handig voor batch-situaties
    python bagextract.py -cj
    of
    bag-extract.sh -cj
    
  3. Importeer een extract in de database (-e):

    python bagextract.py -e 9999STA01052011-000002.xml
    python bagextract.py -e 9999STA01052011.zip
    
    -e werkt op directory, file of .zip inclusief mutatie-bestanden
    
  4. Verrijken: genereren gemeente + provincie tabellen met geometrie uit woonplaatsen aggregeren

    NB Doe altijd eerst stappen 1-2 anders blijft de tabel “gemeente” leeg. !

    python bagextract.py -v -q ../db/script/gemeente-provincie-tabel.sql
    

    Met de -q (query) optie kan elk SQL bestand worden uitgevoerd

  5. Verrijken: aanmaken tabel met volledige “ACN-achtige” adressen uit BAG + gemeente + provincie tabellen (kan lang duren op gehele BAG, lijkt sneller te gaan via “psql” Postgres commando). NB Doe altijd eerst stappen 1-3!

    psql -d bag < ../db/script/adres-tabel.sql
    

    Gebruik het psql commando “set search_path to <your schema>,public; ” als je de adres-tabel in een expliciet Postgres schema wilt. Bijv

    # set search_path to bag,public;
    # \i /opt/nlextract/git/bag/db/script/adres-tabel.sql
    
  6. Geocodingzie tabellen en functies onder db/script/geocode

    De BAG is niet standaard geschikt om geocoding op uit te voeren. Daartoe dienen eerst afgeleide tabellen te worden aangemaakt en hulp functies voor met name “reverse geocoding” (vind adres voor x,y coordinaten).

Issues

Het is mogelijk de hele BAG .zip levering in te lezen vanuit de “hoofd” zip, maar dit kan soms geheugen-problemen opleveren. De voorlopige oplossing is om de hoofdzip uit te pakken in een enkele directory en dan de (7) individuele BAG .zip files te extraheren.

Het (geometrisch) aggregeren van woonplaatsen naar gemeenten en vervolgens naar provincies kent een probleem waarbij uit PostGIS de volgende melding komt: “NOTICE: TopologyException: found non-noded intersection between LINESTRING (…) at … ERROR: GEOS union() threw an error!”. Dit is mogelijk een bug in “libgeos” (GEOS) een library gebruikt door PostGIS. Dit probleem trad op in GEOS v3.2.2 maar niet in versie 3.3.1.

Het script db/script/adres-tabel.sql vergt 20 minuten tot enkele uren. Vaak afhankelijk van je machine maar vooral ook je PostgreSQL instellingen. Beste is om deze met standaard PSQL uit te voeren.

Het resultaat van het genereren van gemeenten en provincies uit woonplaats geometrieen is nog “rommelig”: veel kleine polygonen. Die willen we nog uitfilteren.

Bij foutmeldingen als COPY failed for table “nummeraanduiding”: ERROR: value too long for type character varying(20) heeft je “bag” database niet de UTF8 character encoding (zie boven). Check bij aanmaken, vooral op Windows, of je DB de character-encoding UTF8 heeft. Is later aan te passen. Zie ook dit issue.

Zie https://docs.kademo.nl/project/bagextract.html voor een installatie voorbeeld.

comments powered by Disqus