diff --git a/city_model_structure/city.py b/city_model_structure/city.py index 3b4582df..40f80e98 100644 --- a/city_model_structure/city.py +++ b/city_model_structure/city.py @@ -1,11 +1,22 @@ -from city_model_structure.city_object import CityObject +""" +City module +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca +""" + +import sys from typing import List, Union import pyproj from pyproj import Transformer import reverse_geocoder as rg +from city_model_structure.city_object import CityObject class City: + """ + City class + """ + def __init__(self, lower_corner, upper_corner, srs_name, city_objects=None): self._city_objects = None self._name = None @@ -16,16 +27,14 @@ class City: # todo: right now extracted at city level, in the future should be extracted also at building level if exist self._location = None - @property - def location(self): + def _get_location(self): if self._location is None: gps = pyproj.CRS('EPSG:4326') # LatLon with WGS84 datum used by GPS units and Google Earth - input_reference = None try: input_reference = pyproj.CRS(self.srs_name) # Projected coordinate system from input data except pyproj.exceptions.CRSError: print('Invalid projection reference system, please check the input data. (e.g. in CityGML files: srs_name)') - quit() + sys.exit() transformer = Transformer.from_crs(input_reference, gps) coordinates = transformer.transform(self.lower_corner[0], self.lower_corner[1]) self._location = rg.search(coordinates) @@ -33,33 +42,63 @@ class City: @property def country_code(self): - return self.location[0]['cc'] + """ + City country code + :return: str + """ + return self._get_location()[0]['cc'] @property def name(self): + """ + City name + :return: str + """ if self._name is None: - self._name = self.location[0]['name'] + self._name = self._get_location()[0]['name'] return self._name @property def city_objects(self) -> Union[List[CityObject], None]: + """ + CityObjects belonging to the city + :return: None or a list of CityObjects + """ return self._city_objects @property def lower_corner(self): + """ + City lower corner + :return: [x,y,z] + """ return self._lower_corner @property def upper_corner(self): + """ + City upper corner + :return: [x,y,z] + """ return self._upper_corner def city_object(self, name) -> Union[CityObject, None]: - for c in self.city_objects: - if c.name == name: - return c + """ + Retrieve the city CityObject with the given name + :param name:str + :return: None or CityObject + """ + for city_object in self.city_objects: + if city_object.name == name: + return city_object return None def add_city_object(self, new_city_object): + """ + Add a CityObject to the city + :param new_city_object:CityObject + :return: None + """ if self._city_objects is None: self._city_objects = [] for city_object in self.city_objects: @@ -70,8 +109,17 @@ class City: @property def srs_name(self): + """ + srs name + :return: str + """ return self._srs_name @name.setter def name(self, value): + """ + Set the city name + :param value: + :return: None + """ self._name = value diff --git a/city_model_structure/thermal_boundary.py b/city_model_structure/thermal_boundary.py index 552e664a..2b4c0eef 100644 --- a/city_model_structure/thermal_boundary.py +++ b/city_model_structure/thermal_boundary.py @@ -1,5 +1,5 @@ from city_model_structure.thermal_opening import ThermalOpening -from city_model_structure.surface import Surface +from city_model_structure.thermal_zone import ThermalZone from city_model_structure.layer import Layer from helpers.configuration import Configuration from typing import List @@ -21,7 +21,7 @@ class ThermalBoundary: self._shortwave_reflectance = None @property - def delimits(self) -> List[Surface]: + def delimits(self) -> List[ThermalZone]: return self._delimits @property diff --git a/city_model_structure/thermal_opening.py b/city_model_structure/thermal_opening.py index 159aee9d..9ad05494 100644 --- a/city_model_structure/thermal_opening.py +++ b/city_model_structure/thermal_opening.py @@ -3,7 +3,6 @@ from helpers.configuration import Configuration class ThermalOpening: def __init__(self): - self._area = None self._openable_ratio = None self._conductivity_w_mk = None self._frame_ratio = Configuration().frame_ratio @@ -13,14 +12,6 @@ class ThermalOpening: self._outside_reflectance = None self._u_value = None - @property - def area(self): - return self._area - - @area.setter - def area(self, value): - self._area = value - @property def openable_ratio(self): raise Exception('Not implemented') diff --git a/tests/test_geometry_factory.py b/tests/test_geometry_factory.py index bbd36ac4..8b38d9a3 100644 --- a/tests/test_geometry_factory.py +++ b/tests/test_geometry_factory.py @@ -27,7 +27,6 @@ class TestGeometryFactory(TestCase): self.assertIsNotNone(city.upper_corner, 'upper_corner is none') self.assertIsNotNone(city.name, 'name is none') self.assertIsNotNone(city.country_code, 'country code is none') - self.assertIsNotNone(city.location, 'location is none') def test_citygml_city_objects(self): city = self.get_citygml()