Skip to main content

Hi FMEers.

I'm after some some tips on how to optimise an existing workspace. The workspace is clipping a point cloud (POD format) in plan view using multiple clippers. Version 1 of the workspace worked fine, whereby multiple Clippers (over 1,000) looks at 20 or so POD files coerced into points. However, it is incredibly slow, as each of the PODs contain several million points.

I was thinking that point cloud pass much faster through the workspace before they are coerced, so a more efficient workspace would only coerce point cloud files that are required, and more importantly only Clip against point cloud files that over the area of interest, i.e. 'Clipper feature 1' only looks at point files files that are either within a point cloud extent or intersect it. Due to the size of the point clouds v the clipper boundary, clipper features will very rarely clip more than two clouds, and this scenario is only where one point cloud meets another (I am looking at a linear point cloud - a tunnel).

I've therefore re-tooled the workspace as below:

- Used BoundingBoxReplacer fetches the approximate coverage of the POD as a box

- Inserted a SpatialRelator to compare the Clipper extents (Requestor) and bounding boxes (Supplier), set to Intersects and Within

- ListExploder

When this data is inspected:

(parallel rectangular boxes are the clippers, where the clippers don't have any point cloud coverage, they are rejected via the ListExploder).

 

The table view shows that the clippers have adopted the point cloud basename. Where a clipper covers two point clouds, that clipper has been duplicated as a feature:

This is where I'm got stuck. How can I only coerce the point clouds I require? Secondly, how do I only clip the point clouds against the relevant clippers? I am thinking a test of some kind or a FeatureMerger, but need to keep the geometry (Clipper and Clippees) separate, and the latter 3D.

Thanks!

Hi,

Why not use the result of the spaital relator as initiators in the feature reader? this way you can fetch only the points that you need.


Thanks Itay, that worked, so now I only need coerce the points I need.

workspace-v2.png

The other task, is how to make the Clippers only looks for Clippees from the point cloud(s) where there are points that can be clipped. This information is in the workspace, but I can't quite figure out how to group (I guess) the Clipper boxes and the relevant Clippee point clouds.


I may have solved it. I didn't realise you could group by Clippee as well as Clipper features. Thanks.


It isn't clear if you tried this, but you should be able to send point clouds through the clipper BEFORE coercion to points -- that should be much faster than coercing before. One thing to not is that sometimes point cloud files lie about their extents, so I'd recommend using a PointCloudPropertyExtractor prior to getting the bounding box -- set the flag in that transformer to force it to update the extents.


another useful way is to set a bounding box on the point cloud data in the reader, this will actually preform a clip on the data while reading it.


@daleatsafe, thanks for that tip! I didn't know the Clipper worked on uncoerced points. I'll try the other transformer too. Thanks also @itay, however I think I need to read them all in to generate the extents, so I know which point clouds cover which Clippers, unless you mean something else.


Reply