FME Spatial Join One to Many

arcgis-desktoparcmapfme-formfme-transformerspatial-analyst

I am relatively new to FME and have been attempting to carry out my usual ArcMap tasks in FME instead.

One tool that I use frequently in ArcMap is Spatial Join, specifically with the One to Many join operation.

I thought that I had successfully recreated this in FME using the SpatialFilter transformer, with the following settings:

FME Spatial Filter

However, I realised after using it, that if I have multiple filters intersecting multiple candidates, it is only returning the candidate for one of them.
For example, if "A road intersects with A zone", and "B road intersects with A zone", the transformer only returns "A road in A zone", while "B road" has no merged attribute data.

I then tried using the AreaOnAreaOverlayer transformer, but this gives information for every feature and takes about 30 minutes to run, in comparison to the Spatial Filter which took about 2 minutes. I think I must not have the AreaOnAreaOverlayer set up correctly.

AreaOnAreaOverlayer

My question is which transformer I should be using in FME to recreate the SpatialJoin tool in Arcmap, specifically with the one to many join operation.

Best Answer

So the SpatialFilter isn't quite right here. Yes, it merges information, but only 1 piece, because it's only trying to determine whether a feature overlaps. It's a yes/no result really. For example, I have parks and cycle paths and want to identify which paths pass through a park:

enter image description here

This works fine. I know that 19 of 39 paths pass through a park. FME only tells me the first park it matches because at that point the test is done (yes, it's a match).

There is a better chart for deciding on the right transformer, and it's this one:

enter image description here

...from this page on the knowledgebase.

I wouldn't use an overlayer transformer because they're designed to actually cut the data where it overlaps. In this scenario I would use the SpatialRelator. It works like the SpatialFilter, but it continues and tests for a match against all features.

enter image description here

The key transformer parameter is the Generate List option. With this I get a list (a specific FME data type) that records all the parks that a cycle path passes through:

enter image description here

It even tells me the type of relationship if important.

So what you can do with that list is put it into a comma-separated value (ListConcatenator) or create a separate record for each list element (ListExploder) or do all sorts of other things (use a List* transformer or AttributeManager - for example).

Related Question