Exemple #1
0
    def leesUitXML(self, xml):
        gmlNode = None
        # Attribuut vinden, bijv. bag_LVC:woonplaatsGeometrie
        xmlGeometrie = xml.find('./' + tagVolledigeNS(self._tag, xml.nsmap))
        if xmlGeometrie is not None:
            # Probeer eerst een MultiSurface te vinden
            gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:MultiSurface", xml.nsmap))
            if gmlNode is None:
                # Geen MultiSurface: probeer een Polygon te vinden
                gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Polygon", xml.nsmap))
                if gmlNode is not None:
                    gmlStr = etree.tostring(gmlNode)
                    polygon = ogr.CreateGeometryFromGML(str(gmlStr))
                    self._geometrie = ogr.Geometry(ogr.wkbMultiPolygon)
                    self._geometrie.AddGeometryDirectly(polygon)

            else:
                # MultiSurface
                gmlStr = etree.tostring(gmlNode)
                self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr))
                if self._geometrie is None:
                     Log.log.warn("Null MultiSurface in BAGmultiPolygoon: tag=%s parent=%s" % (self._tag, self._parentObj.identificatie()))

        if self._geometrie is None:
            Log.log.warn("Null geometrie in BAGmultiPolygoon: tag=%s identificatie=%s" % (self._tag, self._parentObj.identificatie()))
Exemple #2
0
    def leesUitXML(self, xml):
        self.polygonAttr = None
        point = None
        try:
            xmlGeometrie = xml.find('./' +
                                    tagVolledigeNS(self._tag, xml.nsmap))

            if xmlGeometrie is not None:
                gmlNode = xmlGeometrie.find(
                    './' + tagVolledigeNS("gml:Point", xml.nsmap))
                if gmlNode is not None:
                    gmlStr = etree.tostring(gmlNode)
                    self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr))
                else:
                    # Forceer punt uit Polygoon
                    gmlNode = xmlGeometrie.find(
                        './' + tagVolledigeNS("gml:Polygon", xml.nsmap))
                    if gmlNode is not None:
                        gmlStr = etree.tostring(gmlNode)
                        self._geometrie = ogr.CreateGeometryFromGML(
                            str(gmlStr))
                        self._geometrie = self._geometrie.Centroid()
        except:
            Log.log.error(
                "ik kan hier echt geen POINT van maken: %s (en zet dit op 0,0,0)"
                % str(point.text))
Exemple #3
0
 def leesUitXML(self, xml):
     xmlGeometrie = xml.find('./' + tagVolledigeNS(self._tag, xml.nsmap))
     if xmlGeometrie is not None:
         gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Polygon", xmlGeometrie.nsmap))
         if gmlNode is not None:
             gmlStr = etree.tostring(gmlNode)
             self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr))
Exemple #4
0
 def __call__(self):
     """Export self._map to WMC
     """
     wmc_doc_tree = self._getRootElement()
     wmc_doc_tree.append(self._getGeneralElement())
     wmc_doc_tree.append(self._getLayerListElement())
     return etree.tostring(wmc_doc_tree)
Exemple #5
0
 def __call__(self):
     """Export self._map to WMC
     """
     wmc_doc_tree = self._getRootElement()
     wmc_doc_tree.append(self._getGeneralElement())
     wmc_doc_tree.append(self._getLayerListElement())
     return etree.tostring(wmc_doc_tree)
Exemple #6
0
def descend_one(t):
    """
    descend into t's single child element.
    """
    if len(t.getchildren()) != 1:
        print 'descend_one', etree.tostring(t)
    assert len(t.getchildren()) == 1, 'descend_one given %d children' % len(t.getchildren())
    return t.getchildren()[0]
Exemple #7
0
def write_gemeentelijke_indeling(args, gemeentelijke_indeling):
    if args.verbose:
        print("Building XML structure...")

    if gemeentelijke_indeling.has_key('nsmap'):
        root = etree.Element("gemeentelijke_indeling", nsmap=gemeentelijke_indeling['nsmap'])
    else:
        root = etree.Element("gemeentelijke_indeling")

    doc = etree.ElementTree(root)

    for attribute in gemeentelijke_indeling['attributes']:
        root.set(attribute, gemeentelijke_indeling['attributes'][attribute])

    for jaar in sorted(gemeentelijke_indeling['indeling'], key=int):
        indeling = etree.Element("indeling")

        attributes = ['jaar']
        for attribute in attributes:
            indeling.set(attribute, gemeentelijke_indeling['indeling'][jaar]['attributes'][attribute])

        for provinciecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'], key=int):
            provincie = etree.Element("provincie")

            attributes = ['code', 'naam']
            for attribute in attributes:
                provincie.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['attributes'][attribute])

            for gemeentecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'], key=int):
                gemeente = etree.Element("gemeente")

                attributes = ['code', 'naam', 'begindatum', 'einddatum']
                for attribute in attributes:
                    if(
                        gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'].has_key(attribute) and
                        gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute] != None
                      ):
                        gemeente.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute])

                    provincie.append(gemeente)

            indeling.append(provincie)

        root.append(indeling)

    if args.debug:
        if args.verbose:
            print("Not saving file: %s (DRY-RUN)" % args.output)

        print(etree.tostring(doc, pretty_print=True, xml_declaration=True, encoding='UTF-8'))
    else:
        if args.verbose:
            print("Saving file: %s" % args.output)

        doc.write(args.output, pretty_print=True, xml_declaration=True, encoding='UTF-8')
Exemple #8
0
    def leesUitXML(self, xml):
        self.polygonAttr = None
        point = None
        try:
            xmlGeometrie = xml.find('./' + tagVolledigeNS(self._tag, xml.nsmap))

            if xmlGeometrie is not None:
                gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Point", xml.nsmap))
                if gmlNode is not None:
                    gmlStr = etree.tostring(gmlNode)
                    self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr))
                else:
                    # Forceer punt uit Polygoon
                    gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Polygon", xml.nsmap))
                    if gmlNode is not None:
                        gmlStr = etree.tostring(gmlNode)
                        self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr))
                        self._geometrie = self._geometrie.Centroid()
        except:
            Log.log.error("ik kan hier echt geen POINT van maken: %s (en zet dit op 0,0,0)" % str(point.text))
Exemple #9
0
 def toxml(self):
     """Serialize into a WMS Service Exception XML
     """
     preamble = '<?xml version="1.0" ?>'
     report_elem = etree.Element('ServiceExceptionReport')
     report_elem.attrib['version'] = '1.1.1'
     # Service Exception
     exception_elem = etree.Element('ServiceException')
     exception_elem.text = self.message
     report_elem.append(exception_elem)
     return preamble + etree.tostring(report_elem)
Exemple #10
0
def write_gemeentelijke_indeling(args, gemeentelijke_indeling):
    if args.verbose:
        print("Building XML structure...")

    if 'nsmap' in gemeentelijke_indeling:
        root = etree.Element("gemeentelijke_indeling", nsmap=gemeentelijke_indeling['nsmap'])
    else:
        root = etree.Element("gemeentelijke_indeling")

    doc = etree.ElementTree(root)

    for attribute in gemeentelijke_indeling['attributes']:
        root.set(attribute, gemeentelijke_indeling['attributes'][attribute])

    for jaar in sorted(gemeentelijke_indeling['indeling'], key=int):
        indeling = etree.Element("indeling")

        attributes = ['jaar']
        for attribute in attributes:
            indeling.set(attribute, gemeentelijke_indeling['indeling'][jaar]['attributes'][attribute])

        for provinciecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'], key=int):
            provincie = etree.Element("provincie")

            attributes = ['code', 'naam']
            for attribute in attributes:
                provincie.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['attributes'][attribute])

            for gemeentecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'], key=int):
                gemeente = etree.Element("gemeente")

                attributes = ['code', 'naam', 'begindatum', 'einddatum']
                for attribute in attributes:
                    if (attribute in gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'] and
                            gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute] is not None):
                        gemeente.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute])

                    provincie.append(gemeente)

            indeling.append(provincie)

        root.append(indeling)

    if args.dry_run:
        if args.verbose:
            print("Not saving file: %s (DRY-RUN)" % args.output)

        print(etree.tostring(doc, pretty_print=True, xml_declaration=True, encoding='UTF-8').decode())
    else:
        if args.verbose:
            print("Saving file: %s" % args.output)

        doc.write(args.output, pretty_print=True, xml_declaration=True, encoding='UTF-8')
Exemple #11
0
def parse(fn, out = None):
    """
    Reads XML from the file name or object 'fn' and returns
    a 'Unit' instance.  Rewrites the XML to out, if not None.
    """
    e = etree.parse(fn).getroot()
    u = unit.Unit()
    u.lang = e.get('language')
    u.filename = e.get('filename')
    
    if out:
        open(out + os.path.basename(u.filename) + '.lh', 'w').write(etree.tostring(e))

    u.source = e.find('raw-source').text
    for t in e.find('referenced-types').getchildren():
        tt = types.aggregate_from_xml(t)
        assert tt.id not in u.types
        u.types[tt.id] = tt
    for f in e.find('function-bodies').getchildren():
        u.functions += [ functions.Function.from_xml(f) ]
    u.finalise()
    return u
Exemple #12
0
 def getServiceXML(self):
     xml = None
     if self._capabilities is not None:
         xml = etree.tostring(self._capabilities)
     return xml
Exemple #13
0
    def processDOM(self, node, naam='onbekend'):
        self.bagObjecten = []
        self.naam = naam

        mode = "Onbekend"
        doc_tag = stripschema(node.tag)

        # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc
        # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012)
        if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC':
            mode = 'Nieuw'
            # firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "vraag":
                            # TODO: Is het een idee om vraag als object ook af te
                            # handelen en op te slaan
                            vraag = child
                            if doc_tag == 'BAG-GWR-Deelbestand-LVC':
                                # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel
                                # zodat we weten welke datum/versie is gebruikt...
                                # Probeer BAG extract datum uit XML te vinden
                                vraag = stripNS(vraag)

                                gwr_datum = vraag.xpath("StandTechnischeDatum/text()")
                                if len(gwr_datum) > 0:
                                    # Gevonden !
                                    gwr_datum = str(gwr_datum[0])
                                else:
                                    gwr_datum = "onbekend"

                                # Opslaan (evt vervangen) als meta info
                                self.database.log_meta("gem_woonplaats_rel_datum", gwr_datum)
                        elif stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate")
                            for productnode in producten:
                                product_tag = stripschema(productnode.tag)
                                if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                    self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(productnode)
                                    if product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                        # Altijd de vorige weggooien
                                        self.database.log_actie('truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken')
                                        self.database.tx_uitvoeren('truncate gemeente_woonplaats')
                            bericht = Log.log.endTimer("objCreate - objs=" + str(len(self.bagObjecten)))
                            self.database.log_actie('create_objects', self.naam, bericht)

        elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC':
            mode = 'Mutatie'

            # firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate (mutaties)")
                            for productnode in producten:
                                if stripschema(productnode.tag) == 'Mutatie-product':
                                    origineelObj = None

                                    # Gebruik als sorteersleutel (datum+volgnr) tbv volgorde verwerking
                                    verwerkings_id = ''

                                    for mutatienode in productnode:
                                        if stripschema(mutatienode.tag) == 'Verwerking':
                                            # Verkijgen verwerkings_datum en volgnummer tbv sorteren
                                            mutatienode = stripNS(mutatienode)

                                            # Maak uniek vewerkings id string uit datum-tijd + volgnr
                                            verwerkings_tijdstip = str(mutatienode.xpath("TijdstipVerwerking/text()")[0])
                                            verwerkings_volgnr = str(mutatienode.xpath("VolgnrVerwerking/text()")[0])
                                            verwerkings_id = verwerkings_tijdstip + '.' + verwerkings_volgnr
                                            # print('verwerkings_id=%s' % verwerkings_id)

                                        elif stripschema(mutatienode.tag) == 'Nieuw':
                                            # Log.log.info("Nieuw Object")
                                            bag_objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)
                                            for bag_obj in bag_objs:
                                                bag_obj.verwerkings_id = verwerkings_id

                                            self.bagObjecten.extend(bag_objs)

                                        elif stripschema(mutatienode.tag) == 'Origineel':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)
                                            if len(objs) > 0:
                                                origineelObj = objs[0]

                                        elif stripschema(mutatienode.tag) == 'Wijziging':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)

                                            if len(objs) > 0:
                                                nieuwObj = objs[0]
                                                if nieuwObj and origineelObj:
                                                    nieuwObj.verwerkings_id = verwerkings_id
                                                    nieuwObj.origineelObj = origineelObj
                                                    self.bagObjecten.append(nieuwObj)
                                                    # Log.log.info("Wijziging Object")
                                                    origineelObj = None

                            # Zie http://www.pythoncentral.io/how-to-sort-a-list-tuple-or-object-with-sorted-in-python
                            # Tbv sorteren self.bagObjecten array op verwerkings volgorde
                            def get_verwerkings_id(bag_obj):
                                return bag_obj.verwerkings_id

                            # Sorteer te muteren objecten op verwerkings_id
                            self.bagObjecten = sorted(self.bagObjecten, key=get_verwerkings_id)

                            bericht = Log.log.endTimer("objCreate (mutaties) - objs=" + str(len(self.bagObjecten)))
                            Database().log_actie('create_objects', self.naam, bericht)

        elif doc_tag == 'BAG-Extract-Levering':
            # Meta data: info over levering

            # Sla hele file op
            self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True).decode())

            # Extraheer BAG lever datum
            #            <v202:LVC-Extract>
            #                <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus>
            #                <v202:productcode>DNLDLXAE02</v202:productcode>
            #                <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum>
            #            </v202:LVC-Extract>
            node = stripNS(node)
            # Probeer BAG extract datum uit XML te vinden
            extract_datum = node.xpath("//LVC-Extract/StandTechnischeDatum/text()")
            if len(extract_datum) > 0:
                # Gevonden !
                extract_datum = str(extract_datum[0])
            else:
                extract_datum = "onbekend"

            # Opslaan als meta info
            self.database.log_meta("extract_datum", extract_datum)
            Database().log_actie('verwerkt', self.naam, 'verwerken Leverings doc')
        else:
            bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag)
            Database().log_actie('n.v.t', self.naam, bericht)

            return

        Log.log.startTimer("dbStart mode = " + mode)
        # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT
        # maar moet nog gefinetuned
        if mode == 'Mutatie':
            # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE
            # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen...
            bericht = self.dbStoreInsert(mode)
        else:
            bericht = self.dbStoreCopy(mode)

        Database().log_actie('insert_database', self.naam, bericht)
Exemple #14
0
    def processDOM(self, node):
        self.bagObjecten = []
        mode = "Onbekend"
        doc_tag = stripschema(node.tag)

        # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc
        # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012)
        if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC':
            mode = 'Nieuw'
            #firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "vraag":
                            # TODO: Is het een idee om vraag als object ook af te
                            # handelen en op te slaan
                            vraag = child
                            if doc_tag == 'BAG-GWR-Deelbestand-LVC':
                                # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel
                                # zodat we weten welke datum/versie is gebruikt...
                                # Probeer BAG extract datum uit XML te vinden
                                vraag = stripNS(vraag)

                                gwr_datum = vraag.xpath(
                                    "StandTechnischeDatum/text()")
                                if len(gwr_datum) > 0:
                                    # Gevonden !
                                    gwr_datum = str(gwr_datum[0])
                                else:
                                    gwr_datum = "onbekend"

                                # Opslaan (evt vervangen) als meta info
                                self.database.log_meta(
                                    "gem_woonplaats_rel_datum", gwr_datum)
                        elif stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate")
                            for productnode in producten:
                                product_tag = stripschema(productnode.tag)
                                if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                    self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(
                                        productnode)
                                    if product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                        # Altijd de vorige weggooien
                                        Database().log_actie(
                                            'truncate_table',
                                            'gemeente_woonplaats',
                                            'altijd eerst leeg maken')
                                        Database().tx_uitvoeren(
                                            'truncate gemeente_woonplaats')
                            bericht = Log.log.endTimer(
                                "objCreate - objs=" +
                                str(len(self.bagObjecten)))
                            Database().log_actie('create_objects', 'idem',
                                                 bericht)

        elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC':
            mode = 'Mutatie'
            #firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate (mutaties)")
                            for productnode in producten:
                                if stripschema(
                                        productnode.tag) == 'Mutatie-product':
                                    origineelObj = None
                                    nieuwObj = None
                                    for mutatienode in productnode:
                                        if stripschema(
                                                mutatienode.tag) == 'Nieuw':
                                            # Log.log.info("Nieuw Object")
                                            self.bagObjecten.extend(
                                                BAGObjectFabriek.bof.
                                                BAGObjectArrayBijXML(
                                                    mutatienode))
                                        elif stripschema(mutatienode.tag
                                                         ) == 'Origineel':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(
                                                mutatienode)
                                            if len(objs) > 0:
                                                origineelObj = objs[0]
                                        elif stripschema(mutatienode.tag
                                                         ) == 'Wijziging':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(
                                                mutatienode)

                                            if len(objs) > 0:
                                                nieuwObj = objs[0]
                                                if nieuwObj and origineelObj:
                                                    nieuwObj.origineelObj = origineelObj
                                                    self.bagObjecten.append(
                                                        nieuwObj)
                                                    # Log.log.info("Wijziging Object")
                                                    origineelObj = None
                                                    nieuwObj = None

                            bericht = Log.log.endTimer(
                                "objCreate (mutaties) - objs=" +
                                str(len(self.bagObjecten)))
                            Database().log_actie('create_objects', 'idem',
                                                 bericht)

        elif doc_tag == 'BAG-Extract-Levering':
            # Meta data: info over levering

            # Sla hele file op
            self.database.log_meta("levering_xml",
                                   etree.tostring(node, pretty_print=True))

            # Extraheer BAG lever datum
            #            <v202:LVC-Extract>
            #                <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus>
            #                <v202:productcode>DNLDLXAE02</v202:productcode>
            #                <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum>
            #            </v202:LVC-Extract>
            node = stripNS(node)
            # Probeer BAG extract datum uit XML te vinden
            extract_datum = node.xpath(
                "//LVC-Extract/StandTechnischeDatum/text()")
            if len(extract_datum) > 0:
                # Gevonden !
                extract_datum = str(extract_datum[0])
            else:
                extract_datum = "onbekend"

            # Opslaan als meta info
            self.database.log_meta("extract_datum", extract_datum)
        else:
            bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag)
            Database().log_actie('n.v.t', 'n.v.t', bericht)

            return

        Log.log.startTimer("dbStart mode = " + mode)
        # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT
        # maar moet nog gefinetuned
        if mode == 'Mutatie':
            # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE
            # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen...
            bericht = self.dbStoreInsert(mode)
        else:
            bericht = self.dbStoreCopy(mode)

        Database().log_actie('insert_database', 'idem', bericht)
Exemple #15
0
    def processDOM(self, node, naam='onbekend'):
        self.bagObjecten = []
        self.naam = naam

        mode = "Onbekend"
        doc_tag = stripschema(node.tag)

        # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc
        # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012)
        if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC':
            mode = 'Nieuw'
            #firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "vraag":
                            # TODO: Is het een idee om vraag als object ook af te
                            # handelen en op te slaan
                            vraag = child
                            if doc_tag == 'BAG-GWR-Deelbestand-LVC':
                                # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel
                                # zodat we weten welke datum/versie is gebruikt...
                                # Probeer BAG extract datum uit XML te vinden
                                vraag = stripNS(vraag)

                                gwr_datum = vraag.xpath("StandTechnischeDatum/text()")
                                if len(gwr_datum) > 0:
                                    # Gevonden !
                                    gwr_datum = str(gwr_datum[0])
                                else:
                                    gwr_datum = "onbekend"

                                # Opslaan (evt vervangen) als meta info
                                self.database.log_meta("gem_woonplaats_rel_datum", gwr_datum)
                        elif stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate")
                            for productnode in producten:
                                product_tag = stripschema(productnode.tag)
                                if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                    self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(productnode)
                                    if product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                        # Altijd de vorige weggooien
                                        self.database.log_actie('truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken')
                                        self.database.tx_uitvoeren('truncate gemeente_woonplaats')
                            bericht = Log.log.endTimer("objCreate - objs=" + str(len(self.bagObjecten)))
                            self.database.log_actie('create_objects', self.naam, bericht)

        elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC':
            mode = 'Mutatie'

            #firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate (mutaties)")
                            for productnode in producten:
                                if stripschema(productnode.tag) == 'Mutatie-product':
                                    origineelObj = None

                                    # Gebruik als sorteersleutel (datum+volgnr) tbv volgorde verwerking
                                    verwerkings_id = ''

                                    for mutatienode in productnode:
                                        if stripschema(mutatienode.tag) == 'Verwerking':
                                            # Verkijgen verwerkings_datum en volgnummer tbv sorteren
                                            mutatienode = stripNS(mutatienode)

                                            # Maak uniek vewerkings id string uit datum-tijd + volgnr
                                            verwerkings_tijdstip = str(mutatienode.xpath("TijdstipVerwerking/text()")[0])
                                            verwerkings_volgnr = str(mutatienode.xpath("VolgnrVerwerking/text()")[0])
                                            verwerkings_id = verwerkings_tijdstip + '.' + verwerkings_volgnr
                                            # print('verwerkings_id=%s' % verwerkings_id)

                                        elif stripschema(mutatienode.tag) == 'Nieuw':
                                            # Log.log.info("Nieuw Object")
                                            bag_objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)
                                            for bag_obj in bag_objs:
                                                bag_obj.verwerkings_id = verwerkings_id

                                            self.bagObjecten.extend(bag_objs)

                                        elif stripschema(mutatienode.tag) == 'Origineel':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)
                                            if len(objs) > 0:
                                                origineelObj = objs[0]

                                        elif stripschema(mutatienode.tag) == 'Wijziging':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)

                                            if len(objs) > 0:
                                                nieuwObj = objs[0]
                                                if nieuwObj and origineelObj:
                                                    nieuwObj.verwerkings_id = verwerkings_id
                                                    nieuwObj.origineelObj = origineelObj
                                                    self.bagObjecten.append(nieuwObj)
                                                    # Log.log.info("Wijziging Object")
                                                    origineelObj = None

                            # Zie http://www.pythoncentral.io/how-to-sort-a-list-tuple-or-object-with-sorted-in-python
                            # Tbv sorteren self.bagObjecten array op verwerkings volgorde
                            def get_verwerkings_id(bag_obj):
                                return bag_obj.verwerkings_id

                            # Sorteer te muteren objecten op verwerkings_id
                            self.bagObjecten = sorted(self.bagObjecten, key=get_verwerkings_id)

                            bericht = Log.log.endTimer("objCreate (mutaties) - objs=" + str(len(self.bagObjecten)))
                            Database().log_actie('create_objects', self.naam, bericht)

        elif doc_tag == 'BAG-Extract-Levering':
            # Meta data: info over levering

            # Sla hele file op
            self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True))

            # Extraheer BAG lever datum
            #            <v202:LVC-Extract>
            #                <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus>
            #                <v202:productcode>DNLDLXAE02</v202:productcode>
            #                <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum>
            #            </v202:LVC-Extract>
            node = stripNS(node)
            # Probeer BAG extract datum uit XML te vinden
            extract_datum = node.xpath("//LVC-Extract/StandTechnischeDatum/text()")
            if len(extract_datum) > 0:
                # Gevonden !
                extract_datum = str(extract_datum[0])
            else:
                extract_datum = "onbekend"

            # Opslaan als meta info
            self.database.log_meta("extract_datum", extract_datum)
            Database().log_actie('verwerkt', self.naam, 'verwerken Leverings doc')
        else:
            bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag)
            Database().log_actie('n.v.t', self.naam, bericht)

            return

        Log.log.startTimer("dbStart mode = " + mode)
        # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT
        # maar moet nog gefinetuned
        if mode == 'Mutatie':
            # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE
            # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen...
            bericht = self.dbStoreInsert(mode)
        else:
            bericht = self.dbStoreCopy(mode)

        Database().log_actie('insert_database', self.naam, bericht)
Exemple #16
0
 def getServiceXML(self):
     xml = None
     if self._capabilities is not None:
         xml = etree.tostring(self._capabilities)
     return xml
Exemple #17
0
    def processDOM(self, node):
        self.bagObjecten = []
        mode = "Onbekend"
        doc_tag = stripschema(node.tag)

        # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc
        # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012)
        if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC':
            mode = 'Nieuw'
            #firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "vraag":
                            # TODO: Is het een idee om vraag als object ook af te
                            # handelen en op te slaan
                            vraag = child
                            if doc_tag == 'BAG-GWR-Deelbestand-LVC':
                                # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel
                                # zodat we weten welke datum/versie is gebruikt...
                                # Probeer BAG extract datum uit XML te vinden
                                vraag = stripNS(vraag)

                                gwr_datum = vraag.xpath("StandTechnischeDatum/text()")
                                if len(gwr_datum) > 0:
                                    # Gevonden !
                                    gwr_datum = str(gwr_datum[0])
                                else:
                                    gwr_datum = "onbekend"

                                # Opslaan (evt vervangen) als meta info
                                self.database.log_meta("gem_woonplaats_rel_datum", gwr_datum)
                        elif stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate")
                            for productnode in producten:
                                product_tag = stripschema(productnode.tag)
                                if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                    self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(productnode)
                                    if product_tag == 'GemeenteWoonplaatsRelatieProduct':
                                        # Altijd de vorige weggooien
                                        self.database.log_actie('truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken')
                                        self.database.tx_uitvoeren('truncate gemeente_woonplaats')
                            bericht = Log.log.endTimer("objCreate - objs=" + str(len(self.bagObjecten)))
                            self.database.log_actie('create_objects', 'idem', bericht)

        elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC':
            mode = 'Mutatie'
            #firstchild moet zijn 'antwoord'
            for childNode in node:
                if stripschema(childNode.tag) == 'antwoord':
                    # Antwoord bevat twee childs: vraag en producten
                    antwoord = childNode
                    for child in antwoord:
                        if stripschema(child.tag) == "producten":
                            producten = child
                            Log.log.startTimer("objCreate (mutaties)")
                            for productnode in producten:
                                if stripschema(productnode.tag) == 'Mutatie-product':
                                    origineelObj = None
                                    nieuwObj = None
                                    for mutatienode in productnode:
                                        if stripschema(mutatienode.tag) == 'Nieuw':
                                            # Log.log.info("Nieuw Object")
                                            self.bagObjecten.extend(
                                                BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode))
                                        elif stripschema(mutatienode.tag) == 'Origineel':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)
                                            if len(objs) > 0:
                                                origineelObj = objs[0]
                                        elif stripschema(mutatienode.tag) == 'Wijziging':
                                            objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)

                                            if len(objs) > 0:
                                                nieuwObj = objs[0]
                                                if nieuwObj and origineelObj:
                                                    nieuwObj.origineelObj = origineelObj
                                                    self.bagObjecten.append(nieuwObj)
                                                    # Log.log.info("Wijziging Object")
                                                    origineelObj = None
                                                    nieuwObj = None

                            bericht = Log.log.endTimer("objCreate (mutaties) - objs=" + str(len(self.bagObjecten)))
                            Database().log_actie('create_objects', 'idem', bericht)

        elif doc_tag == 'BAG-Extract-Levering':
            # Meta data: info over levering

            # Sla hele file op
            self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True))

            # Extraheer BAG lever datum
            #            <v202:LVC-Extract>
            #                <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus>
            #                <v202:productcode>DNLDLXAE02</v202:productcode>
            #                <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum>
            #            </v202:LVC-Extract>
            node = stripNS(node)
            # Probeer BAG extract datum uit XML te vinden
            extract_datum = node.xpath("//LVC-Extract/StandTechnischeDatum/text()")
            if len(extract_datum) > 0:
                # Gevonden !
                extract_datum = str(extract_datum[0])
            else:
                extract_datum = "onbekend"

            # Opslaan als meta info
            self.database.log_meta("extract_datum", extract_datum)
        else:
            bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag)
            Database().log_actie('n.v.t', 'n.v.t', bericht)

            return

        Log.log.startTimer("dbStart mode = " + mode)
        # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT
        # maar moet nog gefinetuned
        if mode == 'Mutatie':
            # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE
            # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen...
            bericht = self.dbStoreInsert(mode)
        else:
            bericht = self.dbStoreCopy(mode)

        Database().log_actie('insert_database', 'idem', bericht)