Skip to content

Commit

Permalink
Add processing support for gemeentelijke-indeling.xml.
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastic committed Nov 15, 2015
1 parent 7d27f16 commit 820a5fe
Show file tree
Hide file tree
Showing 5 changed files with 231 additions and 10 deletions.
14 changes: 13 additions & 1 deletion bag/db/script/bag-db.sql
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ CREATE TABLE nlx_bag_info (
);

INSERT INTO nlx_bag_info (sleutel,waarde)
VALUES ('schema_versie', '1.1.0');
VALUES ('schema_versie', '1.1.1');
INSERT INTO nlx_bag_info (sleutel,waarde)
VALUES ('software_versie', '1.1.4');
INSERT INTO nlx_bag_info (sleutel,waarde)
Expand Down Expand Up @@ -356,6 +356,18 @@ CREATE TABLE gemeente_provincie (
PRIMARY KEY (gid)
);

DROP TABLE IF EXISTS provincie_gemeente CASCADE;
CREATE TABLE provincie_gemeente (
gid serial,
provinciecode numeric(4),
provincienaam character varying(80),
gemeentecode numeric(4),
gemeentenaam character varying(80),
begindatum TIMESTAMP WITHOUT TIME ZONE,
einddatum TIMESTAMP WITHOUT TIME ZONE,
PRIMARY KEY (gid)
);

-- Functie om lege probe_geometry_columns() functie aan te maken voor PostGIS 2+
-- probe_geometry_columns() is namelijk niet aanwezig in PostGIS 2+.
CREATE OR REPLACE FUNCTION public._nlx_add_fn_probe_geometry_columns() RETURNS void AS $$
Expand Down
14 changes: 14 additions & 0 deletions bag/db/script/bag-view-actueel-bestaand.sql
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,20 @@ CREATE VIEW gemeente_woonplaatsactueelbestaand AS
AND (gw.einddatumtijdvakgeldigheid is NULL OR gw.einddatumtijdvakgeldigheid >= LOCALTIMESTAMP)
AND gw.status = 'definitief';

DROP VIEW IF EXISTS provincie_gemeenteactueelbestaand;
CREATE VIEW provincie_gemeenteactueelbestaand AS
SELECT pg.gid,
pg.provinciecode,
pg.provincienaam,
pg.gemeentecode,
pg.gemeentenaam,
pg.begindatum,
pg.einddatum
FROM provincie_gemeente AS pg
WHERE
pg.begindatum <= LOCALTIMESTAMP
AND (pg.einddatum IS NULL OR pg.einddatum >= LOCALTIMESTAMP);

----------------------------------------------------------------------------------
-- Extra definitie voor GeoServer om om te gaan met VIEWs
----------------------------------------------------------------------------------
Expand Down
22 changes: 15 additions & 7 deletions bag/src/bagfilereader.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,21 @@ def process_xml(self, file_resource, filenaam):
self.database.log_actie('xml_parse', filenaam, bericht, True)
return

try:
# Verwerken parsed xml: de Processor bepaalt of het een extract of een mutatie is
self.processor.processDOM(parsed_xml.getroot(), filenaam)
self.database.log_actie('verwerkt', filenaam, 'verwerkt OK')
except (Exception), e:
bericht = Log.log.error("fout %s in XML DOM processing, bestand=%s" % (str(e), filenaam))
self.database.log_actie('xml_processing', filenaam, bericht, True)
if filenaam == 'gemeentelijke-indeling.xml':
try:
self.processor.processGemeentelijkeIndeling(parsed_xml.getroot(), filenaam)
self.database.log_actie('xml_processing', filenaam, 'verwerkt OK')
except (Exception), e:
bericht = Log.log.error("fout %s in XML DOM processing, bestand=%s" % (str(e), filenaam))
self.database.log_actie('xml_processing', filenaam, bericht, True)
else:
try:
# Verwerken parsed xml: de Processor bepaalt of het een extract of een mutatie is
self.processor.processDOM(parsed_xml.getroot(), filenaam)
self.database.log_actie('verwerkt', filenaam, 'verwerkt OK')
except (Exception), e:
bericht = Log.log.error("fout %s in XML DOM processing, bestand=%s" % (str(e), filenaam))
self.database.log_actie('xml_processing', filenaam, bericht, True)

def process_csv(self, file_resource, filenaam):
Log.log.info("process_csv: verwerk %s " % filenaam)
Expand Down
97 changes: 97 additions & 0 deletions bag/src/bestuurlijkobject.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,100 @@ def BestuurlijkObjectFabriek(cols, record):
bestuurlijkOBject = GemeenteProvincie(record)

return bestuurlijkOBject

class GemeentelijkeIndeling(BestuurlijkObject):
"""
Verrijking: GemeentelijkeIndeling
"""

def __init__(self,obj):
# XML schema:
# <gemeentelijke_indeling xmlns="http://nlextract.nl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nlextract.nl gemeentelijke-indeling.xsd">
# ...
# <indeling jaar="2016">
# ...
# <provincie code="27" naam="Noord-Holland">
# <gemeente code="358" naam="Aalsmeer" begindatum="1970-01-01" />
# ...
# <gemeente code="381" naam="Bussum" begindatum="1970-01-01" einddatum="2016-01-01" />
# ...
# <gemeente code="1942" naam="Gooise Meren" begindatum="2016-01-01" />
# </provincie>
# ...
# </indeling>
# ...
# </gemeentelijke_indeling>
#
# DB schema:
# provinciecode numberic(4, 0)
# provincienaam character varying(80)
# gemeentecode numberic(4, 0)
# gemeentenaam character varying(80)
# begindatum timestamp without time zone
# einddatum timestamp without time zone

self.naam = 'provincie_gemeente'
self.provinciecode = obj['provinciecode']
self.provincienaam = obj['provincienaam']
self.gemeentecode = obj['gemeentecode']
self.gemeentenaam = obj['gemeentenaam']
self.begindatum = obj['begindatum']
self.einddatum = obj['einddatum']

def __repr__(self):
return "<ProvincieGemeente('%s', '%s', '%s', '%s', '%s', '%s', '%s')>" % (self.naam, self.provinciecode, self.provincienaam, self.gemeentecode, self.gemeentenaam, self.begindatum, self.einddatum)

def exists(self):
self.sql = """SELECT gid
FROM provincie_gemeente
WHERE provinciecode = %s
AND gemeentecode = %s
LIMIT 1"""
self.valuelist = (self.provinciecode, self.gemeentecode)

def unchanged(self):
and_einddatum = ' AND einddatum IS NULL'
valuelist = [self.provinciecode, self.provincienaam, self.gemeentecode, self.gemeentenaam, self.begindatum]

if self.einddatum:
and_einddatum = ' AND einddatum = %s'
valuelist.append(self.einddatum)

self.sql = """SELECT gid
FROM provincie_gemeente
WHERE provinciecode = %s
AND provincienaam = %s
AND gemeentecode = %s
AND gemeentenaam = %s
AND begindatum = %s"""
self.sql += and_einddatum
self.sql += ' LIMIT 1'
self.valuelist = valuelist

def update(self):
self.sql = """UPDATE provincie_gemeente
SET provincienaam = %s,
gemeentenaam = %s,
begindatum = %s,
einddatum = %s
WHERE provinciecode = %s
AND gemeentecode = %s"""
self.valuelist = (self.provincienaam, self.gemeentenaam, self.begindatum, self.einddatum, self.provinciecode, self.gemeentecode)

def insert(self):
self.sql = """INSERT INTO provincie_gemeente (
provinciecode,
provincienaam,
gemeentecode,
gemeentenaam,
begindatum,
einddatum)
VALUES (%s, %s, %s, %s, %s, %s)"""
self.valuelist = (self.provinciecode, self.provincienaam, self.gemeentecode, self.gemeentenaam, self.begindatum, self.einddatum)

def GemeentelijkeIndelingFabriek(obj):
bestuurlijkObject = None
if obj:
bestuurlijkObject = GemeentelijkeIndeling(obj)

return bestuurlijkObject
94 changes: 92 additions & 2 deletions bag/src/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@
"""

import os, sys
from collections import defaultdict
from bagobject import BAGObjectFabriek
from bagconfig import BAGConfig
from bestuurlijkobject import BestuurlijkObjectFabriek
from bestuurlijkobject import BestuurlijkObjectFabriek,GemeentelijkeIndelingFabriek
from postgresdb import Database
from log import Log
from etree import etree,stripschema,stripNS
Expand Down Expand Up @@ -82,6 +83,95 @@ def processCSV(self, csvreader, naam='onbekend'):
self.database.commit()
Database().log_actie('insert_database', naam, bericht)

def processGemeentelijkeIndeling(self, node, naam='onbekend'):
objecten = []
provincie_gemeente = defaultdict(dict)

doc_tag = stripschema(node.tag)

# XML schema:
# <gemeentelijke_indeling xmlns="http://nlextract.nl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://nlextract.nl gemeentelijke-indeling.xsd">
# ...
# <indeling jaar="2016">
# ...
# <provincie code="27" naam="Noord-Holland">
# <gemeente code="358" naam="Aalsmeer" begindatum="1970-01-01" />
# ...
# <gemeente code="381" naam="Bussum" begindatum="1970-01-01" einddatum="2016-01-01" />
# ...
# <gemeente code="1942" naam="Gooise Meren" begindatum="2016-01-01" />
# </provincie>
# ...
# </indeling>
# ...
# </gemeentelijke_indeling>

if doc_tag == 'gemeentelijke_indeling':
for indelingNode in node:
if stripschema(indelingNode.tag) == 'indeling':
jaar = indelingNode.get('jaar')

for provincieNode in indelingNode:
if stripschema(provincieNode.tag) == 'provincie':
provinciecode = provincieNode.get('code')
provincienaam = provincieNode.get('naam')

for gemeenteNode in provincieNode:
if stripschema(gemeenteNode.tag) == 'gemeente':
gemeentecode = gemeenteNode.get('code')
gemeentenaam = gemeenteNode.get('naam')
begindatum = gemeenteNode.get('begindatum')
einddatum = gemeenteNode.get('einddatum')

provincie_gemeente[provinciecode][gemeentecode] = {
'provinciecode' : provinciecode,
'provincienaam' : provincienaam,
'gemeentecode' : gemeentecode,
'gemeentenaam' : gemeentenaam,
'begindatum' : begindatum,
'einddatum' : einddatum,
}

for provinciecode in sorted(provincie_gemeente.keys()):
for gemeentecode in sorted(provincie_gemeente[provinciecode].keys()):
obj = GemeentelijkeIndelingFabriek(provincie_gemeente[provinciecode][gemeentecode])
if obj:
objecten.append(obj)
else:
Log.log.warn("Geen object gevonden voor provinciecode %s en gemeentecode %s" % (provinciecode, gemeentecode))

bericht = "Processed objectCount=" + str(len(objecten))
Log.log.info(bericht)
self.database.verbind()

updated = 0
inserted = 0
unchanged = 0

self.database.connection.set_client_encoding('UTF8')
for obj in objecten:
obj.exists()
if self.database.uitvoeren(obj.sql, obj.valuelist):
obj.unchanged()
if self.database.uitvoeren(obj.sql, obj.valuelist):
unchanged += 1
else:
obj.update()
self.database.uitvoeren(obj.sql, obj.valuelist)
updated += 1
else:
obj.insert()
self.database.uitvoeren(obj.sql, obj.valuelist)
inserted += 1
self.database.commit()

log_bericht = "Objects inserted=" + str(inserted) + " updated=" + str(updated) + " unchanged=" + str(unchanged)
Log.log.info(log_bericht)
Database().log_actie('insert_database', naam, bericht + " " + log_bericht)
else:
bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag)
Database().log_actie('n.v.t', self.naam, bericht)

def processDOM(self, node, naam='onbekend'):
self.bagObjecten = []
self.naam = naam
Expand Down Expand Up @@ -370,4 +460,4 @@ def dbStoreCopy(self, mode):
#
## Read from the buffer
#print input.read()
#
#

0 comments on commit 820a5fe

Please sign in to comment.