Skip to main content
Solved

Connecting multiple points by shortest lines possible ?


lifalin2016
Influencer
Forum|alt.badge.img+41

I have a large number of points, which I would like to join by simple lines (point-to-point), minimizing the overall summed length of the generated lines. There's no preferred path, but all points must be connected to each other by a single network of lines.

My output just needs to be a set of simple lines.

Do anyone have an idea on how to accomplish that, other than grinding it out in a PythonCaller ?

Cheers

Lars I

Best answer by jkr_wrk

What is a large number of points? 10? 1000? 1.000.000? I think I got it to work with 100 points in 4 iterations, 8 iterations with a 1000. My loop-fu is a bit under developed.

100

1000

Because i realy like the effect this question makes on a random dataset i made the custom transformer that does what you want.

 

Give this transformer a set of points and the output will be a single network with many lines. See my PointConnectorShortestDistance Custom Transformer.

 

View original
This post is closed to further activity.
It may be an old question, an answered question, an implemented idea, or a notification-only post.
Please check post dates before relying on any information in a question or answer.
For follow-up or related questions, please post a new question or idea.
If there is a genuine update to be made, please contact us and request that the post is reopened.

14 replies

david_r
Celebrity
  • September 11, 2020

Sounds much like the travelling salesman problem, there may be some hints here:

https://www.safe.com/blog/2016/11/fmeevangelist158/


lifalin2016
Influencer
Forum|alt.badge.img+41
  • Author
  • Influencer
  • September 11, 2020

Sounds much like the travelling salesman problem, there may be some hints here:

https://www.safe.com/blog/2016/11/fmeevangelist158/

It's NOT a travelling salesman problem, as the points just need to be connected, not visited in any sort of order. A single point may even connect to multiple other points, if they are closest together.


lifalin2016
Influencer
Forum|alt.badge.img+41
  • Author
  • Influencer
  • September 11, 2020

Here's a simplistic sketch to illustrate my problem:

2020-09-11 11_35_09-Window


caracadrian
Contributor
Forum|alt.badge.img+23

Here's a simplistic sketch to illustrate my problem:

2020-09-11 11_35_09-Window

Just use a neighbour finder than draw a line from the candidate coordinates to the base coordinates


anhphuongt
Forum|alt.badge.img

There is a LineBuilder for that. You just need to input the points and FME will create a Line in the order they enter.

https://www.safe.com/transformers/line-builder/


lifalin2016
Influencer
Forum|alt.badge.img+41
  • Author
  • Influencer
  • September 15, 2020

There is a LineBuilder for that. You just need to input the points and FME will create a Line in the order they enter.

https://www.safe.com/transformers/line-builder/

No, LineBuilder will just connect all input points as they are entered/sorted into a single polyline. I do not know the order in advance, and a single point may be connected to 3+ other points, as per my illustration above.


lifalin2016
Influencer
Forum|alt.badge.img+41
  • Author
  • Influencer
  • September 15, 2020

Just use a neighbour finder than draw a line from the candidate coordinates to the base coordinates

Unfortunately that only solves part of my problem. I need all points to be connected, even those that are not immidiate neighbours. I end up with something like this, that's far from my intent (as per my drawing above):

2020-09-15 08_11_15-Start


nielsgerrits
VIP
Forum|alt.badge.img+67

What is a large number of points? 10? 1000? 1.000.000? I think I got it to work with 100 points in 4 iterations, 8 iterations with a 1000. My loop-fu is a bit under developed.

100

1000


lifalin2016
Influencer
Forum|alt.badge.img+41
  • Author
  • Influencer
  • September 15, 2020

What is a large number of points? 10? 1000? 1.000.000? I think I got it to work with 100 points in 4 iterations, 8 iterations with a 1000. My loop-fu is a bit under developed.

100

1000

Iterations of doing what? The amount is tens of thousands, maybe more.


nielsgerrits
VIP
Forum|alt.badge.img+67

What is a large number of points? 10? 1000? 1.000.000? I think I got it to work with 100 points in 4 iterations, 8 iterations with a 1000. My loop-fu is a bit under developed.

100

1000

What I did:

  • Find unique shortest lines between points (Neighborfinder Candidates Only).
  • Find clusters (lines already connecting)
  • Find shortest unique lines between clusters and add these to previous results.
  • Iterate through this until only one cluster remains.

Using a sample set of 100.000 points it took 35 minutes and 9 iterations.

In an earlier version I had some "donuts", this is now fixed. I know the iteration stopper does not work, but I'm done for today.

100000


jkr_wrk
Influencer
Forum|alt.badge.img+37
  • September 16, 2020

What I did:

  • Find unique shortest lines between points (Neighborfinder Candidates Only).
  • Find clusters (lines already connecting)
  • Find shortest unique lines between clusters and add these to previous results.
  • Iterate through this until only one cluster remains.

Using a sample set of 100.000 points it took 35 minutes and 9 iterations.

In an earlier version I had some "donuts", this is now fixed. I know the iteration stopper does not work, but I'm done for today.

100000

You could write the result down to a file and run this like a workspaceRunner (over and over). And stop the workspacerunner when there is one giant networkTopology.


jkr_wrk
Influencer
Forum|alt.badge.img+37
  • Best Answer
  • September 21, 2020

What is a large number of points? 10? 1000? 1.000.000? I think I got it to work with 100 points in 4 iterations, 8 iterations with a 1000. My loop-fu is a bit under developed.

100

1000

Because i realy like the effect this question makes on a random dataset i made the custom transformer that does what you want.

 

Give this transformer a set of points and the output will be a single network with many lines. See my PointConnectorShortestDistance Custom Transformer.

 


lifalin2016
Influencer
Forum|alt.badge.img+41
  • Author
  • Influencer
  • September 22, 2020

Because i realy like the effect this question makes on a random dataset i made the custom transformer that does what you want.

 

Give this transformer a set of points and the output will be a single network with many lines. See my PointConnectorShortestDistance Custom Transformer.

 

This is brilliant. I didn't expect it to be solveable using only standard transformers, and in a simple package like this, but I stand corrected.

Thank you for providing your solution.

Yes, sometimes the output of a process resembles pure art.


polomayo
Forum|alt.badge.img

Because i realy like the effect this question makes on a random dataset i made the custom transformer that does what you want.

 

Give this transformer a set of points and the output will be a single network with many lines. See my PointConnectorShortestDistance Custom Transformer.

 

This is brilliant. I didn't expect it to be solveable using only standard transformers, and in a simple package like this, but I stand corrected.

Thank you for providing your solution.

Yes, sometimes the output of a process resembles pure art.

Hello I hope this finds you all well! How do I use this custom transformer?