将 LINESTRING wkt 表示 LINESTRING((a b),(c d)) 转换为 LineString[(a,b),(c,d)]

Convert LINESTRING wkt representation LINESTRING((a b),(c d)) to LineString[(a,b),(c,d)]

我知道怎么走

line = LineString([(0, 0), (1, 1), (2, 2)])

LINESTRING ((0 0), (1 1), (2 2))

反之则不然。我该怎么做?

我需要这样做的原因是我希望能够应用以下函数将我的 LINESTRINGS 分成两边。

from shapely.geometry import LineString, LinearRing

def segments(curve):
    return list(map(LineString, zip(curve.coords[:-1], curve.coords[1:])))


line = LineString([(0, 0), (1, 1), (2, 2)])

line_segments = segments(line)
for segment in line_segments:
    print(segment)

并且它不能应用于线串的 wkt 表示。

'LINESTRING ((0 0), (1 1), (2 2))' 不是有效的 WKT 字符串。对于您的示例,正​​确的表示形式应该是 'LINESTRING (0 0, 1 1, 2 2)' 不带内括号。

要从一种格式转换为另一种格式,请使用 shapely.wkt 模块中的 dumps/loads

from shapely.geometry import LineString
import shapely.wkt

line = LineString([(0, 0), (1, 1), (2, 2)])
str_line = shapely.wkt.dumps(line)

print(shapely.wkt.loads(str_line) == line)

# Output:
True

更新:如果要解析这样的字符串,请使用正则表达式删除内括号:

s = 'LINESTRING ((0 0), (1 1), (2 2))'
str_line = re.sub(r'\(([^()]*)\)', r'', s)

print(shapely.wkt.loads(str_line) == line)

# Output:
True

更新 2:这不起作用?

import pandas as pd
import shapely.wkt

df = pd.DataFrame({'lines': ['LINESTRING (0 0, 1 1, 2 2)']})
df['lines2'] = df['lines'].apply(lambda x: shapely.wkt.loads(x))

输出:

>>> df
                        lines                      lines2
0  LINESTRING (0 0, 1 1, 2 2)  LINESTRING (0 0, 1 1, 2 2)

>>> df.loc[0, 'lines']
'LINESTRING (0 0, 1 1, 2 2)'

>>> df.loc[0, 'lines2']
<shapely.geometry.linestring.LineString at 0x7fa386735a30>