简体   繁体   English

匀称的循环不创建线串

[英]Shapely loop not creating Linestring

I'm attempting to convert tuples from a dataframe into a linestring.我正在尝试将元组从 dataframe 转换为线串。 This is part of my dataframe imported from a csv file.这是我从 csv 文件导入的 dataframe 的一部分。

   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.如果我手动将解码列的内容复制并粘贴到 LineString() 条件中,它会转换它。 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.我最终想循环它,所以我将它设置为 dataframe 列解码。 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?如何编写此代码以避免此错误并将元组转换为 dataframe 中的列?

Edit final solution编辑最终解决方案

After some clearing up it turns out that the column decode is saved as a string "[(1,1),(2,3),(4,4),(1,3)]" which first needs to be converted to a list of tuples.经过一番清理后发现,列decode保存为字符串"[(1,1),(2,3),(4,4),(1,3)]" ,首先需要将其转换为元组列表。 After converting with a dense list comprehension the LineString conversion works as supposed to在使用密集列表理解进行转换后,LineString 转换按预期工作

df['decode'] = [eval(ele) for ele in df.decode.str.strip()[:]]
df['decode'] = df.apply(lambda x: linestringdecode(x[1], x[4]), axis=1)

Alternative Another option to go about this, is to already fix the import.替代go 关于此的另一个选项是已经修复导入。 By converting the string directly to list of tuples directly with the help of the ast.literal_eval , as suggested in this SO Question通过在ast.literal_eval的帮助下直接将字符串转换为元组列表,如本SO Question中所建议的那样

import ast
df = pd.read_csv("Test_Csv_With_List.csv", quotechar='"', sep=",",converters={4:ast.literal_eval})

Before Edit: I tried to reproduce your error with the code below.编辑前:我尝试使用以下代码重现您的错误。 However it runs through perfectly fine without any error.但是,它运行得很好,没有任何错误。

from shapely.geometry import LineString
import pandas as pd

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

data = {'Unamed 0': [0,1],
        'name': ['test','test2'],
        'rote': ['Gibberish','moreGib'],
        'decode': [[(-105.27983, 40.06008), (-105.27984, 40.05827)],[(-23, 23), (-22, 24)]]}

df = pd.DataFrame(data)

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

From your error message AttributeError: 'str' I think I can deduct that something is wrong with the import of your data.从您的错误消息AttributeError: 'str'我想我可以推断出您的数据导入有问题。 My Assumption is, that decode has the dtype Object rather than list.我的假设是,该解码具有 dtype Object 而不是列表。

Please validate that the passed argument decode to the function linestringdecode() is of type list and not string.请验证传递给 function linestringdecode linestringdecode()的参数decode是 list 类型而不是 string。

The answer was found in this section.在本节中找到了答案。

https://gis.stackexchange.com/questions/358068/converting-to-linestring-using-dataframe-column/ 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.编辑: eval() 使用起来很危险。 Make sure you're using trusted data.确保您使用的是受信任的数据。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM