I'm trying to process some spatial query in FME. I have a dataset of cities with coordinate pairs and around these coordinates a buffer of 2 km. This results in multiple overlaps. I'd like to dissolve / merge overlapping buffers iteratively - the end result should be coordinate points that do not fall in other buffers.

A small sample of the dataset:

city        latitude    longitude
Eimerscheid 50.32347    6.28562
Herresbach  50.31878    6.25724
Buchholz    50.37366    6.31761
Berterath   50.34185    6.36569
Wereth      50.34612    6.23684
Merlscheid  50.35004    6.35369
Lanzerath   50.35751    6.33538
Hüllscheid  50.35154    6.35991
Holzheim    50.3506     6.29338
Afst        50.33713    6.37743
Honsfeld    50.38147    6.28045
Hünningen   50.39588    6.292
Manderfeld  50.33088    6.34126
Schönberg   50.28791    6.25646
Krewinkel   50.33139    6.38102
Weckerath   50.31921    6.3559
Medendorf   50.33362    6.28759

enter image description here

  • 1
    Well, the Dissolver transformer will do that sort of action. But I'm not sure I understand your examples. Are you saying that if a city point falls inside another city's buffer, then it should be ignored or deleted? I can't figure out how you get What I Want from What I Have! – Mark Ireland Sep 2 at 15:16
  • 1
    Your question is misleading. You say the "end result should be coordinates with buffers that do not overlap". However, in the top right corner of your image, under What you want, there are buffers which overlap. Is it that you want to keep buffers where the points do not overlap other buffers? – Fezter Sep 2 at 22:37
  • Apologies for the confusion folks. Indeed, the points should not overlap other buffers. (like in the images) The buffers can overlap. – Eduard Sep 3 at 5:13

I think I understand your question now, and I have a potential solution.

I have created a simple workspace which buffers some points by 100m and then passes the points and buffers into a PointOnAreaOverlayer. Then, I test for how many overlaps there are.

The workspace looks like this:

enter image description here

The points and buffers look like this:

enter image description here

Tester Parameters:

enter image description here

Resulting Data:

enter image description here

If I modify the buffer to 250m, the results are: enter image description here

600m buffer:

enter image description here

While this may not be the exact solution you're after, it may get you part of the way there.

| improve this answer | |

So the big issue is what "algorithm" to use. I'm doing pretty much the same as @Fezter with an overlay and checking overlaps. I take anything with an overlaps=1 and keep it as a final result. I take one feature at random with the highest number of overlaps, and drop it from the translation.


    Overlay Data
    If Overlaps = 1 then
        Send feature to output
    Calculate Max Overlaps
    If Overlaps = Max Overlaps then 
        Pick one feature
        Drop feature from translation
Until remaining features = 1

enter image description here

It works, but the limitation is that because one Max Overlaps feature is dropped at random, you can't really guarantee the optimum result. I just couldn't figure out a way to specify that in an algorithm.

Anyway, I get this from your input:

enter image description here

You can get my workspace here. However... be aware that I haven't properly made it into a loop. There are a few ways to do that, but all I did was duplicate the processing part multiple times until there was no input left.

enter image description here

It's not great, but it's just a proof of concept. It will need a bit of work to make it properly functional.

| improve this answer | |
  • 1
    Thanks Mark, I'm trying to use one of the bookmarks to create a loop but I'm facing issues. When I try to transform the bookmark into a custom transformer and loop the output I get some warning about a blocking transformer. Also, I can add only one transformer loop but I think I need two? One for the Merged output port and one for the UsedSupplier output. In short - how do I create a proper loop for this bookmark? – Eduard Sep 9 at 7:27
  • 1
    Yes, that's why I didn't have time to set up a proper loop, because with a "blocking" transformer (one that uses groups of features) it becomes way more difficult. And having to loop both FeatureMerger outputs is a definite complicating factor. I don't think it should need two loops, because it's meant to work as a single group, so it may be that you push them through the same loop, and split them out coming in to the loop. – Mark Ireland Sep 9 at 19:27
  • An alternative (and I think, simpler) method would be to set that part up as a separate workspace and put a WorkspaceRunner in the loop. Then you just call that workspace again and again until it stops returning a remaining feature. That workspace would need to have a FeatureWriter to write the results (Keep/Drop/Merged/Unused) and a FeatureReader at the start to read the next input (Merged/Unused). I'm not totally sure how to exit the loop, but it does avoid the blocking transformer dilemma. I'm pretty sure it's how a blocked loop operates in the background, but here we have more control. – Mark Ireland Sep 9 at 19:30
  • I apologize but I'm going to be offline for a few days now. Try tagging Dan, my colleague at Safe, gis.stackexchange.com/users/51745/dan-iseminger or post to the FME Community (community.safe.com) for more assistance. – Mark Ireland Sep 9 at 19:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.