From a0445200a57325b54b3ad34ed9d08d32ff4367af Mon Sep 17 00:00:00 2001 From: guille Date: Fri, 25 Nov 2022 15:25:59 -0500 Subject: [PATCH] assign lod at city level and correct unit tests --- city_model_structure/city_objects_cluster.py | 3 +-- imports/construction_factory.py | 1 + imports/energy_systems/air_source_hp_parameters.py | 2 +- .../energy_systems/water_to_water_hp_parameters.py | 2 +- imports/geometry/citygml.py | 12 +++++++----- imports/geometry/gpandas.py | 6 ++++-- imports/geometry/obj.py | 6 ++++-- imports/geometry/rhino.py | 3 ++- imports/geometry_factory.py | 2 +- imports/usage_factory.py | 2 ++ unittests/test_construction_factory.py | 1 - unittests/test_geometry_factory.py | 1 - unittests/test_usage_factory.py | 1 - 13 files changed, 24 insertions(+), 18 deletions(-) diff --git a/city_model_structure/city_objects_cluster.py b/city_model_structure/city_objects_cluster.py index 06182338..683fbe39 100644 --- a/city_model_structure/city_objects_cluster.py +++ b/city_model_structure/city_objects_cluster.py @@ -20,8 +20,7 @@ class CityObjectsCluster(ABC, CityObject): self._cluster_type = cluster_type self._city_objects = city_objects self._sensors = [] - self._lod = '' - super().__init__(name, self._lod, None, None) + super().__init__(name, None, None) @property def name(self): diff --git a/imports/construction_factory.py b/imports/construction_factory.py index 94190b65..b9db7025 100644 --- a/imports/construction_factory.py +++ b/imports/construction_factory.py @@ -24,6 +24,7 @@ class ConstructionFactory: Enrich the city by using NREL information """ UsPhysicsParameters(self._city, self._base_path).enrich_buildings() + self._city.level_of_detail.construction = 2 def enrich(self): """ diff --git a/imports/energy_systems/air_source_hp_parameters.py b/imports/energy_systems/air_source_hp_parameters.py index 72cf41e8..e27e3fcf 100644 --- a/imports/energy_systems/air_source_hp_parameters.py +++ b/imports/energy_systems/air_source_hp_parameters.py @@ -82,7 +82,7 @@ class AirSourceHeatPumpParameters: heat_pump.heating_comp_power = h_data[1] heat_pump.heating_capacity_coff = self._compute_coefficients(h_data) - energy_system = EnergySystem('{} capacity heat pump'.format(heat_pump.model), 0, [], None) + energy_system = EnergySystem('{} capacity heat pump'.format(heat_pump.model), [], None) energy_system.air_source_hp = heat_pump self._city.add_city_object(energy_system) return self._city diff --git a/imports/energy_systems/water_to_water_hp_parameters.py b/imports/energy_systems/water_to_water_hp_parameters.py index e1cdaf55..d8501f57 100644 --- a/imports/energy_systems/water_to_water_hp_parameters.py +++ b/imports/energy_systems/water_to_water_hp_parameters.py @@ -129,7 +129,7 @@ class WaterToWaterHPParameters: heat_pump.entering_water_temp = data['ewt'] heat_pump.leaving_water_temp = data['lwt'] heat_pump.power_demand_coff = self._compute_coefficients(data) - energy_system = EnergySystem(heat_pump.model, 0, [], None) + energy_system = EnergySystem(heat_pump.model, [], None) energy_system.water_to_water_hp = heat_pump self._city.add_city_object(energy_system) return self._city diff --git a/imports/geometry/citygml.py b/imports/geometry/citygml.py index 63c8b7a6..70d2b01f 100644 --- a/imports/geometry/citygml.py +++ b/imports/geometry/citygml.py @@ -23,6 +23,7 @@ class CityGml: """ def __init__(self, path): self._city = None + self._lod = 0 self._lod1_tags = ['lod1Solid', 'lod1MultiSurface'] self._lod2_tags = ['lod2Solid', 'lod2MultiSurface', 'lod2MultiCurve'] self._lower_corner = None @@ -74,8 +75,6 @@ class CityGml: continue envelope = bound['Envelope'] self._srs_name = envelope['@srsName'] - lower_corner = None - upper_corner = None if '#text' in envelope['lowerCorner']: lower_corner = np.fromstring(envelope['lowerCorner']['#text'], dtype=float, sep=' ') upper_corner = np.fromstring(envelope['upperCorner']['#text'], dtype=float, sep=' ') @@ -110,14 +109,16 @@ class CityGml: if 'function' in city_object: function = city_object['function'] if any(key in city_object for key in self._lod1_tags): - lod = 1 + if self._lod is None or self._lod > 1: + self._lod = 1 surfaces = CityGmlLod1(city_object).surfaces elif any(key in city_object for key in self._lod2_tags): - lod = 2 + if self._lod is None or self._lod > 2: + self._lod = 2 surfaces = CityGmlLod2(city_object).surfaces else: raise NotImplementedError("Not supported level of detail") - return Building(name, lod, surfaces, year_of_construction, function, self._lower_corner, terrains=None) + return Building(name, surfaces, year_of_construction, function, self._lower_corner, terrains=None) def _create_parts_consisting_building(self, city_object): name = city_object['@id'] @@ -143,4 +144,5 @@ class CityGml: self._city.add_city_objects_cluster(self._create_parts_consisting_building(city_object)) else: self._city.add_city_object(self._create_building(city_object)) + self._city.level_of_detail.geometry = self._lod return self._city diff --git a/imports/geometry/gpandas.py b/imports/geometry/gpandas.py index 12fa4c95..24c5bcba 100644 --- a/imports/geometry/gpandas.py +++ b/imports/geometry/gpandas.py @@ -57,6 +57,7 @@ class GPandas: Get city out of a GeoPandas Table """ if self._city is None: + lod = 1 self._city = City(self._lower_corner, self._upper_corner, self._srs_name) for scene_index, bldg in self._scene.iterrows(): geometry = bldg.geom @@ -67,7 +68,7 @@ class GPandas: trimesh.repair.fix_winding(building_mesh) year_of_construction = int(bldg['year_built']) name = str(scene_index) - lod = 1 + if year_of_construction > 2000: function = cte.RESIDENTIAL else: @@ -82,8 +83,9 @@ class GPandas: perimeter_polygon = solid_polygon surface = Surface(solid_polygon, perimeter_polygon) surfaces.append(surface) - building = Building(name, lod, surfaces, year_of_construction, function, self._lower_corner, terrains=None) + building = Building(name, surfaces, year_of_construction, function, self._lower_corner, terrains=None) self._city.add_city_object(building) + self._city.level_of_detail.geometry = lod return self._city @staticmethod diff --git a/imports/geometry/obj.py b/imports/geometry/obj.py index 68460d4c..af823a99 100644 --- a/imports/geometry/obj.py +++ b/imports/geometry/obj.py @@ -59,10 +59,11 @@ class Obj: self._city = City(self._lower_corner, self._upper_corner, srs_name) scene = self.scene.geometry keys = scene.keys() + lod = 1 for key in keys: name = key # todo: where do we get this information from? - lod = 1 + year_of_construction = 0 function = '' @@ -77,6 +78,7 @@ class Obj: perimeter_polygon = solid_polygon surface = Surface(solid_polygon, perimeter_polygon) surfaces.append(surface) - building = Building(name, lod, surfaces, year_of_construction, function, self._lower_corner, terrains=None) + building = Building(name, surfaces, year_of_construction, function, self._lower_corner, terrains=None) self._city.add_city_object(building) + self._city.level_of_detail.geometry = lod return self._city diff --git a/imports/geometry/rhino.py b/imports/geometry/rhino.py index 69150d6a..ee03ee10 100644 --- a/imports/geometry/rhino.py +++ b/imports/geometry/rhino.py @@ -101,7 +101,7 @@ class Rhino: if face is None: break hub_surfaces = hub_surfaces + self._add_face(face) - building = Building(name, 3, hub_surfaces, 'unknown', 'unknown', (self._min_x, self._min_y, self._min_z), []) + building = Building(name, hub_surfaces, 'unknown', 'unknown', (self._min_x, self._min_y, self._min_z), []) city_objects.append(building) lower_corner = (self._min_x, self._min_y, self._min_z) upper_corner = (self._max_x, self._max_y, self._max_z) @@ -133,4 +133,5 @@ class Rhino: for building in buildings: city.add_city_object(building) + city.level_of_detail.geometry = 3 return city diff --git a/imports/geometry_factory.py b/imports/geometry_factory.py index 22b8df8b..69fdc67e 100644 --- a/imports/geometry_factory.py +++ b/imports/geometry_factory.py @@ -78,4 +78,4 @@ class GeometryFactory: Enrich the city given to the class using the class given handler :return: City """ - return GPandas(geopandas.read_file(self._path)).city + return CityGml(self._path).city diff --git a/imports/usage_factory.py b/imports/usage_factory.py index 69ec4922..50d94915 100644 --- a/imports/usage_factory.py +++ b/imports/usage_factory.py @@ -26,12 +26,14 @@ class UsageFactory: """ Enrich the city with HFT usage library """ + self._city.level_of_detail.usage = 2 return HftUsageParameters(self._city, self._base_path).enrich_buildings() def _comnet(self): """ Enrich the city with COMNET usage library """ + self._city.level_of_detail.usage = 2 return ComnetUsageParameters(self._city, self._base_path).enrich_buildings() def enrich(self): diff --git a/unittests/test_construction_factory.py b/unittests/test_construction_factory.py index e6c6dd50..3353ca29 100644 --- a/unittests/test_construction_factory.py +++ b/unittests/test_construction_factory.py @@ -70,7 +70,6 @@ class TestConstructionFactory(TestCase): def _check_buildings(self, city): for building in city.buildings: self.assertIsNotNone(building.name, 'building name is none') - self.assertIsNotNone(building.lod, 'building lod is none') self.assertIsNotNone(building.type, 'building type is none') self.assertIsNotNone(building.volume, 'building volume is none') self.assertIsNotNone(building.detailed_polyhedron, 'building detailed polyhedron is none') diff --git a/unittests/test_geometry_factory.py b/unittests/test_geometry_factory.py index 888b8674..17cfaa16 100644 --- a/unittests/test_geometry_factory.py +++ b/unittests/test_geometry_factory.py @@ -54,7 +54,6 @@ class TestGeometryFactory(TestCase): def _check_buildings(self, city): for building in city.buildings: self.assertIsNotNone(building.name, 'building name is none') - self.assertIsNotNone(building.lod, 'building lod is none') self.assertIsNotNone(building.type, 'building type is none') self.assertIsNotNone(building.volume, 'building volume is none') self.assertIsNotNone(building.detailed_polyhedron, 'building detailed polyhedron is none') diff --git a/unittests/test_usage_factory.py b/unittests/test_usage_factory.py index f4feb04c..d9357fa8 100644 --- a/unittests/test_usage_factory.py +++ b/unittests/test_usage_factory.py @@ -33,7 +33,6 @@ class TestUsageFactory(TestCase): def _check_buildings(self, city): for building in city.buildings: self.assertIsNotNone(building.name, 'building name is none') - self.assertIsNotNone(building.lod, 'building lod is none') self.assertIsNotNone(building.type, 'building type is none') self.assertIsNotNone(building.volume, 'building volume is none') self.assertIsNotNone(building.detailed_polyhedron, 'building detailed polyhedron is none')