forked from s_ranjbar/city_retrofit
refactoring and code cleaning
This commit is contained in:
parent
d7b24eba41
commit
a9b0579e01
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue
Block a user