added shared walls to geojson. geojson importer test raises an error because the surfaces are triangulated. It should be solved when extrusion is finished

This commit is contained in:
Pilar 2023-03-10 15:15:18 -05:00
parent d198ac9141
commit a0e52b3e8d
2 changed files with 26 additions and 21 deletions

View File

@ -120,33 +120,34 @@ class Geojson:
def _store_shared_percentage_to_walls(self, city, city_mapped): def _store_shared_percentage_to_walls(self, city, city_mapped):
for building in city.buildings: for building in city.buildings:
building_mapped = city_mapped[building.name] building_mapped = city_mapped[building.name]
for entry in building_mapped: for wall in building.walls:
if building_mapped[entry]['shared_points'] <= 3: percentage = 0
ground_line = []
for point in wall.perimeter_polygon.coordinates:
if point[2] < 0.5:
ground_line.append(point)
# todo: erase when we have no triangulation
if len(ground_line) < 2:
continue continue
line = [building_mapped[entry]['line_start'], building_mapped[entry]['line_end']] # todo: erase down to here
neighbour_line = [building_mapped[entry]['neighbour_line_start'], building_mapped[entry]['neighbour_line_end']] for entry in building_mapped:
neighbour_height = city.city_object(building_mapped[entry]['neighbour_name']).max_height if building_mapped[entry]['shared_points'] <= 5:
for wall in building.walls:
percentage = 0
ground_line = []
for point in wall.perimeter_polygon.coordinates:
if point[2] < 0.5:
ground_line.append(point)
# todo: erase when we have no triangulation
if len(ground_line) < 2:
continue continue
# todo: erase down to here line = [building_mapped[entry]['line_start'], building_mapped[entry]['line_end']]
neighbour_line = [building_mapped[entry]['neighbour_line_start'],
building_mapped[entry]['neighbour_line_end']]
neighbour_height = city.city_object(building_mapped[entry]['neighbour_name']).max_height
if self._find_wall(line, ground_line): if self._find_wall(line, ground_line):
line_shared = (GeometryHelper.distance_between_points(line[0], line[1]) + line_shared = (GeometryHelper.distance_between_points(line[0], line[1]) +
GeometryHelper.distance_between_points(neighbour_line[0], neighbour_line[1]) - GeometryHelper.distance_between_points(neighbour_line[0], neighbour_line[1]) -
GeometryHelper.distance_between_points(line[1], neighbour_line[0]) - GeometryHelper.distance_between_points(line[1], neighbour_line[0]) -
GeometryHelper.distance_between_points(line[0], neighbour_line[1])) / 2 GeometryHelper.distance_between_points(line[0], neighbour_line[1])) / 2
percentage = line_shared / GeometryHelper.distance_between_points(line[0], line[1]) percentage_ground = line_shared / GeometryHelper.distance_between_points(line[0], line[1])
percentage_height = neighbour_height / building.max_height percentage_height = neighbour_height / building.max_height
if percentage_height > 1: if percentage_height > 1:
percentage_height = 1 percentage_height = 1
percentage = percentage * percentage_height percentage += percentage_ground * percentage_height
wall.percentage_shared = percentage wall.percentage_shared = percentage
@property @property
def city(self) -> City: def city(self) -> City:
@ -157,6 +158,7 @@ class Geojson:
missing_functions = [] missing_functions = []
buildings = [] buildings = []
building_id = 0 building_id = 0
lod = 1
for feature in self._geojson['features']: for feature in self._geojson['features']:
extrusion_height = 0 extrusion_height = 0
if self._extrusion_height_field is not None: if self._extrusion_height_field is not None:
@ -182,7 +184,6 @@ class Geojson:
building_name = f'building_{building_id}' building_name = f'building_{building_id}'
building_id += 1 building_id += 1
polygons = [] polygons = []
lod = 1
for part, coordinates in enumerate(geometry['coordinates']): for part, coordinates in enumerate(geometry['coordinates']):
polygons = self._get_polygons(polygons, coordinates) polygons = self._get_polygons(polygons, coordinates)
for zone, polygon in enumerate(polygons): for zone, polygon in enumerate(polygons):
@ -205,6 +206,9 @@ class Geojson:
for building in buildings: for building in buildings:
self._city.add_city_object(building) self._city.add_city_object(building)
self._city.level_of_detail.geometry = lod self._city.level_of_detail.geometry = lod
if lod == 1:
lines_information = GeometryHelper.city_mapping(self._city)
self._store_shared_percentage_to_walls(self._city, lines_information)
if len(missing_functions) > 0: if len(missing_functions) > 0:
print(f'There are unknown functions {missing_functions}') print(f'There are unknown functions {missing_functions}')
return self._city return self._city

View File

@ -9,8 +9,6 @@ from pathlib import Path
from unittest import TestCase from unittest import TestCase
from hub.helpers.geometry_helper import GeometryHelper from hub.helpers.geometry_helper import GeometryHelper
from numpy import inf
import hub.exports.exports_factory import hub.exports.exports_factory
from hub.imports.construction_factory import ConstructionFactory from hub.imports.construction_factory import ConstructionFactory
from hub.imports.geometry_factory import GeometryFactory from hub.imports.geometry_factory import GeometryFactory
@ -135,7 +133,7 @@ class TestGeometryFactory(TestCase):
""" """
Test geojson import Test geojson import
""" """
file = 'concordia.geojson' file = 'neighbours.geojson'
city = self._get_city(file, 'geojson', city = self._get_city(file, 'geojson',
height_field='citygml_me', height_field='citygml_me',
year_of_construction_field='ANNEE_CONS', year_of_construction_field='ANNEE_CONS',
@ -144,6 +142,9 @@ class TestGeometryFactory(TestCase):
hub.exports.exports_factory.ExportsFactory('obj', city, self._output_path).export() hub.exports.exports_factory.ExportsFactory('obj', city, self._output_path).export()
self.assertEqual(207, len(city.buildings), 'wrong number of buildings') self.assertEqual(207, len(city.buildings), 'wrong number of buildings')
self._check_buildings(city) self._check_buildings(city)
for building in city.buildings:
for wall in building.walls:
self.assertIsNotNone(wall.percentage_shared, 'wall percentage shared is not assigned')
def test_map_neighbours(self): def test_map_neighbours(self):
""" """