Assignment 2

Enriching the 3D BAG with new attributes

Deadline is 21 March 2021 at 11:59 pm

Late submission? 10% will be removed for each day that you are late.

You’re allowed for this assignment to work in a group of 3 (and thus submit only one solution for all of you). If you prefer to work alone or in pairs, it’s also fine, but we really do not recommend it.

The assignment is worth 20% of your final mark.




For this assignment you need to add new attributes to one tile of the 3D BAG, a dataset containing in LoD2.2 all the 10M+ buildings in the Netherlands.

It already contains many attributes from the Register of Buildings and Addresses (BAG), but the following are very important for many applications and we want you to calculate them:

  1. volume of each LoD2.2 geometry
  2. number of floors of the building
  3. area of the surfaces with semantics "RoofSurface"
  4. an indicator of the orientation of the "RoofSurface" surfaces for estimating the solar potential.

The updated model must be delivered in the CityJSON format.

Notice that this assignment is more exploratory, and less prescribed, than the ones so far (including GEO1015). There are therefore many different workflows/methodologies to produce the CityJSON files. We are interested in the solutions you come up with, where those solutions are based on what you have learned so far in GEO1000, GEO1002, GEO1015, and this course. Document what you’ve done in the report.

The dataset to use: tile 5910 of the 3D BAG

The 3D BAG, developed by the 3D geoinformation group at TU Delft, is an up-to-date data set containing 3D models of all the buildings in the Netherlands. The 3D BAG is open data and it contains 3D models at multiple levels of detail (LoDs), which are generated by combining two open data sets: the building data from the BAG and the height data from the AHN. The 3D BAG is updated regularly, keeping it up-to-date with the latest openly available building stock and elevation information. More details about the 3D BAG are available on its website.


Methodology/workflow to use

You have to use C++ and you have to write the code yourself. Your code does not have to be one single binary that does everything in one process, you are allowed to write 4 different programs and merge the results obtained at the end (potentially with cjio).

You can use any functions of cjio.

Here is an example how to read/modify/write a (City)JSON files with C++.

Preprocessing of the file

The 3D BAG files are in the version 1.0 of CityJSON, but we want to use the latest version 1.1, and also we want to keep only the LoD2.2 (and remove 0, 1.2, and 1.3; all those are bundled in the original CityJSON file).

All those operations can be performed with cjio with one command:

cjio 3dbag_v210908_fd2cee53_5910.json upgrade vertices_clean lod_filter 2.2 metadata_remove save

You then obtain a v1.1 file that is cleaned (duplicate vertices have been removed and metadata removed) and it only contains LoD2.2.

You can visualise that file using or QGIS (using the CityJSON Loader plugin).

Volume of each building

You have to calculate the volume of each building (specifically their LoD2.2 geometry).

You have to implement yourself the method, you are thus not allowed to use an off-the-shelf solution that you find somewhere.

Moreover, we prescribe the method that needs to be used, which is a generalisation of the method that you learned in GEO1002. You need to decompose the solid of the building into tetrahedra, and sum the (signed) volume of each.

Number of floors

The number of floors must be calculated this way: 70% of the distance between the eave and the ridge, divided by 3.0 (the typical height of ceilings is 3.0m), and rounded to the nearest integer.

Area of surfaces

The surfaces with semantics "RoofSurface" need to have their area added as an attribute to the Semantic object, as explained there.

Orientation of the surfaces

The surfaces with semantics "RoofSurface" need to have their orientation added as an attribute to the Semantic object, as explained there. There are 9 classes, all stored as a string. If the roof surface is horizontal, then "horizontal" should be put, if not then one of those 8 values:

Requirements for the CityJSON output

  1. use CityJSON version 1.1
  2. the file should follow the same structure and have all the original content of the input file (the one you cleaned with the cjio command above), eg a "Building" has all of its original attributes and the original LoD2.2 geometries are in the "children" as a "BuildingPart". The only difference allowed is that the order of the properties doesn’t need to be the same since your library might not allow you to have control over this.
  3. the surfaces must not be triangulated, they should be the original ones.
  4. only the LoD2.2 should be present, the other LoDs (0, 1.2, and 1.3) should be deleted
  5. the file you produce must be valid according to the schema (use cjval to verify this).

You have to add the attributes for each building (and their surfaces) this way:

Some tips


The report should have 6 parts:

  1. Overview of the methodology: how did you create the final file?
  2. Volume: explain the difficulties you faced and how you solved them.
  3. Number of floors: explain how you calculated it, and whether there were issues or choices you needed to make.
  4. Area of surfaces: how did you proceed?
  5. Orientation of surfaces: how did you proceed?
  6. Who did what?: explain how the tasks were divided among the members of the team. It needs to be relatively equal, and one member cannot only write the report, all have to work on at least one of the 4 attributes.

We expect a report of about 12-15 pages max (including figures).


Criterion Points
report (quality/readability/etc) 3
file valid + rules respected 1
code is clear and readme.txt 1
volume 2
no_floor 1
surface area 1
orientation/azimuth 1

What to submit and how to submit it

You must hand in one ZIP containing:

  1. your single CityJSON file entitled
  2. a report in PDF format (not in Microsoft Word please)
  3. the code (several files possible) you wrote to do the assignment. Add a README.txt that explains how to run the code.

Do not submit your assignment by email, but use this Dropbox link.

[last updated: 2022-02-28 08:51]