Skip to main content

(FME 2019.2.1.0, WIN64)

Hi,

I have a raster DSM of max tree heights (max elevation heights over eucalypt forest). I would like to place a point on the top of each tree (max z value). The trees are not pointed like pine trees but have rounded tops.

I have attempted to use RasterSegmenter (water shed) with limited success, by using RankCalculator with group on each water shed polygon, and then filtering with rank =1 (1 being the highest ranked pixel in each group). But this relies on the water shed being applied correctly.

I have converted the raster to a point cloud using GeometryCoercer, I can see in a 3D point cloud viewer the tree tops, but I do not know how to go about finding the max z value for each clump of points that represent a tree.

Is it possible to do something like this?

Ben

Yes, it is! I have a workspace using a LIDAR LAS pointcloud, where I (very simplified) have done the following:

 

 

1. Use a PointCloudExpressionEvaluator to round the XY coordinates to whole meters (which effectively creates "stacks" of points in a 1x1 m grid). Since you are starting with a raster data already, you might skip this step (and maybe a few of the following too).

 

 

2. Use a PointCloudSorter to sort the stacks in descending order and then extract only the highest point in each stack.

 

 

3. Use a PointCloudCoercer to transform the point cloud into individual point data instead, making it possible to store the z-value as an attribute.

 

 

4. Buffer the points with at least the amount of your raster spacing.

 

 

5. Use a SpatialRelator to create a list for each point, containing the z-value attributes of all neighbouring points (that are within the buffer).

 

 

6. Use a ListRangeExtractor to get the highest z-value from the list (the point itself and all its neighbours).

 

 

7. Use a Tester to find if the point's z-value is the highest. If so, it is a local z-max, and thus a potential treetop.

 

 

 

I am sure someone else might have a much better approach, but this might give you some ideas.

I kind of like @david_r approach on this and it is quite efficient.

https://knowledge.safe.com/questions/98242/find-position-and-value-of-highest-elevation-on-a.html


Yes, it is! I have a workspace using a LIDAR LAS pointcloud, where I (very simplified) have done the following:

 

 

1. Use a PointCloudExpressionEvaluator to round the XY coordinates to whole meters (which effectively creates "stacks" of points in a 1x1 m grid). Since you are starting with a raster data already, you might skip this step (and maybe a few of the following too).

 

 

2. Use a PointCloudSorter to sort the stacks in descending order and then extract only the highest point in each stack.

 

 

3. Use a PointCloudCoercer to transform the point cloud into individual point data instead, making it possible to store the z-value as an attribute.

 

 

4. Buffer the points with at least the amount of your raster spacing.

 

 

5. Use a SpatialRelator to create a list for each point, containing the z-value attributes of all neighbouring points (that are within the buffer).

 

 

6. Use a ListRangeExtractor to get the highest z-value from the list (the point itself and all its neighbours).

 

 

7. Use a Tester to find if the point's z-value is the highest. If so, it is a local z-max, and thus a potential treetop.

 

 

 

I am sure someone else might have a much better approach, but this might give you some ideas.

Thank You @itay and @jonas_nelson, your information was invaluable in arriving at a solution.

I also used information fromt the following post - https://knowledge.safe.com/questions/46491/hi-i-hope-you-can-help-me-i-have-lidar-and-nir-dat.html

 

Ben


Reply