""" ExportsFactory export a city into several formats SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca """ import xmltodict import uuid from pathlib import Path class EnergyAde: def __init__(self, city, path): self._city = city self._path = path self._export() def _export(self): energy_ade = { 'core:CityModel': { '@xmlns:brid':'http://www.opengis.net/citygml/bridge/2.0', '@xmlns:tran':'http://www.opengis.net/citygml/transportation/2.0', '@xmlns:frn':'http://www.opengis.net/citygml/cityfurniture/2.0', '@xmlns:wtr':'http://www.opengis.net/citygml/waterbody/2.0', '@xmlns:sch':'http://www.ascc.net/xml/schematron', '@xmlns:veg':'http://www.opengis.net/citygml/vegetation/2.0', '@xmlns:xlink':'http://www.w3.org/1999/xlink', '@xmlns:tun':'http://www.opengis.net/citygml/tunnel/2.0', '@xmlns:tex':'http://www.opengis.net/citygml/texturedsurface/2.0', '@xmlns:gml':'http://www.opengis.net/gml', '@xmlns:gen':'http://www.opengis.net/citygml/generics/2.0', '@xmlns:dem':'http://www.opengis.net/citygml/relief/2.0', '@xmlns:app':'http://www.opengis.net/citygml/appearance/2.0', '@xmlns:luse':'http://www.opengis.net/citygml/landuse/2.0', '@xmlns:xAL':'urn:oasis:names:tc:ciq:xsdschema:xAL:2.0', '@xmlns:xsi':'http://www.w3.org/2001/XMLSchema-instance', '@xmlns:smil20lang':'http://www.w3.org/2001/SMIL20/Language', '@xmlns:pbase':'http://www.opengis.net/citygml/profiles/base/2.0', '@xmlns:smil20': 'http://www.w3.org/2001/SMIL20/', '@xmlns:bldg':'http://www.opengis.net/citygml/building/2.0', '@xmlns:core':'http://www.opengis.net/citygml/2.0', '@xmlns:grp':'http://www.opengis.net/citygml/cityobjectgroup/2.0', 'gml:boundedBy': { 'gml:Envelope': { '@srsName': self._city.srs_name, '@srsDimension': 3, 'gml:lowerCorner': ' '.join([str(e) for e in self._city.lower_corner]), 'gml:upperCorner': ' '.join([str(e) for e in self._city.upper_corner]) } } } } buildings = [] for building in self._city.buildings: building_dic = { 'bldg:Building': { '@gml:id': building.name, } } building_dic = EnergyAde._get_measures(building, building_dic) buildings.append(building_dic) energy_ade['core:CityModel']['core:cityObjectMember'] = buildings file_name = self._city.name + '_ade.gml' file_path = Path(self._path / file_name).resolve() with open(file_path, 'w' ) as file: file.write(xmltodict.unparse(energy_ade,pretty=True)) @staticmethod def _get_measures(building, building_dic): measures = [] measure = EnergyAde._get_measure(building.heating, 'year', 'Energy demand heating', 'INSEL') if measure is not None: measures.append(measure) measure = EnergyAde._get_measure(building.cooling, 'year', 'Energy demand cooling', 'INSEL') if measure is not None: measures.append(measure) if len(measures) != 0: building_dic['genobj:measureAttribute'] = measures periods = [] for key in building.heating: if key != 'year': period = EnergyAde._get_period(building.heating, key, 'Heating energy', 'INSEL') periods.append(period) for key in building.cooling: if key != 'year': period = EnergyAde._get_period(building.cooling, key, 'Cooling energy', 'INSEL') periods.append(period) if len(periods) != 0: building_dic['energy:demands'] = {'energy:EnergyDemand': periods} return building_dic @staticmethod def _get_measure(measure_dict, key_value, name, source): measure = None if key_value in measure_dict: measure = { '@name': name, 'genobj:value': { '@uom': 'kWh', '#text': ' '.join([str(e/1000) for e in measure_dict[key_value][source]]) } } return measure @staticmethod def _get_period(measure_dict, key_value, description, source): period = { '@gml:id': uuid.uuid4(), 'energy:energyAmount': { 'energy:RegularTimeSeries': { 'energy:variableProperties': { 'energy:TimeValuesProperties': { 'energy:acquisitionMethod': 'simulation', 'energy:source': source, 'energy:thematicDescription': description, }, 'energy:timeInterval': { '@unit': key_value, '#text': '1', }, 'energy:values': { '@uom': 'kWh', '#text': ' '.join([str(float(e) / 1000) for e in measure_dict[key_value][source]]) } } } } } return period