Skip to main content
Solved

How to plot a line from a text file when all the Y coordinates are in a row followed by all the X coordinates in a row?


paul_m
Contributor
Forum|alt.badge.img+6

I have a series of text files that I am trying to create lines from. Each row in the text file has the number of vertices followed by the Y coordinates for all the vertices and then the x coordinates for all the vertices (see example below)

3,41.1380602942863,41.1378946727126,41.1378187626848,-111.856708809171,-111.857316620769,-111.857869454434

Does anyone know how I could break these up into an X,Y format to use something like the LineBuilder to create lines?

Thanks!

Best answer by ebygomm

One possible way to get pairs of coordinates

Split into a list by the comma, count the length of the list, explode the list into parts, discard the first item in the list (the number of coordinates), create an x attribute if the element index is less than or equal to half the element count -1, create a y attribute if the element index is more than half of the element count -1, use a modulo counter to assign a coordinate index, aggregate together to get coordinate pairs

You could then create points and use a point connector make lines

View original
Did this help you find an answer to your question?

5 replies

ebygomm
Influencer
Forum|alt.badge.img+39
  • Influencer
  • Best Answer
  • June 23, 2020

One possible way to get pairs of coordinates

Split into a list by the comma, count the length of the list, explode the list into parts, discard the first item in the list (the number of coordinates), create an x attribute if the element index is less than or equal to half the element count -1, create a y attribute if the element index is more than half of the element count -1, use a modulo counter to assign a coordinate index, aggregate together to get coordinate pairs

You could then create points and use a point connector make lines


Forum|alt.badge.img+2

Split, explode, filter, count, rename XY, and merge.

 

From there, use a VertexCreator and a LineBuilder to generate the lines.

 

 

 

 


ebygomm
Influencer
Forum|alt.badge.img+39
  • Influencer
  • June 23, 2020

In reality though, I'd probably use a pythoncaller to create the geometries, something like this

import fme
import fmeobjects

def processFeature(feature):
    #get value, split on comma to get list and remove first value, convert to floats
    mylist = [float(i) for i in feature.getAttribute('value').split(',')]
    #get num coordinates
    numcoords = int(mylist[0])
    #get first n items in list (excluding first)
    y = mylist[1:numcoords+1:]
    #get last n items in list
    x = mylist[numcoords+1::]
    #create list of tuples
    coords = list(zip(x,y))
    #set geometry
    feature.setGeometry(fmeobjects.FMELine(coords))

ebygomm
Influencer
Forum|alt.badge.img+39
  • Influencer
  • June 24, 2020
ebygomm wrote:

One possible way to get pairs of coordinates

Split into a list by the comma, count the length of the list, explode the list into parts, discard the first item in the list (the number of coordinates), create an x attribute if the element index is less than or equal to half the element count -1, create a y attribute if the element index is more than half of the element count -1, use a modulo counter to assign a coordinate index, aggregate together to get coordinate pairs

You could then create points and use a point connector make lines

x and y need to be the other way round of course, now I've noticed you say y coords first but same principle


paul_m
Contributor
Forum|alt.badge.img+6
  • Author
  • Contributor
  • June 24, 2020
ebygomm wrote:

One possible way to get pairs of coordinates

Split into a list by the comma, count the length of the list, explode the list into parts, discard the first item in the list (the number of coordinates), create an x attribute if the element index is less than or equal to half the element count -1, create a y attribute if the element index is more than half of the element count -1, use a modulo counter to assign a coordinate index, aggregate together to get coordinate pairs

You could then create points and use a point connector make lines

Thank you, your response helped a ton! I had multiple rows, so I made a few adjustments:

  1. Added a Counter before the List Exploder
  2. Used the Counter and the coordinate index (Modulo Counter) in the Aggregate group by parameter
  3. Added a Vertex Creator, Sorter (sort by _count and _element_index), and Line Builder (group by Counter)

     

     


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