Gaten dichten in de 3D-Basisvoorziening

De 3D-basisvoorziening van het Kadaster omvat zowel 3D-gebouwen als het omliggende terrein. Kadaster en TU Delft, de dataleveranciers, hebben veel werk verricht om de gaten in het terrein te dichten. Desondanks is het niet volledig gelukt.

Frustratie onder spelers

Regelmatig ontbreken er stukken grond onder gebouwen. Dit valt niet op bij de meeste visualisaties, maar in ons Klimaatspel worden gebouwen vaak gesloopt om plaats te maken voor andere constructies. Stel bijvoorbeeld dat je een kantoor sloopt om er woningen te bouwen. Wanneer er echter een gat onder het kantoor blijkt te zitten, kan je er niet bouwen. Dit is frustrerend, want bouwruimte is schaars.

Een voorbeeld uit Fellenoord, Breda: hier wordt de voormalige rechtbank regelmatig gesloopt om ruimte voor woningen te creëren.

De voormalige rechtbank in Breda: vaak gesloopt om ruimte voor woningen te maken.

Helaas is dit niet mogelijk, aangezien er een groot gat onder het gebouw zit.

Gaten onder de voormalige rechtbank en andere gebouwen in Fellenoord, Breda.

Gaten vullen

In de nieuwste versie van het Klimaatspel vullen we de gaten onder de gebouwen voordat we de data in het spel laden. Dit proces verloopt in een aantal stappen:

Stap 1: Zoek de gebouwen zonder ondergrond

We beginnen met het identificeren van gebouwen zonder ondergrond. In deze dataset hebben alle grondstukken onder gebouwen het BAG-ID van het bijbehorende gebouw gekregen, waardoor we gemakkelijk alle gebouwen zonder bijhorende grond kunnen opsporen.

Stap 2: Vind de omliggende stukken grond.

Vervolgens zoeken we naar de grondstukken rondom het gat. Hiervoor gebruiken we de bounding box1 van het gebouw en breiden deze enkele meters uit in elke richting.

Bounding box (rood) en de uitgebreide bounding box (groen) van een kantoorgebouw in Fellenoord.

Nu selecteren we alle grondstukken die de uitgebreide bounding box raken. Door de bounding boxes te gebruiken, kunnen we een snelle en simpele algoritme gebruiken, ook al kan dit tot een licht overschot aan geselecteerde grondstukken leiden. Voor de volgende stappen van ons algoritme maakt dit echter niet uit.

We selecteren alle gronden (blauw) met een bounding-box overlap met de groene box.

Stap 3: Bepaal de omtrek en de gaten

Nu identificeren we de omtrek van de omliggende grondstukken. Hiervoor gebruiken we hetzelfde algoritme als bij het versimpelen van meshes in de vorige post:

  • We doorlopen alle driehoeken in de meshes van de geselecteerde grondstukken en verzamelen alle randen.
  • Dubbele randen worden verwijderd.
  • We maken gesloten contouren van de resterende randen.

Om de omtrek en de gaten van elkaar te scheiden, berekenen we de oppervlakte van elke contour met de schoenveterformule (shoelace formula2). De omtrek heeft een negatieve oppervlakte, terwijl de gaten een positieve oppervlakte hebben.

Stap 4: Selecteer de juiste gaten

Omdat we mogelijk teveel omliggende grondstukken hebben geselecteerd, kunnen er ook te veel gaten zijn, waaronder gaten die niet direct onder het gebouw liggen. Daarom selecteren we alleen de gaten die de bounding box van het gebouw raken.

We selecteren alleen de gaten die de bounding box van het gebouw raken.

Stap 5: Opvullen van de geselecteerde gaten

In de laatste stap genereren we de vulling voor de geselecteerde gaten. We maken een nieuwe mesh door de omtrek van elk gat te trianguleren met het Earcut-algoritme3. Dit nieuwe grondstuk krijgt het BAG-ID van het bovenliggende gebouw en wordt aan de dataset toegevoegd.

Opgevulde gaten onder een kantoorgebouw in Breda

Resultaat

Alle gaten onder gebouwen worden nu opgevuld, waardoor spelers overal kunnen bouwen.

Fellenoord zonder gaten onder gebouwen.

Opmerkingen

Alle bovengenoemde algoritmen werken in 2D en gebruiken alleen de X- en Y-coördinaten van elk object. Daarom is het cruciaal dat de dataset geen overlappende of overhangende stukken bevat, wat meestal het geval is. Bij bruggen hebben we echter enkele overlappende objecten aangetroffen. In dergelijke gevallen werkt het algoritme niet optimaal en blijft het gat open.

  1. https://en.wikipedia.org/wiki/Minimum_bounding_rectangle ↩︎
  2. https://en.wikipedia.org/wiki/Shoelace_formula ↩︎
  3. https://github.com/mapbox/earcut ↩︎