def test_sitenode_attribution_and_accessors(self): mainsite = SiteNode(self.big_rect_coords, id="{Main site ID}") subsite = SiteNode(self.subsite_A_coords, id="{Subsite ID}", parent_site=mainsite) level_curve_B = LevelCurve(self.level_curve_B_coords, altitude=20.0, parent_site=subsite, id=None) level_curve_A = LevelCurve(self.level_curve_A_coords, altitude=10.0, parent_site=mainsite, id=None) waterbody = WaterBody(self.waterbody_coords, altitude=5, parent_site=mainsite, id=None) vegarea = VegetationArea([(1, 1), (1, 3), (3, 1)], material=GroundMaterial('pine'), height=3, id=None) vegarea.parent_site = mainsite mainsite.add_child(self.material_area_A) self.assertCountEqual(mainsite.level_curves, [level_curve_A, waterbody]) self.assertCountEqual(mainsite.material_areas, [self.material_area_A, waterbody, vegarea]) self.assertCountEqual(mainsite.subsites, [subsite]) self.assertCountEqual(subsite.level_curves, [level_curve_B])
def build_features(self): self.mainsite = SiteNode(self.big_rect_coords, id="{Main site ID}") self.level_curve_A = LevelCurve(self.level_curve_A_coords, altitude=self.altitude_A, parent_site=self.mainsite, id="{Level curve A}") self.grass_area = MaterialArea(self.grass_area_coords, material=self.grass, parent_site=self.mainsite, id="{Grass area}") self.veg_area = VegetationArea(self.pine_area_coords, material=self.pine, height=5, parent_site=self.mainsite, id="{Pine area}") self.waterbody = WaterBody(self.waterbody_coords, altitude=self.altitude_water, parent_site=self.mainsite, id="{Water body}") self.subsite = SiteNode(self.subsite_A_coords, id="{Subsite ID}", parent_site=self.mainsite) self.level_curve_B = LevelCurve(self.level_curve_B_coords, altitude=self.altitude_B, parent_site=self.subsite, id="{Level curve B}") self.out_of_subsite = MaterialArea(rect(9, 9, 10, 10), material=self.grass, parent_site=self.subsite, id="{Out of subsite area}") self.building = InfrastructureLandtake(self.landtake_coords, parent_site=self.mainsite, id="{Building}")
def test_multipolygon_infrastructure_landtake(self): site_rect = rect(1, 1, 12, 12) mainsite = SiteNode(site_rect, id="{Main site}") rec, tri = rect(9, 9, 10, 10), [(2, 2), (2, 4), (3, 4)] building = InfrastructureLandtake(rec, tri, parent_site=mainsite, id="{multipolygon building}") coords = list(map(list, building._coords)) expected_coords = [ [(9, 9), (10, 9), (10, 10), (9, 10), (9, 9)], [(2, 2), (2, 4), (3, 4), (2, 2)], ] self.assertEqual(coords, expected_coords) cleaner = builder.recursively_merge_all_subsites(mainsite) msite = cleaner.merged_site() mbuilder = builder.MeshBuilder(msite) alti = mbuilder._build_altimetric_base() bmesh = mbuilder._build_triangulation(alti) mbuilder._compute_informations(bmesh) vertices = [ list(map(bmesh.py_vertex, vertices_groups)) for vertices_groups in mbuilder.vertices_for_feature[building.id] ] assert_array_equal(vertices, expected_coords)
def build_more_features_in_subsites(self): self.subsubsite = SiteNode(rect(6, 6.5, 7, 7.5), id="{SubSubsite ID}", parent_site=self.subsite) self.sub_level_curve = LevelCurve([(6.5, 5), (6.5, 9)], altitude=6.0, id="{Cut level curve}", parent_site=self.subsite) self.subsub_level_curve = LevelCurve([(5, 5.5), (8, 8.5)], altitude=7.0, id="{Subsub level curve}", parent_site=self.subsubsite)
def test_subsite_intersects_with_site(self): self.mainsite.drop_child(self.subsite) subsite = SiteNode(rect(-1, -1, 7, 5), id="{Intersecting subsite}", parent_site=self.mainsite) with self.assertRaises(RuntimeError) as cm: builder.recursively_merge_all_subsites(self.mainsite) self.assertEqual( str(cm.exception), 'SiteNode #{Intersecting subsite} is not strictly ' 'contained in main site')
def test_elementary_shapes(self): mainsite = SiteNode(self.big_rect_coords, id="{Main site ID}") mls = MultiLineString([[(0.0, 0.0), (1.0, 0.0)], [(1.0, 1.0), (1.0, 2.0)]]) ls1 = LineString([(0.0, 0.0), (1.0, 0.0)]) ls2 = LineString([(1.0, 1.0), (1.0, 2.0)]) level_curve = LevelCurve(mls, altitude=10.0, parent_site=mainsite, id=None) shapes = elementary_shapes(level_curve.shape) self.assertEqual(len(shapes), 2) for shape in shapes: self.assertTrue(ls1.equals(shape) or ls2.equals(shape))
def test_sorting_material_area_two_branches(self): site = SiteNode(rect(0, 0, 12, 12), id='{Main site}') cleaner = SiteNodeGeometryCleaner(self.mainsite) cleaner.process_material_areas() self.assertEqual(cleaner.check_issues_with_material_area_order(), [])
class AltimetryDataTC(unittest.TestCase): big_rect_coords = rect(0, 0, 12, 10) level_curve_A_coords = [(0, 0), (2.5, 3.5), (4, 4.0)] level_curve_A = LevelCurve(level_curve_A_coords, altitude=10.0, id="{123456}") level_curve_A_json = ( '{"geometry": {"coordinates": [[[0.0, 0.0], [2.5, 3.5], [4.0, 4.0]]],' ' "type": "MultiLineString"}, "id": "{123456}",' ' "properties": {"altitude": 10.0, "type": "LevelCurve"},' ' "type": "Feature"}') material_area_A_coords = big_rect_coords grass = GroundMaterial("grass") material_area_A = MaterialArea(material_area_A_coords, material=grass, id=None) material_area_A_json = ( '{"geometry": {' '"coordinates": [[[0.0, 0.0], [12.0, 0.0], [12.0, 10.0], [0.0, 10.0]]],' ' "type": "Polygon"},' ' "properties": {"material": "grass", "type": "MaterialArea"},' ' "type": "Feature"}') waterbody_coords = [(3, 3), (5, 4), (3, 5)] subsite_A_coords = [(8.0, 4.0), (8.0, 7.0), (12.0, 7.0)] subsite_A = SiteNode(subsite_A_coords, id='{Sub-site A ID}') level_curve_B_coords = [(8.0, 4.0), (8.0, 7.0), (12.0, 7.0)] def test_LevelCurve_as_json(self): self.assertEqual(self.level_curve_A.as_geojson, self.level_curve_A_json) def test_MaterialArea_as_json(self): self.assertEqual(self.material_area_A.as_geojson, self.material_area_A_json) def test_LevelCurve_as_shape(self): shape = self.level_curve_A.as_shape self.assertTrue( shape.equals(geometry.LineString(self.level_curve_A_coords))) def test_MaterialArea_as_shape(self): shape = geometry.shape(self.material_area_A) self.assertTrue( shape.equals(geometry.Polygon(self.material_area_A_coords))) def test_SiteNode_as_shape(self): shape = geometry.shape(self.subsite_A) self.assertTrue(shape.equals(geometry.Polygon(self.subsite_A_coords))) def test_site_belonging(self): self.assertIsNone(self.subsite_A.parent_site) level_curve_B = LevelCurve(self.level_curve_B_coords, altitude=20.0, parent_site=self.subsite_A, id=None) self.assertIn(level_curve_B, self.subsite_A.children["LevelCurve"]) self.assertEqual(level_curve_B.parent_site_id, "{Sub-site A ID}") def test_parent_site(self): level_curve_B = LevelCurve(self.level_curve_B_coords, altitude=20.0, id=None) self.assertIsNone(self.subsite_A.parent_site) level_curve_B.parent_site = self.subsite_A self.assertIn(level_curve_B, self.subsite_A.children["LevelCurve"]) del level_curve_B.parent_site self.assertNotIn(level_curve_B, self.subsite_A.children['LevelCurve']) def test_cached_shape_property(self): level_curve_B = LevelCurve(self.level_curve_B_coords, altitude=20.0, id=None) self.assertIsNone(level_curve_B._shape) shape = level_curve_B.shape self.assertTrue(shape.equals(level_curve_B.as_shape)) self.assertIs(shape, level_curve_B._shape) def test_polygon_validity(self): poly = PolygonalTympanFeature(self.big_rect_coords, id=None) try: poly.ensure_ok() except InconsistentGeometricModel: self.fail("poly was expected to be valid") coords = self.big_rect_coords[:] coords[1:3] = coords[2:0:-1] poly2 = PolygonalTympanFeature(coords, id="toto") with self.assertRaises(InconsistentGeometricModel) as cm: poly2.ensure_ok() self.assertEqual(cm.exception.ids, ["toto"]) self.assertIn("Self-intersection", str(cm.exception)) def test_polygon_exterior_orientation(self): coords = self.big_rect_coords[:] coords.reverse() # change orientation to CW poly = PolygonalTympanFeature(coords, id=None) self.assertTrue(poly.shape.exterior.is_ccw) def test_WaterBody_initialisation(self): waterbody = WaterBody(self.waterbody_coords, altitude=20, id=None) self.assertEqual(waterbody.altitude, 20.0) self.assertEqual(waterbody.material, MATERIAL_WATER) def test_sitenode_attribution_and_accessors(self): mainsite = SiteNode(self.big_rect_coords, id="{Main site ID}") subsite = SiteNode(self.subsite_A_coords, id="{Subsite ID}", parent_site=mainsite) level_curve_B = LevelCurve(self.level_curve_B_coords, altitude=20.0, parent_site=subsite, id=None) level_curve_A = LevelCurve(self.level_curve_A_coords, altitude=10.0, parent_site=mainsite, id=None) waterbody = WaterBody(self.waterbody_coords, altitude=5, parent_site=mainsite, id=None) vegarea = VegetationArea([(1, 1), (1, 3), (3, 1)], material=GroundMaterial('pine'), height=3, id=None) vegarea.parent_site = mainsite mainsite.add_child(self.material_area_A) self.assertCountEqual(mainsite.level_curves, [level_curve_A, waterbody]) self.assertCountEqual(mainsite.material_areas, [self.material_area_A, waterbody, vegarea]) self.assertCountEqual(mainsite.subsites, [subsite]) self.assertCountEqual(subsite.level_curves, [level_curve_B]) def test_elementary_shapes(self): mainsite = SiteNode(self.big_rect_coords, id="{Main site ID}") mls = MultiLineString([[(0.0, 0.0), (1.0, 0.0)], [(1.0, 1.0), (1.0, 2.0)]]) ls1 = LineString([(0.0, 0.0), (1.0, 0.0)]) ls2 = LineString([(1.0, 1.0), (1.0, 2.0)]) level_curve = LevelCurve(mls, altitude=10.0, parent_site=mainsite, id=None) shapes = elementary_shapes(level_curve.shape) self.assertEqual(len(shapes), 2) for shape in shapes: self.assertTrue(ls1.equals(shape) or ls2.equals(shape))