diff --git a/hub/helpers/geometry_helper.py b/hub/helpers/geometry_helper.py index d46eb71b..f6003ff7 100644 --- a/hub/helpers/geometry_helper.py +++ b/hub/helpers/geometry_helper.py @@ -16,6 +16,8 @@ from hub.city_model_structure.attributes.polygon import Polygon from hub.city_model_structure.attributes.polyhedron import Polyhedron from hub.helpers.location import Location +from PIL import Image + class MapPoint: def __init__(self, x, y): @@ -63,7 +65,7 @@ class GeometryHelper: return MapPoint(((city.upper_corner[0] - coordinate[0]) * 0.5), ((city.upper_corner[1] - coordinate[1]) * 0.5)) @staticmethod - def city_mapping(city, building_names=None): + def city_mapping(city, building_names=None, plot=False): """ Returns a shared_information dictionary like @@ -78,6 +80,8 @@ class GeometryHelper: y = int((city.upper_corner[1] - city.lower_corner[1]) * 0.5) + 1 city_map = [['' for _ in range(y + 1)] for _ in range(x + 1)] map_info = [[{} for _ in range(y + 1)] for _ in range(x + 1)] + img = Image.new('RGB', (x + 1, y + 1), "black") # create a new black image + city_image = img.load() # create the pixel map for building_name in building_names: building = city.city_object(building_name) line = 0 @@ -103,13 +107,14 @@ class GeometryHelper: 'line_start': (coordinate[0], coordinate[1]), 'line_end': (next_coordinate[0], next_coordinate[1]), } + city_image[x, y] = (100, 0, 0) elif city_map[x][y] != building.name: neighbour = city.city_object(city_map[x][y]) neighbour_info = map_info[x][y] # prepare the keys - neighbour_start_coordinate = f'{neighbour_info["line_start"][0]}_{neighbour_info["line_start"][1]}' - building_start_coordinate = f'{coordinate[0]}_{coordinate[1]}' + neighbour_start_coordinate = f'{GeometryHelper.coordinate_to_map_point(neighbour_info["line_start"], city)}' + building_start_coordinate = f'{GeometryHelper.coordinate_to_map_point(coordinate, city)}' neighbour_key = f'{neighbour.name}_{neighbour_start_coordinate}_{building_start_coordinate}' building_key = f'{building.name}_{building_start_coordinate}_{neighbour_start_coordinate}' @@ -126,6 +131,10 @@ class GeometryHelper: 'line_end': (next_coordinate[0], next_coordinate[1]), 'neighbour_line_start': neighbour_info['line_start'], 'neighbour_line_end': neighbour_info['line_end'], + 'coordinate_start': f"{GeometryHelper.coordinate_to_map_point(coordinate, city)}", + 'coordinate_end': f"{GeometryHelper.coordinate_to_map_point(next_coordinate, city)}", + 'neighbour_start': f"{GeometryHelper.coordinate_to_map_point(neighbour_info['line_start'], city)}", + 'neighbour_end': f"{GeometryHelper.coordinate_to_map_point(neighbour_info['line_end'], city)}", 'shared_points': 1 } @@ -142,6 +151,10 @@ class GeometryHelper: 'line_end': neighbour_info['line_end'], 'neighbour_line_start': (coordinate[0], coordinate[1]), 'neighbour_line_end': (next_coordinate[0], next_coordinate[1]), + 'neighbour_start': f"{GeometryHelper.coordinate_to_map_point(coordinate, city)}", + 'neighbour_end': f"{GeometryHelper.coordinate_to_map_point(next_coordinate, city)}", + 'coordinate_start': f"{GeometryHelper.coordinate_to_map_point(neighbour_info['line_start'], city)}", + 'coordinate_end': f"{GeometryHelper.coordinate_to_map_point(neighbour_info['line_end'], city)}", 'shared_points': 1 } @@ -154,6 +167,8 @@ class GeometryHelper: elif building not in neighbour.neighbours: neighbour.neighbours.append(building) line += 1 + if plot: + img.show() return lines_information @staticmethod diff --git a/hub/requirements.txt b/hub/requirements.txt index aefb96c6..306c0a4b 100644 --- a/hub/requirements.txt +++ b/hub/requirements.txt @@ -22,4 +22,5 @@ bcrypt==4.0.1 shapely geopandas triangle -psycopg2-binary \ No newline at end of file +psycopg2-binary +PIL \ No newline at end of file diff --git a/hub/unittests/test_geometry_factory.py b/hub/unittests/test_geometry_factory.py index c6a19d39..04c958e4 100644 --- a/hub/unittests/test_geometry_factory.py +++ b/hub/unittests/test_geometry_factory.py @@ -116,7 +116,6 @@ class TestGeometryFactory(TestCase): city = self._get_city(file, 'rhino') self.assertIsNotNone(city, 'city is none') self.assertTrue(len(city.buildings) == 36) - i = 0 def test_import_obj(self): """ @@ -155,7 +154,7 @@ class TestGeometryFactory(TestCase): height_field='citygml_me', year_of_construction_field='ANNEE_CONS', function_field='LIBELLE_UT') - print(GeometryHelper.city_mapping(city)) + print(GeometryHelper.city_mapping(city, plot=True)) for building in city.buildings: self.assertEqual(2, len(building.neighbours)) @@ -165,4 +164,3 @@ class TestGeometryFactory(TestCase): self.assertEqual('3_part_0_zone_0',city.city_object('2_part_0_zone_0').neighbours[1].name) self.assertEqual('1_part_0_zone_0', city.city_object('3_part_0_zone_0').neighbours[0].name) self.assertEqual('2_part_0_zone_0', city.city_object('3_part_0_zone_0').neighbours[1].name) -