Question

DonutBuilder: Two Polygons on different heights, incorrect donut – random heights assignment

  • 7 December 2017
  • 6 replies
  • 2 views

Badge

I am writing a CityGML file by reading the LOD2 3D building models from the DGN file.

While reading the DGN, grouped holes are exploded, i.e. “Expand Unnamed (Group Hole) Cells: Yes” and then DonutBuilder is used to re-build the required geometry, i.e. grouped holes.

However, rebuilding the grouped holes with the DonutBuilder for the polygons at different heights does not work properly and seems to randomly assign the Z from either the top or bottom or some from bottom and some from top.

Please see screen grabs below showing building superstructures:

The part that re-builds polygon cutouts is as follows: I used the Group By: “igds_cell_name_sequence_number” from the original DGN grouped hole cells that got expanded when read in order to rebuild them again with DonutBuilder. I tried different Z Modes but it did not help to prevent from incorrect group hole building It seems to be random, in some cases it will built a correct geometry, in other, it will do the incorrect “unexpected” geometry.

Your help much appreciated!

Many thanks,

Magda


6 replies

Userlevel 2
Badge +17

Hi, how about this procedure?

  1. Save the original z-coordinate as an attribute (ElevationExtractor)
  2. Convert the 3D polygons to 2D polygons (2DForcer).
  3. Build donut (DonutBuilder).
  4. Restore z-coordinate from the attribute (3DForcer)
Badge

Hi Takashi,

Many thanks for your response.

This procedure may work for flat roofs, i.e. all vertices have the same Z.

I will have buildings with different roof types, for example, gabled roof that will have a dormer window.

Therefore, I tried to do the following logic, thinking that order of inputs matters, i.e. bottom/lowest polygon first. That created the superstructure and main roof plane at correct heights, but did not create any hole in the lowest polygon. Probably as I added the "z" coordinate to the Group_By in the DonutBuilder and z is unique?

1. Extract z-coordinates (CoordinateExtractor)

2. Sort the z-coordinates : Numeric and Ascending in order to put polygons with lower heights first (Sorter)

3. Create a Donut using the Group_By with both "igds_cell_name_sequence_number" and "z"

Probably here, because z is unique, the hole is not created...

What I am trying to do is in the Group_By - it should recognize the order of input.

Your suggestions much appreciated!

Many thanks,

Magda

Userlevel 2
Badge +17

In similar cases, I frequently use the SurfaceDraper to restore the original z-coordinates.

Badge

Hi Takashi,

Thank you.I would much appreciate your further help.

Please see the example DGN and workspace I have at the moment. I was not sure how I could implement your solution to it or change the workspace to create the desired result.

building-examples2.dgn

example-fme.fmw

Many thanks,

Magda

Userlevel 2
Badge +17

Hi Takashi,

Thank you.I would much appreciate your further help.

Please see the example DGN and workspace I have at the moment. I was not sure how I could implement your solution to it or change the workspace to create the desired result.

building-examples2.dgn

example-fme.fmw

Many thanks,

Magda

I still think the SurfaceDraper would be helpful. See this example.

 

create-donuts-in-3d-example.fmwt (FME 2017.1.1.1)

 

Badge

Hi, how about this procedure?

  1. Save the original z-coordinate as an attribute (ElevationExtractor)
  2. Convert the 3D polygons to 2D polygons (2DForcer).
  3. Build donut (DonutBuilder).
  4. Restore z-coordinate from the attribute (3DForcer)
Hi Takashi,

 

 

3DForcer assigns one same height to all vertices. It is not the case in my data where vertices have different heights.

 

I also tried the SurfaceDraper, but it interpolates the heights and assign new, slightly different heights and I need to assign identical heights as the input data due to strict Planarity requirements.

 

 

What would really work for me, would be to find co-planar polygons, i.e. lying on the same surface within the provided tolerance, and only use these in DonutBuilder.

 

 

Do you have any suggestions to how one could find co-planar polygons in FME?

 

 

Many thanks

 

 

Reply