A workflow for pulling building footprints with heights and turning into a 3D massing model in Rhino.
A step-by-step workflow for pulling building footprints with heights from the EUBUCCO database, trimming them to a study area in QGIS, and extruding them into a 3D massing model in Rhino via Grasshopper + Heron.
The method works for any European location covered by EUBUCCO.
This workflow produces a context massing model. EUBUCCO heights for many regions are machine-estimated rather than surveyed, so treat the heights as approximate, not survey-grade.
The pipeline has two halves:
The single most important thing to keep consistent throughout is the coordinate reference system (CRS / EPSG code). Get that right and everything lines up; get it wrong and your model ends up tiny, distorted, or on the other side of the planet.
Decide on one metric CRS for your region and use it everywhere. For France that is EPSG:2154 (RGF93 / Lambert-93). EUBUCCO ships its geometry in EPSG:3035 (ETRS89-LAEA).
GeoPackage (.gpkg) is the format to grab because it carries the height attribute you will extrude by later. The files can be large.
The Site Extent Tool is a small plugin that draws a square or circle of a chosen size, centered on a point you click. It is how you will define your study area.
site_extent_tool.zip and click Install Plugin.The plugin installs into your own QGIS user profile — no admin rights needed.
.gpkg file straight onto the map canvas. (Or: Layer → Add Layer → Add Vector Layer, browse to the file, Add.)The footprints cover the whole NUTS2 region, so it will look like one big blob until you zoom in.
This step must happen before you draw your study area, because the Site Extent Tool measures size in the project's units.
1000 gives a 1 km square (500 m in each direction) or a 1 km-diameter circle.site_square_1000m — centred on your click.The shape is centered exactly where you click, so click as close to your target center as you can. Zoom in first for precision.
Now clip the region-wide buildings down to just your study area.
site_square_1000m (or circle) layer.Clip cuts buildings that straddle the boundary, leaving partial footprints at the edges. If you would rather keep whole buildings intact, use Vector → Research Tools → Select by Location (select features that intersect your shape), then export the selection instead. For a context model, keeping whole intersecting buildings usually looks cleaner than chopped edges.
Before exporting, confirm the heights are there.
height field (values in metres) and the source / provenance field.height to see how many buildings have values versus empty / nan.Rhino and Heron read Shapefiles cleanly, so export the clipped layer as .shp.
buildings_site.shpShapefiles truncate attribute field names to 10 characters, so check that height still reads as height (it does) and note the names of any longer fields you care about. If 10-character truncation is a problem, export as GeoJSON instead — Heron reads that too.
A Shapefile is actually several files sharing a name (.shp, .shx, .dbf, .prj, …). Keep them together in the same folder, and make sure the .prj file is present — that is what carries the CRS into Rhino/Heron.
Heron is the Grasshopper plugin that reads GIS data (Shapefiles, GeoJSON) and handles reprojection.
PackageManager command (type it into the command line).Your data is in meters, so Rhino must be too.
Open Grasshopper (Grasshopper command) and build the following definition.

The definition does this, left to right:
buildings_site.shp.featureGeometry — the footprintsfields — the list of attribute namesvalues — the attribute values, as a tree (one branch per building)values, index 6 → pulls the height value for each building. (Index 6 matches the EUBUCCO field order: fid, id, region_id, city_id, type, subtype, height, …)nan entries with a fallback (e.g. an Expression if(x > 0, x, 6)) so every building has a usable number.In Import Vector, uncheck "Clip with boundary" (right-click the component) — otherwise it outputs only the bounding rectangle and no buildings. You already trimmed in QGIS, so no second clip is needed.
If featureGeometry gives you meshes rather than closed curves, convert each footprint to its boundary curve before extruding (mesh → naked edges → join), or extrude and then Cap Holes. Verify the result with a Volume component: every building that returns a volume is a watertight solid.
Move → from a known reference point to 0,0,0.Do the move-to-origin consistently — use the same reference point — for every layer you bring in (buildings, terrain, orthophoto). That keeps everything registered together.
The whole pipeline only works if the CRS is consistent. Tick these off:
| Stage | What to check | Should be |
|---|---|---|
| EUBUCCO file | Native storage CRS | EPSG:3035 (handled by QGIS automatically) |
| QGIS project | Project CRS (bottom-right) | EPSG:2154 |
| Site Extent Tool | Inherits project CRS | EPSG:2154 |
| Shapefile export | Export CRS + .prj present |
EPSG:2154 |
| Heron Set SRS | Matches export | EPSG:2154 |
| Rhino | Model units | Meters |
If your buildings import into Rhino as a tiny cluster near the origin, or appear in the wrong place, the cause is almost always a CRS mismatch — usually Heron defaulting to WGS84 (degrees) instead of your projected CRS. Recheck the Set SRS component.
Substitute your own region's codes if you are not in France: find your NUTS2 region on the EUBUCCO files page, and your local metric CRS (a UTM zone or national grid) in place of EPSG:2154.
You now have a 3D massing model of your site, ready for environmental and design analysis.
Last updated: 10-06-2026 at 21:40