Hack de Overheid!

Data

Hoe ga ik het XML-monster van de Bodeminformatie te lijf?

Eerder gaf Lex al een datareview van de Bodem- en GIS-data voor de AppsForAmsterdam-competitie. Deze data bestaat uit een enorm XML-bestand van 53 MB, met daarin informatie over tienduizenden locaties, adressen, besluiten en ‘verdachte activiteiten’.

Toen deze data nog ouderwets gesloten was, verdiende de gemeente jaarlijks tonnen aan leges voor het beschikbaar maken van deze data. Dit XML-monster bewaakt dus gouden bergen, maar hoe krijgen we deze informatie op de juiste manier in een AppForAmsterdam?

Plan A: Openen en bewerken in Excel
Zoals Lex al in zijn review beschreef kost het openen van de XML in Excel veel tijd. De laptop is minutenlang onaanspreekbaar en het resultaat is een Excelsheet van 438.000 rijen onduidelijk gedenormaliseerde data. En iedere poging tot herstructureren van de data leidt tot minutenlange berekeningen en vertragingen. Exit Excel.

Plan B: Openen en parsen in PHP
Wie gebruikt er dan ook Excel om een XML te openen? De data dus maar persoonlijk te lijf met een PHP-script… Maar helaas leveren de processoren ook hier niet genoeg power. 1 GB geheugen en 5 minuten processortijd is niet genoeg om het bestand te lezen en te parsen. Laat staan om er nog bewerkingen op uit te voeren en te schrijven naar een database.

Plan C: In stukjes hakken met XSLT!
Uiteindelijk blijft er nog één belangrijk wapen over: XSLT. Hiermee kan het XML-bestand worden getransformeerd, waarbij het in XSL 2.0 mogelijk is om één groot XML-bestand op te knippen in meerdere bestanden. Onderstaande XSLT doet dit voor het XML-bestand met bodeminformatie. (Let op: niet alle XSLT-processors ondersteunen de -tag. In dit geval is Saxon 9.1 gebruikt)

<?xml version='1.0'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gl="http://ananas.org/2003/tips/gallery"
xmlns:saxon="http://icl.com/saxon"
extension-element-prefixes="saxon"

<xsl:template match="bodeminformatie">
<xsl:apply-templates select="locatie"/>
</xsl:template>

<xsl:template match="locatie">
<xsl:result-document href="bodeminfo-{position()}.xml">
<xsl:copy-of select="."/>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>

Het resultaat is een verzameling van 14.545 nieuwe XML-bestanden, variërend in grootte van enkele bytes tot 300 kB. Deze bestanden zijn met wat creativiteit en nauwelijks processorpower goed te parsen en te verwerken.

En nu?
Volgende stap is om een script te maken die deze bestanden één voor één inleest en verwerkt. De XML bestaat uit 5 entiteiten: locatie, onderzoek, activiteit, besluit en adres. Deze kunnen eenvoudig in een relationele database opgeslagen worden.
Dat daarbij de benodigde interpretatie van codes, ids en statussen niet duidelijk is een heel ander (reeds gesignaleerd) probleem, maar wordt deels opgelost door de bovenste tip uit onderstaande lijst. Vraag is hoe relevant de details hiervan nog zijn, aangezien er al snel kan worden doorverwezen naar de informatie op de site van Bodemloket (zie tweede tip).

Op deze manier is voor mijn AppForAmsterdam inmiddels de bodeminformatie beschikbaar. Het XML-monster is overwonnen!

Tips:
· http://www.sikb.nl/richtlijnen_detail.asp?id=8627″>Verschillende documenten die het dataformaat en de gebruikte codetabellen beschrijven (vreemd genoeg in PDF)

· Toelichting van bodemloket.nl op een node uit de XML (vervang in de url de waarde van FeatIds door het id van een locatie of clus_id van een adres):

· Een XML-bestand omzetten naar een array (in PHP): http://www.bin-co.com/php/scripts/xml2array/

· RD coördinaten omzetten naar LatLng (in .NET, maar prima om te zetten naar andere talen):

· De polygonen meteen omrekenen naar een encodedPolygon voor Google Maps (in diverse talen):

Jasper Soetendal – jasper@weetmeer.nl
Jasper Soetendal is consultant bij Braxwell en initiatiefnemer van Weetmeer.nl. Hij werkt aan een inzending voor de AppsForAmsterdam-competitie; de gegevens uit het XML-monster van de bodeminformatie maken hier zeker deel van uit.

The following two tabs change content below.

jasper

Laatste berichten van jasper (toon alles)


3 comments on “Hoe ga ik het XML-monster van de Bodeminformatie te lijf?
  1. Rene op zei:

    Om een rauwe brok data te analyseren gebruik ik regelmatig ACL. De koning onder spreadsheet tools.

    Door het eerst te analyseren kom ik meestal tot een elegantere visuele oplossing.

  2. Welke functies heb je gebruikt om het bestand te parsen in PHP?

    De DOM functies moeten eerst het gehele document inlezen, en dat is ondoenlijk bij zo’n document. De SAX functies daarentegen (XMLReader, XML Parser) kunnen het document element voor element doorwerken, en dan is het erg onwaarschijnlijk dat je 1GB nodig hebt. Dit is wel wat meer werk (ben onder de indruk van de XSLT oplossing!) en soms is dat het waard!

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.