Solved

Finding Parent Child connection between nodes within a network tree


Hi all!

I am new to FME. I am trying to find parent child connections within a network tree.

For example, there are nodes or objects called "CP". All CP's are connected to "TX"s.

I would like to find which CP is connected to which TX. Multiple CP's can be connected to a TX. I would like to export a table like the following:

CP TX

1 1

2 1

3 1

4 2

4 2

Which suggests 3 CPs are connected to TX 1 and which ones. There is a whole network of lines connecting them. So I have to somehow trace those lines until a CP connects to a TX. Sometimes CP's are connected to TX's via multiple line segments

I am looking at SpatialFilter, PointOnLineOverlayer or ShortestPathFinder. As I mentioned, I am quite new to FME and having a difficult time getting started. Any help would be greatly appreciated.

icon

Best answer by david_r 6 December 2016, 16:51

View original

15 replies

Userlevel 4

You can probably use the FeatureMerger for this, if you already have the attributes linking the CP / TX datasets. Set the CP as the Requestor and the TX as the Supplier.

Badge +16

In case a spatial relation needs to take place a LineOnLineOverlayer or TopologyBuilder with a list generated will provide you with all the accumulated attributes.

You can probably use the FeatureMerger for this, if you already have the attributes linking the CP / TX datasets. Set the CP as the Requestor and the TX as the Supplier.

Hi david_r

 

There are no attributes linking CP and TX. They are two different sets of feature types. I am not sure how FeatureMerger could be used without adding the lines (secondary conductors) into the transformer somehow.
Userlevel 4
Hi david_r

 

There are no attributes linking CP and TX. They are two different sets of feature types. I am not sure how FeatureMerger could be used without adding the lines (secondary conductors) into the transformer somehow.
So it's a purely spatial relationship between the TX and CP datasets? Could you perhaps post a screenshot that shows a representative part of your data, that would help a lot.

 

Otherwise I agree with Itay about looking at the TopologyBuilder as well.
Badge +16

Hi @fariyafarhad, welcome to the world of FME!

If all of the features you are dealing with are lines, I would suggest using the LineOnAreaOverlayer and specifing a list name.

This will split any intersecting lines and save the attribute information in a list then ist a matter of using the list elements ( and list transformers) to gather the information you need.

Optionally you could use the TopologyBuilder

Which will also intersect your lines and save the information in a list.

Hope this helps.

 

So it's a purely spatial relationship between the TX and CP datasets? Could you perhaps post a screenshot that shows a representative part of your data, that would help a lot.

 

Otherwise I agree with Itay about looking at the TopologyBuilder as well.
I added a picture to the original post (should have done it a while ago :/). So you can see the connectivity between Transformers (TX) and Customer Points (CPs). I need to basically generate a list at the end that shows connectivity for customer points to transformers. The CPs and TXs have no attribute in common. We are going purely based on spatial relationships and line connections in between. I am looking into using the TopologyBuilder right now and see if I can manage to get the expected result.

 

 

Userlevel 4

You could try something like the following (if your data isn't 100% clean I suggest using a Snapper first):

  1. TopologyBuilder
  2. NetworkTopologyCalculator
  3. Aggregator, group by "_network_id"
  4. PointOnLineOverlayer using the TransformerID to find the transformer id on each network
  5. PointOnLineOverlayer using the CustomerPoints to find the transformer id for each customer point

Userlevel 4
Badge +25

I agree that use either an "overlayer" transformer or try out the NeighborFinder. As long as the TX features don't connect to each other, the NeighborFinder should be fine.

I agree that use either an "overlayer" transformer or try out the NeighborFinder. As long as the TX features don't connect to each other, the NeighborFinder should be fine.

Hi @Mark2AtSafe,

 

I tried the NeighborFinder but it works based on distance between base and candidates. That doesn't work for me as I have to follow the network path regardless of distance. Using nearest neighbout causes a CP to find a TX that it may not be connected to (see picture attached). Thanks for your suggestion though! I am trying to make overlayers work ...

 

 

wrong.jpg

You could try something like the following (if your data isn't 100% clean I suggest using a Snapper first):

  1. TopologyBuilder
  2. NetworkTopologyCalculator
  3. Aggregator, group by "_network_id"
  4. PointOnLineOverlayer using the TransformerID to find the transformer id on each network
  5. PointOnLineOverlayer using the CustomerPoints to find the transformer id for each customer point

Hi @David_r. Thank you so much for your response. I have been following this and changing some things around. I have also been doing FME tutorials that's why its taking me so long to get back. For this one, I got stuck towards the end. Can you please help me? First off, I did not end up using PointOnLineOverlayer as I am not a 100% sure how to work that. It was not giving me the desired results. Instead, I used SpatialFilter to check for "intersects" and "touches" between TX and the network and CP and the network. Now all Passed CPs and TXs from two SpatialFilters have NetworkID added as an attribute. I can't figure out a way to generate a list and match the CPs and TXs that have the same ID. How do I match them based on Network ID and how would I go about exporting a list (in csv possibly). I added a screenshot of my current workbench. Please feel free to ask any questions. Thanks

 

workbench.jpg

 

You could try something like the following (if your data isn't 100% clean I suggest using a Snapper first):

  1. TopologyBuilder
  2. NetworkTopologyCalculator
  3. Aggregator, group by "_network_id"
  4. PointOnLineOverlayer using the TransformerID to find the transformer id on each network
  5. PointOnLineOverlayer using the CustomerPoints to find the transformer id for each customer point

I used FeatureMerger to merge attributes for CP's with TX's ID's. I think I am quite close to a solution. Do you have any other suggestions? Thanks

 

 

Badge +2
Hi @David_r. Thank you so much for your response. I have been following this and changing some things around. I have also been doing FME tutorials that's why its taking me so long to get back. For this one, I got stuck towards the end. Can you please help me? First off, I did not end up using PointOnLineOverlayer as I am not a 100% sure how to work that. It was not giving me the desired results. Instead, I used SpatialFilter to check for "intersects" and "touches" between TX and the network and CP and the network. Now all Passed CPs and TXs from two SpatialFilters have NetworkID added as an attribute. I can't figure out a way to generate a list and match the CPs and TXs that have the same ID. How do I match them based on Network ID and how would I go about exporting a list (in csv possibly). I added a screenshot of my current workbench. Please feel free to ask any questions. Thanks

 

workbench.jpg

 

if you use the SpatialRelator instead of SpatialFilter then you can make a list of all your customer points. This would avoid the extra step of FeatureMerger. I've attached an image that illustrates how that might look.

 

 

Hi @fariyafarhad, welcome to the world of FME!

If all of the features you are dealing with are lines, I would suggest using the LineOnAreaOverlayer and specifing a list name.

This will split any intersecting lines and save the attribute information in a list then ist a matter of using the list elements ( and list transformers) to gather the information you need.

Optionally you could use the TopologyBuilder

Which will also intersect your lines and save the information in a list.

Hope this helps.

 

Hi @itay,

 

Thanks for your suggestion. I wasn't able to make the LineOnAreaOverlayer work but I took your suggestion and Parameters for the TopologyBuilder. Thanks!

 

 

if you use the SpatialRelator instead of SpatialFilter then you can make a list of all your customer points. This would avoid the extra step of FeatureMerger. I've attached an image that illustrates how that might look.

 

 

Hi @MarkAtSafe, Thanks for your suggestion. Although that doesn't work for me. The Requestor is in this case would have to be CX for the first and TX for the second SpatialRelator (or vise versa). The output needs to be relation of CX with TX not the list of network lines and their relationship to the two types of nodes. I can't feed the output from one SpatialRelator to the other.

 

Badge +2
Hi @MarkAtSafe, Thanks for your suggestion. Although that doesn't work for me. The Requestor is in this case would have to be CX for the first and TX for the second SpatialRelator (or vise versa). The output needs to be relation of CX with TX not the list of network lines and their relationship to the two types of nodes. I can't feed the output from one SpatialRelator to the other.

 

This will give you that relationship. The first SpatialRelator relates the xfrmr to the network. The second SpatialRelator matches the customer points to the network. So now each distribution network has the source xfrmr and the related customer points. You just throw away the network after the last SpatialRelator. If you need to preserve the xfrmr geometry then you can use a GeometryExtractor & GeometryReplacer. I've attached a test workspace conductor-network-2016.fmw

 

 

Reply