Merge remote-tracking branch 'origin/master'

This commit is contained in:
Pilar 2021-05-25 13:35:06 -04:00
commit e486e352a4

View File

@ -5,13 +5,13 @@ Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@conc
""" """
import numpy as np import numpy as np
import xmltodict import xmltodict
import time
from city_model_structure.city import City from city_model_structure.city import City
from city_model_structure.building import Building from city_model_structure.building import Building
from city_model_structure.attributes.surface import Surface from city_model_structure.attributes.surface import Surface
from helpers.geometry_helper import GeometryHelper from helpers.geometry_helper import GeometryHelper
from city_model_structure.attributes.polygon import Polygon from city_model_structure.attributes.polygon import Polygon
from city_model_structure.attributes.thermal_zone import ThermalZone
class CityGml: class CityGml:
@ -70,10 +70,12 @@ class CityGml:
City model structure enriched with the geometry information City model structure enriched with the geometry information
:return: City :return: City
""" """
init = time.process_time_ns()
if self._city is None: if self._city is None:
# todo: refactor this method to clearly choose the gml type # todo: refactor this method to clearly choose the gml type
self._city = City(self._lower_corner, self._upper_corner, self._srs_name) self._city = City(self._lower_corner, self._upper_corner, self._srs_name)
i = 0 i = 0
building_part = None
for o in self._gml['CityModel']['cityObjectMember']: for o in self._gml['CityModel']['cityObjectMember']:
i += 1 i += 1
lod = 0 lod = 0
@ -98,20 +100,30 @@ class CityGml:
lod += 4 lod += 4
if 'lod4Solid' in o['Building']: if 'lod4Solid' in o['Building']:
lod += 8 lod += 8
name = o['Building']['@id']
lod_terrain_str = 'lod' + str(lod) + 'TerrainIntersection' lod_terrain_str = 'lod' + str(lod) + 'TerrainIntersection'
terrains = [] terrains = []
if lod_terrain_str in o['Building']: if lod_terrain_str in o['Building']:
terrains = self._terrains(o, lod_terrain_str) terrains = self._terrains(o, lod_terrain_str)
year_of_construction = None
function = None
if 'yearOfConstruction' in o['Building']:
year_of_construction = o['Building']['yearOfConstruction']
if 'function' in o['Building']:
function = o['Building']['function']
building = Building(name, lod, surfaces, year_of_construction, function, self._lower_corner, terrains)
self._city.add_city_object(building)
function = None
year_of_construction = None
if 'consistsOfBuildingPart' in o['Building']:
if 'BuildingPart' in o['Building']['consistsOfBuildingPart']:
name = o['Building']['consistsOfBuildingPart']['BuildingPart']['name']
if 'yearOfConstruction' in o['Building']['consistsOfBuildingPart']['BuildingPart']:
year_of_construction = o['Building']['consistsOfBuildingPart']['BuildingPart']['yearOfConstruction']
if 'function' in o['Building']['consistsOfBuildingPart']['BuildingPart']:
function = o['Building']['consistsOfBuildingPart']['BuildingPart']['function']
else:
name = o['Building']['@id']
if 'yearOfConstruction' in o['Building']:
year_of_construction = o['Building']['yearOfConstruction']
if 'function' in o['Building']:
function = o['Building']['function']
self._city.add_city_object(Building(name, lod, surfaces, terrains, year_of_construction, function,
self._lower_corner))
return self._city return self._city
def _terrains(self, city_object, lod_terrain_str): def _terrains(self, city_object, lod_terrain_str):
@ -147,8 +159,19 @@ class CityGml:
@staticmethod @staticmethod
def _lod2_solid_multi_surface(o): def _lod2_solid_multi_surface(o):
polygons = [Polygon(CityGml._remove_last_point(s['Polygon']['exterior']['LinearRing']['posList'])) if 'boundedBy' in o['Building']['consistsOfBuildingPart']['BuildingPart']:
for s in o['Building']['lod2MultiSurface']['MultiSurface']['surfaceMember']] if 'RoofSurface' in o['Building']['consistsOfBuildingPart']['BuildingPart']['boundedBy']:
if o['Building']['consistsOfBuildingPart']['BuildingPart']['boundedBy']['RoofSurface']['lod2MultiSurface'] != 'None':
polygons = [Polygon(CityGml._remove_last_point(s['Polygon']['exterior']['LinearRing']['posList']))
for s in o['Building']['consistsOfBuildingPart']['BuildingPart']['boundedBy']['RoofSurface']['lod2MultiSurface']['MultiSurface']['surfaceMember']]
elif 'WallSurface' in o['Building']['consistsOfBuildingPart']['BuildingPart']['boundedBy']:
if o['Building']['consistsOfBuildingPart']['BuildingPart']['boundedBy']['WallSurface']['lod2MultiSurface'] != 'None':
polygons = [Polygon(CityGml._remove_last_point(s['Polygon']['exterior']['LinearRing']['posList']))
for s in o['Building']['consistsOfBuildingPart']['BuildingPart']['boundedBy']['WallSurface']['lod2MultiSurface']['MultiSurface']['surfaceMember']]
else:
polygons = [Polygon(CityGml._remove_last_point(s['Polygon']['exterior']['LinearRing']['posList']))
for s in o['Building']['lod2MultiSurface']['MultiSurface']['surfaceMember']]
return [Surface(p,p) for p in polygons] return [Surface(p,p) for p in polygons]
@staticmethod @staticmethod
@ -176,7 +199,7 @@ class CityGml:
if 'CompositeSurface' in s: if 'CompositeSurface' in s:
surfaces = surfaces + CityGml._lod2_composite_surface(s) surfaces = surfaces + CityGml._lod2_composite_surface(s)
else: else:
surfaces = surfaces + CityGml._lod2_multi_surface(s, GeometryHelper.gml_surface_to_libs(surface_type)) surfaces = surfaces + CityGml._lod2_multi_surface(s, surface_type)
return surfaces return surfaces
@staticmethod @staticmethod