Skip to main content
Question

Find the closest point and then draw a line


Hi

 

 

This is probably a simple one...

 

I have two input files (shapefiles) each containing a set of nodes. For file 1, I would like to find the closest point in file 2 and then draw a polyline between the two. I have been playing around with coordinate extractor to retrieve the x,y coordinates of each file and then neighbourfinder to find the closest node. But that is just copying over the attributes of the closest point.

 

 

Any help is greatly appreciated.

 

 

Kind Regards

 

Zoe

13 replies

david_r
Evangelist
  • November 6, 2014
Hi,

 

 

the NeighborFinder adds the following attributes that might be of interest to you: _closest_candidate_x and _closest_candidate_y. You can use those in a VertexCreator to create a line from the BASE point feature.

 

 

See also: http://docs.safe.com/fme/html/FME_Transformers/Default.htm#Transformers/neighborfinder.htm

 

 

David

  • Author
  • November 6, 2014

 

 

Hi guys

 

 

I have attached a picture above. Basically the PGPS_nodes is file 1 that I want to find the cloest node in file 2 for each.

 

I have used coordinate extractor then neighbour finder and then a vertex creator based on the _closest_candidate_x and _closest_candidate_y but I dont know how to create the line from here.

david_r
Evangelist
  • November 6, 2014
Hi,

 

 

based on your screenshot it seems like you haven't got any matches. Just make sure that you've entered a large enough "Maximum distance" in the Neighborfinder (NB: it's in ground units of your coordinate system). For the VertexCreator, make sure that it's set to "Add vertex".

 

 

 

 

David

  • Author
  • November 6, 2014
Hi David

 

 

I have zipped my files and attached them. i only have the option to "add point" in the vertex creator. Apologies if I am missing something obvious.

 

 

Zoehttps://arup.sharefile.com/d/sc89d19385f645e58

 

 

david_r
Evangelist
  • November 6, 2014
Hi Zoe,

 

 

there doesn't seem to be anything wrong with your workspace. However, your dataset PGPS_final_v2 contains polylines, not points. That might explain your unexpected result.

 

 

David

  • Author
  • November 6, 2014
Hi David

 

 

I am trying to create a polyline between that connects to the closest point it found.

david_r
Evangelist
  • November 6, 2014
Hi,

 

 

not quite sure I understand what you're trying to accomplish. Are you perhaps trying to fix faulty topology connections? If so, consider using the AnchoredSnapper.

 

 

David

  • Author
  • November 6, 2014
Hi

 

 

So I have a set of points "nodes" and I want to draw a line between each of those points and the closest corresponding point in the "final_v2" file (based on distance).

gio
Contributor
Forum|alt.badge.img+15
  • Contributor
  • November 6, 2014
Use a unconditional featuremerger to merge all PGPS nodes to all PGPS_final nodes.

 

 

Make sure coordinates from extractor  have not the same name: Like From_x, From_Y  and the other To_X,To_Y.

 

At merged output use a vertexcreator (create) on From and then a vertexcreator (add) on To.

 

 

Create ID on lines using a counter.

 

Claculate lentgh.

 

Create a list grouped by ID.

 

Listsort on length, ascending.

 

Listindex{0} to choose 1st in list wich is shortest.

gio
Contributor
Forum|alt.badge.img+15
  • Contributor
  • November 6, 2014
..with the ID you can pick the shortest geometric lines using a featuremerger

gio
Contributor
Forum|alt.badge.img+15
  • Contributor
  • November 6, 2014
btw, you can ofcourse refrain from using vertexcreators and do basic math for distance calculaten

 

 

distance = SQRT((POW(To_x - From_x)+POW(To_Y -From_Y))

 

and list by ID sort and pick first.

 

 

And create the line after the points are picked. More efficient if u have huge numbers of points.

takashi
Contributor
  • November 7, 2014
Hi Zoe,

 

 

I had a look at your data and workspace.

 

PGPS_nodes.shp contains point features; PGPS_final_v2.shp contains line features.

 

The dataset looks like a road network.

 

 

In your workspace, the NeighborFinder will find points on the lines each of which is closest to a node, and the VertexCreator will connect every closest point and node pair to create lines.

 

However, since every node seems to be located at an end of a line, coordinate of the closest point is same as the node naturally. Therefore, the resulting geometries will be "no-length" lines consisting of duplicate 2 nodes.

 

Although the workspace works properly as designed, probably the result is not what you want. I think you will have to re-consider the workspace design.

 

 

First of all, your requirement has to be clarified, but I (and also maybe David and Gio) was not able to understand the requirement as long as seeing your posts.

 

To help us, could you please paste an image illustrating the relation between the source (nodes and lines) and the lines which you finally need?

 

 

Takashi

gio
Contributor
Forum|alt.badge.img+15
  • Contributor
  • November 7, 2014
Hi,

 

 

At first i didnt see you posted the files. So, now i checked them out (pretty large file, it took 2mins15sec to read)

 

Like Takshi said, it is a network.

 

There are no sets of nodes to compare. There are only the topology nodes.

 

You're workspace has the nodes "find itself"

 

 

So it is indeed unclear what it is you wish to acomplish.

 

 

If you want to find nodes wich are closest to other nodes, you could use my suggested procedure, but use the pgps_nodes file to unconditionaly merge it to itself. That way you can find the closest node within the PGPS_nodes file itself. (this distance is "as the crow flies")

 

 

On the other hand u could use ShortestPathFinder  to find closest nodes based on the network itself. (the network has direction, so it is possilbe to use the ShortestPathFinder transformer) This is not necessarily the same as "as the crow flies" distance.

 

 

Reply


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings