def test_to_geojson(): """Test the Model to_geojson method.""" pts_1 = (Point3D(50, 50, 3), Point3D(60, 50, 3), Point3D(60, 60, 3), Point3D(50, 60, 3)) pts_2 = (Point3D(60, 50, 3), Point3D(70, 50, 3), Point3D(70, 60, 3), Point3D(60, 60, 3)) pts_3 = (Point3D(50, 70, 3), Point3D(70, 70, 3), Point3D(70, 80, 3), Point3D(50, 80, 3)) room2d_1 = Room2D('Residence1', Face3D(pts_1), 3) room2d_2 = Room2D('Residence2', Face3D(pts_2), 3) room2d_3 = Room2D('Retail', Face3D(pts_3), 3) story_big = Story('RetailFloor', [room2d_3]) story = Story('ResidenceFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 3 building = Building('ResidenceBuilding', [story]) story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_big.multiplier = 1 building_big = Building('RetailBuildingBig', [story_big]) pts_1 = (Point3D(0, 0, 3), Point3D(0, 5, 3), Point3D(15, 5, 3), Point3D(15, 0, 3)) pts_2 = (Point3D(15, 0, 3), Point3D(15, 15, 3), Point3D(20, 15, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 5, 3), Point3D(0, 20, 3), Point3D(5, 20, 3), Point3D(5, 5, 3)) pts_4 = (Point3D(5, 15, 3), Point3D(5, 20, 3), Point3D(20, 20, 3), Point3D(20, 15, 3)) pts_5 = (Point3D(-5, -5, 3), Point3D(-10, -5, 3), Point3D(-10, -10, 3), Point3D(-5, -10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) room2d_5 = Room2D('Office5', Face3D(pts_5), 3) int_rms = Room2D.intersect_adjacency( [room2d_1, room2d_2, room2d_3, room2d_4, room2d_5], 0.01) story = Story('OfficeFloor', int_rms) story.rotate_xy(5, Point3D(0, 0, 0)) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 5 building_mult = Building('OfficeBuilding', [story]) tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon(6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('TestGeoJSON', [building, building_big, building_mult], [tree_canopy]) location = Location('Boston', 'MA', 'USA', 42.366151, -71.019357) geojson_folder = './tests/geojson/' model.to_geojson(location, folder=geojson_folder) geo_fp = os.path.join( geojson_folder, model.identifier, '{}.geojson'.format(model.identifier)) assert os.path.isfile(geo_fp) nukedir(os.path.join(geojson_folder, model.identifier), True)
def test_from_geojson_coordinates_simple_location(): """Test the Model coordinates from_geojson method with different location inputs. """ # Test 1: The location is equal to the point (0, 0) in model space. # Construct Model pts_1 = (Point3D(50, 50, 0), Point3D(60, 50, 0), Point3D(60, 60, 0), Point3D(50, 60, 0)) pts_2 = (Point3D(60, 50, 0), Point3D(70, 50, 0), Point3D(70, 60, 0), Point3D(60, 60, 0)) room2d_1 = Room2D('Residence1', Face3D(pts_1), 3) room2d_2 = Room2D('Residence2', Face3D(pts_2), 3) story = Story('ResidenceFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 3 test_building = Building('ResidenceBuilding', [story]) # Convert to geojson. Location defines the origin of the model space. test_model = Model('TestGeoJSON_coords1', [test_building]) location = Location('Boston', 'MA', 'USA', 42.366151, -71.019357) # bottom-left geojson_folder = './tests/geojson/' test_model.to_geojson(location, folder=geojson_folder) geo_fp = os.path.join(geojson_folder, test_model.identifier, '{}.geojson'.format(test_model.identifier)) # Convert back to Model. Location defines the origin. model, loc = Model.from_geojson(geo_fp, location=location, point=Point2D(0, 0)) assert len(model.buildings) == 1 # Test geometric properties of building bldg1 = model.buildings[0] # Check story height for story in bldg1.unique_stories: assert 3.0 == pytest.approx(story.floor_to_floor_height, abs=1e-10) assert pytest.approx(bldg1.footprint_area, test_building.footprint_area, abs=1e-10) vertices = bldg1.footprint()[0].vertices test_vertices = test_building.footprint()[0].vertices for point, test_point in zip(vertices, test_vertices): assert point.is_equivalent(test_point, 1e-5) # Test 2: Change the location to equal to the point (70, 60) in model space, which is # the top-right corner of the building footprints. # Construct model with a new location that defines the top-right corner in lon/lat degrees. location2 = Location('Boston', 'MA', 'USA', 42.366690813294774, -71.01850462247945) # We define the point at the top-right corner in model units. model, loc = Model.from_geojson(geo_fp, location=location2, point=Point2D(70, 60)) assert len(model.buildings) == 1 # Test geometric properties of building bldg1 = model.buildings[0] assert test_building.footprint_area == pytest.approx(bldg1.footprint_area, abs=1e-5) vertices = bldg1.footprint()[0].vertices test_vertices = test_building.footprint()[0].vertices for point, test_point in zip(vertices, test_vertices): assert point.is_equivalent(test_point, 1e-3) # reduce precision due to conversion nukedir(os.path.join(geojson_folder, test_model.identifier), True)