VoxCity tutorial — part of the tutorial series. Before running, make sure VoxCity is installed; most data sources also require Google Earth Engine authentication.
VoxCity OBJ Export¶
Export voxel city models and simulation results to Wavefront OBJ format for use in external 3D software.
Export Types¶
Export |
Function |
Description |
|---|---|---|
Voxel City |
|
Full 3D voxel model |
Simulation Results |
|
Value-mapped colored surface |
Use Cases¶
Blender/Rhino integration - Import for rendering and further modeling
Presentation - Create high-quality visualizations
Analysis overlay - View simulation results as colored 3D surfaces
Prerequisites¶
pip install voxcity
# %pip install voxcity
from voxcity.generator import get_voxcity
from voxcity.exporter.obj import export_obj, grid_to_obj
from voxcity.simulator.solar import get_global_solar_irradiance_using_epw
from voxcity.simulator.view import get_view_index
meshsize = 5
rectangle_vertices = [
(139.760, 35.680),
(139.760, 35.690),
(139.770, 35.690),
(139.770, 35.680)
]
city = get_voxcity(
rectangle_vertices,
meshsize=meshsize,
building_source='OpenStreetMap',
land_cover_source='OpenStreetMap',
canopy_height_source='High Resolution 1m Global Canopy Height Maps',
dem_source='DeltaDTM',
output_dir='output/obj_demo'
)
# Access grids from the VoxCity object
voxcity_grid = city.voxels.classes
dem_grid = city.dem.elevation
print(voxcity_grid.shape, dem_grid.shape)
Export Voxel City¶
Export the full 3D voxel city model as an OBJ file with materials.
export_obj(city, output_dir='output/obj_demo', file_name='voxcity')
print('Exported voxcity OBJ')
Export Simulation Results as Colored OBJ¶
Export 2D analysis grids (solar, view indices) as colored 3D surfaces.
grid_to_obj() Parameters¶
Parameter |
Description |
|---|---|
|
Output directory path |
|
Output file name (without extension) |
|
Grid cell size (meshsize) |
|
Height offset for surface (default: view_point_height) |
|
Matplotlib colormap name |
|
Value range for color mapping |
|
Transparency (0-1) |
# Instantaneous solar
solar_kwargs = {
"download_nearest_epw": True,
"rectangle_vertices": rectangle_vertices,
"calc_time": "01-01 12:00:00",
"view_point_height": 1.5,
}
solar_grid = get_global_solar_irradiance_using_epw(
city, calc_type='instantaneous', **solar_kwargs
)
# Export instantaneous solar as colored OBJ
grid_to_obj(
solar_grid, dem_grid,
output_dir='output/obj_demo', file_name='solar_instantaneous',
cell_size=meshsize, offset=1.5, colormap_name='magma', num_colors=10, alpha=1.0,
vmin=0
)
# Cumulative solar for a time window
cum_kwargs = solar_kwargs.copy()
cum_kwargs["start_time"] = "01-01 05:00:00"
cum_kwargs["end_time"] = "01-31 20:00:00"
cum_solar_grid = get_global_solar_irradiance_using_epw(
city, calc_type='cumulative', **cum_kwargs
)
grid_to_obj(
cum_solar_grid, dem_grid,
output_dir='output/obj_demo', file_name='solar_cumulative',
cell_size=meshsize, offset=1.5, colormap_name='viridis', num_colors=10, alpha=1.0
)
# View indices
gvi = get_view_index(city, mode='green', obj_export=False)
grid_to_obj(
gvi, dem_grid,
output_dir='output/obj_demo', file_name='gvi',
cell_size=meshsize, offset=1.5, colormap_name='Greens', num_colors=10, alpha=1.0,
vmin=0.0, vmax=1.0
)