2021-05-26 18:17:23 -04:00
|
|
|
"""
|
|
|
|
Geometry helper
|
|
|
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
|
|
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
|
|
|
|
"""
|
|
|
|
|
2021-06-10 10:48:30 -04:00
|
|
|
import helpers.constants as cte
|
|
|
|
|
2021-05-26 18:17:23 -04:00
|
|
|
|
|
|
|
class GeometryHelper:
|
2021-08-27 12:51:30 -04:00
|
|
|
"""
|
|
|
|
Geometry helper
|
|
|
|
"""
|
2021-05-26 18:17:23 -04:00
|
|
|
# function
|
2022-03-17 18:49:44 -04:00
|
|
|
_pluto_to_function = {
|
|
|
|
'A0': cte.SFH,
|
|
|
|
'A1': cte.SFH,
|
|
|
|
'A2': cte.SFH,
|
|
|
|
'A3': cte.SFH,
|
|
|
|
'A4': cte.SFH,
|
|
|
|
'A5': cte.SFH,
|
|
|
|
'A6': cte.SFH,
|
|
|
|
'A7': cte.SFH,
|
|
|
|
'A8': cte.SFH,
|
|
|
|
'A9': cte.SFH,
|
|
|
|
'B1': cte.MFH,
|
|
|
|
'B2': cte.MFH,
|
|
|
|
'B3': cte.MFH,
|
|
|
|
'B9': cte.MFH,
|
|
|
|
'C0': cte.RESIDENTIAL,
|
|
|
|
'C1': cte.RESIDENTIAL,
|
|
|
|
'C2': cte.RESIDENTIAL,
|
|
|
|
'C3': cte.RESIDENTIAL,
|
|
|
|
'C4': cte.RESIDENTIAL,
|
|
|
|
'C5': cte.RESIDENTIAL,
|
|
|
|
'C6': cte.RESIDENTIAL,
|
|
|
|
'C7': cte.RESIDENTIAL,
|
|
|
|
'C8': cte.RESIDENTIAL,
|
|
|
|
'C9': cte.RESIDENTIAL,
|
|
|
|
'D0': cte.RESIDENTIAL,
|
|
|
|
'D1': cte.RESIDENTIAL,
|
|
|
|
'D2': cte.RESIDENTIAL,
|
|
|
|
'D3': cte.RESIDENTIAL,
|
|
|
|
'D4': cte.RESIDENTIAL,
|
|
|
|
'D5': cte.RESIDENTIAL,
|
|
|
|
'D6': cte.RESIDENTIAL,
|
|
|
|
'D7': cte.RESIDENTIAL,
|
|
|
|
'D8': cte.RESIDENTIAL,
|
|
|
|
'D9': cte.RESIDENTIAL,
|
|
|
|
'E1': cte.WAREHOUSE,
|
|
|
|
'E3': cte.WAREHOUSE,
|
|
|
|
'E4': cte.WAREHOUSE,
|
|
|
|
'E5': cte.WAREHOUSE,
|
|
|
|
'E7': cte.WAREHOUSE,
|
|
|
|
'E9': cte.WAREHOUSE,
|
|
|
|
'F1': cte.WAREHOUSE,
|
|
|
|
'F2': cte.WAREHOUSE,
|
|
|
|
'F4': cte.WAREHOUSE,
|
|
|
|
'F5': cte.WAREHOUSE,
|
|
|
|
'F8': cte.WAREHOUSE,
|
|
|
|
'F9': cte.WAREHOUSE,
|
|
|
|
'G0': cte.OFFICE,
|
|
|
|
'G1': cte.OFFICE,
|
|
|
|
'G2': cte.OFFICE,
|
|
|
|
'G3': cte.OFFICE,
|
|
|
|
'G4': cte.OFFICE,
|
|
|
|
'G5': cte.OFFICE,
|
|
|
|
'G6': cte.OFFICE,
|
|
|
|
'G7': cte.OFFICE,
|
|
|
|
'G8': cte.OFFICE,
|
|
|
|
'G9': cte.OFFICE,
|
|
|
|
'H1': cte.HOTEL,
|
|
|
|
'H2': cte.HOTEL,
|
|
|
|
'H3': cte.HOTEL,
|
|
|
|
'H4': cte.HOTEL,
|
|
|
|
'H5': cte.HOTEL,
|
|
|
|
'H6': cte.HOTEL,
|
|
|
|
'H7': cte.HOTEL,
|
|
|
|
'H8': cte.HOTEL,
|
|
|
|
'H9': cte.HOTEL,
|
|
|
|
'HB': cte.HOTEL,
|
|
|
|
'HH': cte.HOTEL,
|
|
|
|
'HR': cte.HOTEL,
|
|
|
|
'HS': cte.HOTEL,
|
|
|
|
'I1': cte.HOSPITAL,
|
|
|
|
'I2': cte.OUTPATIENT,
|
|
|
|
'I3': cte.OUTPATIENT,
|
|
|
|
'I4': cte.RESIDENTIAL,
|
|
|
|
'I5': cte.OUTPATIENT,
|
|
|
|
'I6': cte.OUTPATIENT,
|
|
|
|
'I7': cte.OUTPATIENT,
|
|
|
|
'I9': cte.OUTPATIENT,
|
|
|
|
'J1': cte.LARGE_OFFICE,
|
|
|
|
'J2': cte.LARGE_OFFICE,
|
|
|
|
'J3': cte.LARGE_OFFICE,
|
|
|
|
'J4': cte.LARGE_OFFICE,
|
|
|
|
'J5': cte.LARGE_OFFICE,
|
|
|
|
'J6': cte.LARGE_OFFICE,
|
|
|
|
'J7': cte.LARGE_OFFICE,
|
|
|
|
'J8': cte.LARGE_OFFICE,
|
|
|
|
'J9': cte.LARGE_OFFICE,
|
|
|
|
'K1': cte.STRIP_MALL,
|
|
|
|
'K2': cte.STRIP_MALL,
|
|
|
|
'K3': cte.STRIP_MALL,
|
|
|
|
'K4': cte.RESIDENTIAL,
|
|
|
|
'K5': cte.RESTAURANT,
|
|
|
|
'K6': cte.COMMERCIAL,
|
|
|
|
'K7': cte.COMMERCIAL,
|
|
|
|
'K8': cte.COMMERCIAL,
|
|
|
|
'K9': cte.COMMERCIAL,
|
|
|
|
'L1': cte.RESIDENTIAL,
|
|
|
|
'L2': cte.RESIDENTIAL,
|
|
|
|
'L3': cte.RESIDENTIAL,
|
|
|
|
'L8': cte.RESIDENTIAL,
|
|
|
|
'L9': cte.RESIDENTIAL,
|
|
|
|
'M1': cte.LARGE_OFFICE,
|
|
|
|
'M2': cte.LARGE_OFFICE,
|
|
|
|
'M3': cte.LARGE_OFFICE,
|
|
|
|
'M4': cte.LARGE_OFFICE,
|
|
|
|
'M9': cte.LARGE_OFFICE,
|
|
|
|
'N1': cte.RESIDENTIAL,
|
|
|
|
'N2': cte.RESIDENTIAL,
|
|
|
|
'N3': cte.RESIDENTIAL,
|
|
|
|
'N4': cte.RESIDENTIAL,
|
|
|
|
'N9': cte.RESIDENTIAL,
|
|
|
|
'O1': cte.OFFICE,
|
|
|
|
'O2': cte.OFFICE,
|
|
|
|
'O3': cte.OFFICE,
|
|
|
|
'O4': cte.OFFICE,
|
|
|
|
'O5': cte.OFFICE,
|
|
|
|
'O6': cte.OFFICE,
|
|
|
|
'O7': cte.OFFICE,
|
|
|
|
'O8': cte.OFFICE,
|
|
|
|
'O9': cte.OFFICE,
|
|
|
|
'P1': cte.LARGE_OFFICE,
|
|
|
|
'P2': cte.HOTEL,
|
|
|
|
'P3': cte.OFFICE,
|
|
|
|
'P4': cte.OFFICE,
|
|
|
|
'P5': cte.OFFICE,
|
|
|
|
'P6': cte.OFFICE,
|
|
|
|
'P7': cte.LARGE_OFFICE,
|
|
|
|
'P8': cte.LARGE_OFFICE,
|
|
|
|
'P9': cte.OFFICE,
|
|
|
|
'Q0': cte.OFFICE,
|
|
|
|
'Q1': cte.OFFICE,
|
|
|
|
'Q2': cte.OFFICE,
|
|
|
|
'Q3': cte.OFFICE,
|
|
|
|
'Q4': cte.OFFICE,
|
|
|
|
'Q5': cte.OFFICE,
|
|
|
|
'Q6': cte.OFFICE,
|
|
|
|
'Q7': cte.OFFICE,
|
|
|
|
'Q8': cte.OFFICE,
|
|
|
|
'Q9': cte.OFFICE,
|
|
|
|
'R0': cte.RESIDENTIAL,
|
|
|
|
'R1': cte.RESIDENTIAL,
|
|
|
|
'R2': cte.RESIDENTIAL,
|
|
|
|
'R3': cte.RESIDENTIAL,
|
|
|
|
'R4': cte.RESIDENTIAL,
|
|
|
|
'R5': cte.RESIDENTIAL,
|
|
|
|
'R6': cte.RESIDENTIAL,
|
|
|
|
'R7': cte.RESIDENTIAL,
|
|
|
|
'R8': cte.RESIDENTIAL,
|
|
|
|
'R9': cte.RESIDENTIAL,
|
|
|
|
'RA': cte.RESIDENTIAL,
|
|
|
|
'RB': cte.RESIDENTIAL,
|
|
|
|
'RC': cte.RESIDENTIAL,
|
|
|
|
'RD': cte.RESIDENTIAL,
|
|
|
|
'RG': cte.RESIDENTIAL,
|
|
|
|
'RH': cte.RESIDENTIAL,
|
|
|
|
'RI': cte.RESIDENTIAL,
|
|
|
|
'RK': cte.RESIDENTIAL,
|
|
|
|
'RM': cte.RESIDENTIAL,
|
|
|
|
'RR': cte.RESIDENTIAL,
|
|
|
|
'RS': cte.RESIDENTIAL,
|
|
|
|
'RW': cte.RESIDENTIAL,
|
|
|
|
'RX': cte.RESIDENTIAL,
|
|
|
|
'RZ': cte.RESIDENTIAL,
|
|
|
|
'S0': cte.RESIDENTIAL,
|
|
|
|
'S1': cte.RESIDENTIAL,
|
|
|
|
'S2': cte.RESIDENTIAL,
|
|
|
|
'S3': cte.RESIDENTIAL,
|
|
|
|
'S4': cte.RESIDENTIAL,
|
|
|
|
'S5': cte.RESIDENTIAL,
|
|
|
|
'S9': cte.RESIDENTIAL,
|
|
|
|
'U0': cte.WAREHOUSE,
|
|
|
|
'U1': cte.WAREHOUSE,
|
|
|
|
'U2': cte.WAREHOUSE,
|
|
|
|
'U3': cte.WAREHOUSE,
|
|
|
|
'U4': cte.WAREHOUSE,
|
|
|
|
'U5': cte.WAREHOUSE,
|
|
|
|
'U6': cte.WAREHOUSE,
|
|
|
|
'U7': cte.WAREHOUSE,
|
|
|
|
'U8': cte.WAREHOUSE,
|
|
|
|
'U9': cte.WAREHOUSE,
|
|
|
|
'W1': cte.PRIMARY_SCHOOL,
|
|
|
|
'W2': cte.PRIMARY_SCHOOL,
|
|
|
|
'W3': cte.SECONDARY_SCHOOL,
|
|
|
|
'W4': cte.SECONDARY_SCHOOL,
|
|
|
|
'W5': cte.SECONDARY_SCHOOL,
|
|
|
|
'W6': cte.SECONDARY_SCHOOL,
|
|
|
|
'W7': cte.SECONDARY_SCHOOL,
|
|
|
|
'W8': cte.PRIMARY_SCHOOL,
|
|
|
|
'W9': cte.SECONDARY_SCHOOL,
|
|
|
|
'Y1': cte.LARGE_OFFICE,
|
|
|
|
'Y2': cte.LARGE_OFFICE,
|
|
|
|
'Y3': cte.LARGE_OFFICE,
|
|
|
|
'Y4': cte.LARGE_OFFICE,
|
|
|
|
'Y5': cte.LARGE_OFFICE,
|
|
|
|
'Y6': cte.LARGE_OFFICE,
|
|
|
|
'Y7': cte.LARGE_OFFICE,
|
|
|
|
'Y8': cte.LARGE_OFFICE,
|
|
|
|
'Y9': cte.LARGE_OFFICE,
|
|
|
|
'Z1': cte.LARGE_OFFICE
|
2021-05-26 18:17:23 -04:00
|
|
|
}
|
2022-03-17 18:49:44 -04:00
|
|
|
_hft_to_function = {
|
2021-06-10 10:48:30 -04:00
|
|
|
'residential': cte.RESIDENTIAL,
|
|
|
|
'single family house': cte.SFH,
|
|
|
|
'multifamily house': cte.MFH,
|
|
|
|
'hotel': cte.HOTEL,
|
|
|
|
'hospital': cte.HOSPITAL,
|
|
|
|
'outpatient': cte.OUTPATIENT,
|
|
|
|
'commercial': cte.COMMERCIAL,
|
|
|
|
'strip mall': cte.STRIP_MALL,
|
|
|
|
'warehouse': cte.WAREHOUSE,
|
|
|
|
'primary school': cte.PRIMARY_SCHOOL,
|
|
|
|
'secondary school': cte.SECONDARY_SCHOOL,
|
|
|
|
'office': cte.OFFICE,
|
|
|
|
'large office': cte.LARGE_OFFICE
|
2021-05-26 18:17:23 -04:00
|
|
|
}
|
|
|
|
|
2021-06-03 15:56:59 -04:00
|
|
|
# usage
|
2022-03-17 18:49:44 -04:00
|
|
|
_function_to_usage = {
|
|
|
|
cte.RESTAURANT: cte.RESTAURANT,
|
|
|
|
cte.RESIDENTIAL: cte.RESIDENTIAL,
|
|
|
|
cte.HOSPITAL: cte.HEALTH_CARE,
|
|
|
|
cte.HOTEL: cte.HOTEL,
|
|
|
|
cte.LARGE_OFFICE: cte.OFFICE_ADMINISTRATION,
|
|
|
|
cte.OFFICE: cte.OFFICE_ADMINISTRATION,
|
|
|
|
cte.PRIMARY_SCHOOL: cte.EDUCATION,
|
|
|
|
cte.SECONDARY_SCHOOL: cte.EDUCATION,
|
|
|
|
cte.RETAIL: cte.RETAIL,
|
|
|
|
cte.STRIP_MALL: cte.HALL,
|
|
|
|
cte.WAREHOUSE: cte.INDUSTRY
|
2021-05-26 18:17:23 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def function_from_hft(building_hft_function):
|
|
|
|
"""
|
|
|
|
Get internal function from the given HfT function
|
|
|
|
:param building_hft_function: str
|
|
|
|
:return: str
|
|
|
|
"""
|
2022-03-17 18:49:44 -04:00
|
|
|
return GeometryHelper._hft_to_function[building_hft_function]
|
2021-05-26 18:17:23 -04:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def function_from_pluto(building_pluto_function):
|
|
|
|
"""
|
|
|
|
Get internal function from the given pluto function
|
|
|
|
:param building_pluto_function: str
|
|
|
|
:return: str
|
|
|
|
"""
|
2022-03-17 18:49:44 -04:00
|
|
|
return GeometryHelper._pluto_to_function[building_pluto_function]
|
2021-05-26 18:17:23 -04:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def usage_from_function(building_function):
|
|
|
|
"""
|
2021-06-03 15:56:59 -04:00
|
|
|
Get the internal usage for the given internal building function
|
2021-05-26 18:17:23 -04:00
|
|
|
:param building_function: str
|
|
|
|
:return: str
|
|
|
|
"""
|
2022-03-17 18:49:44 -04:00
|
|
|
return GeometryHelper._function_to_usage[building_function]
|
2021-06-02 11:16:00 -04:00
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def to_points_matrix(points):
|
|
|
|
"""
|
|
|
|
Transform a point vector into a point matrix
|
|
|
|
:param points: [x, y, z, x, y, z ...]
|
|
|
|
:return: [[x,y,z],[x,y,z]...]
|
|
|
|
"""
|
|
|
|
rows = points.size // 3
|
|
|
|
points = points.reshape(rows, 3)
|
|
|
|
return points
|
|
|
|
|
2021-06-03 10:12:06 -04:00
|
|
|
@staticmethod
|
|
|
|
def gml_surface_to_libs(surface):
|
2021-08-27 12:51:30 -04:00
|
|
|
"""
|
|
|
|
Transform citygml surface names into libs names
|
|
|
|
"""
|
2021-06-03 10:12:06 -04:00
|
|
|
if surface == 'WallSurface':
|
|
|
|
return 'Wall'
|
2021-08-27 12:51:30 -04:00
|
|
|
if surface == 'GroundSurface':
|
2021-06-03 10:12:06 -04:00
|
|
|
return 'Ground'
|
2021-08-27 12:51:30 -04:00
|
|
|
return 'Roof'
|