Skip to main content

Hi,

I am working on a workspace that makes 3D Citymodels. My input is 3d polygons in a geodatabase. The output can be either 3ds or CityGML (prefer both).

I Encounter a couple of issues while making the workspace.

  1. Extrude to a value from an attribute, is not possible. My workaround for this includes the use of the Clipper transformer. But..
  2. For some unknown reason the clipper terminates (or gets stuck) at some random point.
  3. The clipper rejects some 3d objects, but some are fine (seems random?)
  4. When comparing the Extruded 3d objects to objects from the SolidBuilder, there is a diffrence in the format. I have been unable to transform from Extrusion to Solids objects or visa versa. How do i do that?

The Clipper workaround can handle my smaller dataset whitout any issue. I tried my best to format the clipper and clippee input, but, this had no effect what so ever for the real big data. It always gets stuck or terminates without a message why it did. This is also the reason why i cannot inspect the rejected features.

Changing the settings of the clipper has had no effect either. I feel like, i tried any possible combination of settings at this point.

About the issue between solids and extrusions: The output from the SolidBuilder is not accepted by the custom transformer 'SolidDissolver'. That is why i think that i need to change the solids to another type that is accepted (extrusions seem to work). The normal dissolver does not seem to work with 3d at all, but i havent experimented to the full extend yet so i cant say for sure though. The only way to that enables me to use the solid builder with my input that is if i use the other custom transform 'BRepSolidBoundaryCreator.Beta'.

The use of the solid builder combined with the BRepSolidBoundaryCreator can replace the clipper entirely for this part. but i am afriad that later on i still need to implement some clippers to create a valid topology between layers. This is the reason why i like to keep both options open and tackle both their issues.

I have been googling like a mad man for the past two days and can say for sure that i've read (almost any) post that relates to my issue. Non of those really solved my issue.

My input data consicts of 3d polyogons: (some are flat and some are complex)

  1. The flat 3d polygons can be easily extruded with the extrude transformer. i calculate the delta between the Z of the flat 3d polygon and the value in the attribute and simply extrude it negatively.
  2. The Complex Polygons however are a little harder. My clipper workaround works like this:
    • i create the create that the 3d polygon needs to be extruded towards to (flatten to attribute)
    • I extrude the groundplane negatively with a distance of the delta between Z-min and Zmax (this is my clipper)
    • I extrude the 3d complex polygons based on the delta between groundplane and Z-max (negatively). The complex shape of the original polygon is also the shape of the bottom of the object, this is not what i want, therefore it has to be clipped by the clipper
    • I clip groundplane and extruded complex polygons, the outside-port of the clipper is the output i need.

This works, but for some reason, as i mentioned earlier, the clipper gets stuck when handling my big dataset and i dont know why.

(see picture)

The other method is using the solidbuilder. the output from the SolidBuilder is not accapted by the SolidDissolver. why? And how to work around this?

 

(see picture)

My input looks like this:

From what i can tell is that there is a lot of people in the same possition as where i am now. 3D tranformations are lacking, slow and prone to bugs. I recommend safe software to improve on this. But until then, is there anyone that has a good idea that i can try?

Nick Janse

Please let me know if there is any ideas out there that i might be able to try!


Hi @nick-j,

Good problems you're trying to solve. I feel your pain. I really like the Clipping approach you have there. Extrude up from Ground plate and down from Roof, then use Clipper.

 

Sorry to hear your getting issues in the clipper. Are you grouping by a building ID? Maybe that will help. Also try and use a GeometryValidator to see if there are any issues with the geometry.

 

 

The SolidDissolver, has a bug in it. You can open it up (Right click > edit) and connect up the 'Untouched' port to the Aggregator.

 

 

At the end of the bay the SolidDissolver simply performs another Clip using the 3D bounding box of the input solids.

 

 

Do you have wall surfaces? Or is this your problem? only Roofs and the ground plate?

 

 

I would definitely stick with trying the Clipper approach and try and figure out why some are getting rejected/causing a crash. If you do find a crash you should report it to tech support.

 

When it comes time to writing out CityGML you can use this template as a guide on how to se up the write and which attributes you need to create: https://hub.safe.com/publishers/con-terra/templates/citygml-create-building-lod-2-using-xlinks

 

 

 

Good luck! and do let us know how you get on

I have done similar things with extruding roofs downward and building footprints upwards, and then using a Clipper to get the union as a 3D solid. And, like you @nick-j, I've encountered problems.

 

 

In my case it is almost always some small geometrical error in the data, such as polygons that are not closed properly, polygons containing double vertices or small dangles, or in some cases roof polygons that do not fit exactly to each other but leaves a small hole (it works much better with a small overlap).

 

 

So my main suggestion is that you clean your input data as much as possible; close polygons, remove dangles and double points, etc. When you encounter a problem (FME terminates), try reducing the area you are working with, repeat until you find the building that contains the error.

 

 

 

And - like you - I was also sad to learn that the Extruder can only extrude with a value, not to a z-value, making it much more difficult to model the buildings. (I even posted a suggestion to include this possiblility in the Extruder. Not many votes yet, though.)

The solid dissolver is really clever inside, thanks to whoever made it! I like how it use "negative space bounding box" and then you chip away pieces and greate positive space.

 

This is my checklist:

 

I use the solid dissolver for large datasets but it is not uncommon with errors and it has limitations. The clipper does not accept more than 300 (or maybe it was 200) objects so you need to limit the groups to that using a building ID for example like virtualcitymatt said. In case of buildings with more than 300 parts you need to separate in to smaller groups.

The more coordinate Points a polygon has the more likely it it to case the dissolve to fail so avoid complicated roof areas. Break them up into smaller pieces using the chopper, but dont create to many to cross the 300 boundary and also slivers risk breaking the dissolve or cause som unwanted geometries. so dont just chopper everything into triangles (takes longer time to dissolve too). Concider using a generaliser on areas with a to of Close verticies (like smooth circles).

It is important that your extrusions are not inside- out so check that first. Orient the areas according to the extrusion direction.

I split up large datasets into smaller regions and run them in separate workspases using the workspace runner with several running at the same time. Then if one fails I break it up in smaller areas and re-run those and so on. Using several workspaces in the workspace runner enables you to run over most of the data even if one part fails.

 

Using your Buildings groups you can modify the solid disolver to lift up its bounding box to the height you want the building bottom to have. then you will get flat bottoms.

 

Even if you do all of the above some buildings will not be perfect solids afterwards, maybe due to round of errors and small errors in your data. If you need perfect for say, 3d-printing fme might only get you halfway in this respect. Use Magics (powerfull boolean but very poor importing) or Grasshopper to get "voxelization" boolean dissolves - mathematically imperfect but atleast the result is printable.

 

Edit: Oh and you really want to run the geometries through geometry validator and filter out errors. Double down on the failed ones with the chopper and filter out micro areas.


Thank you everyone for these great idea's!

I have been using object-id's. this is fundamental for my workspace, otherwise it could not have worked at all.

So far i have made a few adjustments to the formula's, they are pretty good now (they seemed to have issues in some special cases). I also made sure to validate my input. Rounding some coordinates and my groundplane value to 3 decimals (milimeters).

I was pretty confident that my clipper method would work. im sad to say that it still fails almost at the end.

I am going to split my input data into 4 area's to see if i can isolate the issue. before i tried 2 area's but both of them failed at the time, will try them too.

The information about the solid dissolver is very helpfull, i have got to try the things out yet since im focusing on the clipper part first.

The clipper is no longer rejecting hundreds of features (just 1 now).

I will keep everyone informed.

Again, thank you so much!

Nick Janse


I managed to solve it with some insane validation block. The clipper now runs without issue! My validation process looks insane but its actually having some logic behind it. I know you can validate multiple things at once but that wont work for this issue. there are several stages than needs to happen in this order. below is the invert of the validation, this extracts the stuff that needs manual adjuistments and can't be repaired by fme (in a simple matter).

 

My input validation that runs somewhere at the start looks like this:

 

 

There really were some issues with the input data. I think i now have a bullet proof validation (i hope haha).

 

Next up will be challanging the solid dissolver. If anyone have more tips let me know!

 

Thanks again!

 

Nick Janse

 


I managed to solve it with some insane validation block. The clipper now runs without issue! My validation process looks insane but its actually having some logic behind it. I know you can validate multiple things at once but that wont work for this issue. there are several stages than needs to happen in this order. below is the invert of the validation, this extracts the stuff that needs manual adjuistments and can't be repaired by fme (in a simple matter).

 

My input validation that runs somewhere at the start looks like this:

 

 

There really were some issues with the input data. I think i now have a bullet proof validation (i hope haha).

 

Next up will be challanging the solid dissolver. If anyone have more tips let me know!

 

Thanks again!

 

Nick Janse

 

Awesome, Great validation block!

 

 

I'b be interested to hear the reasoning behind the order of validation steps you took

On top of that! i went back to an old version of the solid dissolver, this works fine with the smaller dataset. I wonder if i will have the same issue where it wont work at lager areas (>300 objects). anyway if anyone has this just go back to the old soliddissolver. :)


I managed to solve it with some insane validation block. The clipper now runs without issue! My validation process looks insane but its actually having some logic behind it. I know you can validate multiple things at once but that wont work for this issue. there are several stages than needs to happen in this order. below is the invert of the validation, this extracts the stuff that needs manual adjuistments and can't be repaired by fme (in a simple matter).

 

My input validation that runs somewhere at the start looks like this:

 

 

There really were some issues with the input data. I think i now have a bullet proof validation (i hope haha).

 

Next up will be challanging the solid dissolver. If anyone have more tips let me know!

 

Thanks again!

 

Nick Janse

 

Looking good! It would be interesting to know which validations you do, and in which order.


Reply