Search code examples
python-3.xpandasgeopandas

Shapely loop not creating Linestring


I'm attempting to convert tuples from a dataframe into a linestring. This is part of my dataframe imported from a csv file.

   Unnamed: 0      name     route                                              decode
0           0    Funshine!  ofosF|mqaShJ@?rLh@d@veCIVd@LbEJfJ^f@lE?Rp@^L~g...  '[(-105.28, 39.999), (-105.282, 39.998), (-105.282, 39.99), (-105.28, 39.995), (-105.282, 39.99), (etc)]'

If I manually copy and paste the contents of the decode column into the LineString() condition, it converts it. The error I receive is posted below.

line = LineString(df.decode[0])
print(line)
Traceback (most recent call last):
  File "shapely\speedups\_speedups.pyx", line 86, in shapely.speedups._speedups.geos_linestring_from_py
AttributeError: 'str' object has no attribute '__array_interface__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/taylo/PycharmProjects/PermitProj/Polyline Decode.py", line 20, in <module>
    line = LineString(df.decode[1])
  File "C:\Users\taylo\Miniconda3\envs\ExcelPermitExe\lib\site-packages\shapely\geometry\linestring.py", line 48, in __init__
    self._set_coords(coordinates)
  File "C:\Users\taylo\Miniconda3\envs\ExcelPermitExe\lib\site-packages\shapely\geometry\linestring.py", line 97, in _set_coords
    ret = geos_linestring_from_py(coordinates)
  File "shapely\speedups\_speedups.pyx", line 166, in shapely.speedups._speedups.geos_linestring_from_py
AssertionError


I eventually would like to loop it, so I set it to the dataframe column decode. This is the loop that I've created to eventually write the linestring to the column.

def linestringdecode(name, decode):
    try:
        return LineString(decode)
    except:
        print(name)
        return np.nan

df['decode'] = df.apply(lambda x: linestringdecode(x[1], x[3]), axis=1)

How do I write this so that I avoid this error and can convert the tuples to a column in my dataframe?


Solution

  • The answer was found in this section.

    https://gis.stackexchange.com/questions/358068/converting-to-linestring-using-dataframe-column/

    df['decode'] = df.decode.apply(lambda row: LineString(eval(row)))
    

    Edit: eval() is dangerous to use. Make sure you're using trusted data.