def export_buildings_data(authenticate, csv_path, shp_path): ''' funzione che fa il vero lavoro ''' logger = init_logger('smt_main', 'export_building_data.log') smt_config = get_config('smt.cfg') # connect to MongoDB client = MongoClient() mongodb = client[smt_config.get('MONGODB', 'database')] # DB authentication if required if authenticate: logged_in = mongodb.authenticate(smt_config.get('MONGODB', 'username'), smt_config.get('MONGODB', 'password'), source=smt_config.get('MONGODB', 'source_database')) else: logged_in = True if logged_in: dati = [{"field":"bldg_code", "csv_field":"ID_bati", "shp_field":"bldg_code", "multiplier":0}, {"field":"pk_min-tun", "csv_field":"PK début", "shp_field":"pk_min-tun", "multiplier":1}, {"field":"pk_max-tun", "csv_field":"PK fin", "shp_field":"pk_max-tun", "multiplier":1}, {"field":"d_min-tun", "csv_field":"Distance horizontale minimale à l'axe du tunnel", "shp_field":"d_min-tun", "multiplier":1}, {"field":"d_max-tun", "csv_field":"Distance horizontale maximale à l'axe du tunnel", "shp_field":"d_max-tun", "multiplier":1}, {"field":"pk_min-smi", "csv_field":"PK début", "shp_field":"pk_min-smi", "multiplier":1}, {"field":"pk_max-smi", "csv_field":"PK fin", "shp_field":"pk_max-smi", "multiplier":1}, {"field":"d_min-smi", "csv_field":"Distance horizontale minimale à l'axe du tunnel", "shp_field":"d_min-smi", "multiplier":1}, {"field":"d_max-smi", "csv_field":"Distance horizontale maximale à l'axe du tunnel", "shp_field":"d_max-smi", "multiplier":1}, {"field":"sc_lev", "csv_field":"Classe de sensibilité", "shp_field":"sc_lev", "multiplier":1}, {"field":"damage_class", "csv_field":"Classe de dommage", "shp_field":"dmg_cls", "multiplier":1}, {"field":"vulnerability", "csv_field":"Vulnérablité", "shp_field":"vuln", "multiplier":1}, {"field":"settlement_max", "csv_field":"Settlement max", "shp_field":"sett_max", "multiplier":1000}, {"field":"tilt_max", "csv_field":"Tilt max", "shp_field":"tilt_max", "multiplier":1000}, {"field":"esp_h_max", "csv_field":"Esp h max", "shp_field":"esph_max", "multiplier":1000}, {"field":"damage_class_base", "csv_field":"Classe de dommage base", "shp_field":"dmg_cls_b", "multiplier":1}, {"field":"vulnerability_base", "csv_field":"Vulnérablité base", "shp_field":"vuln_b", "multiplier":1}, {"field":"settlement_max_base", "csv_field":"Settlement max base", "shp_field":"sett_max_b", "multiplier":1000}, {"field":"tilt_max_base", "csv_field":"Tilt max base", "shp_field":"tilt_max_b", "multiplier":1000}, {"field":"esp_h_max_base", "csv_field":"Esp h max base", "shp_field":"esph_max_b", "multiplier":1000}, {"field":"damage_class_vibration", "csv_field":"Classe de dommage - Vibration", "shp_field":"dmg_cls_vbr", "multiplier":1}, {"field":"vulnerability_class_vibration", "csv_field":"Vulnérablité - Vibration", "shp_field":"vuln_vbr", "multiplier":1}, {"field":"vibration_speed_mm_s", "csv_field":"Vitessse de vibration", "shp_field":"vbr_speed", "multiplier":1}] # EXPORT BUILDINGS CALCULATED DATA with open(csv_path, 'wb') as out_csvfile: writer = csv.writer(out_csvfile, delimiter=";") writer.writerow([x["csv_field"] for x in dati]) bcurr = Building.find(mongodb, {"PK_INFO":{"$exists":True}}) if bcurr.count == 0: logger.error("No Buildings found!") else: shape_data = open_shapefile(shp_path, logger) if shape_data: layer = append_fields_to_shapefile(shape_data, [x["shp_field"] for x in dati[1:]], logger) for item in bcurr: building = Building(mongodb, item) building.load() bldg_code = building.item["bldg_code"] if layer: bldg_feature = find_first_feature(layer, "bldg_code", bldg_code) if not bldg_feature: logger.warn("No feature with bldg_code %s found", bldg_code) logger.debug("Processing building %s", bldg_code) row = [] for dato in dati: if dato["field"] == "bldg_code": field_value = building.item["bldg_code"] elif dato["field"].split("_", 1)[0] in ["d", "pk"]: field, align = dato["field"].split("-", 1) pk_array = building.item["PK_INFO"]["pk_array"] if align == "smi": field_value = next((l[field] for l in pk_array if l['pk_min'] > 2150000), None) else: field_value = next((l[field] for l in pk_array if l['pk_min'] < 2150000), None) else: field_value = building.item.get(dato["field"], 0) * dato["multiplier"] row.append(str(field_value)) if bldg_feature and field_value and dato["field"] != "bldg_code": logger.debug("Trying to set field %s of building %s to value %0.10f", dato["shp_field"][:10], bldg_code, field_value) bldg_feature.SetField(dato["shp_field"][:10], field_value) writer.writerow(row) if layer and bldg_feature: layer.SetFeature(bldg_feature) if shape_data: shape_data.Destroy() logger.info("Buildings data Exported")