将 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>
我知道怎么走
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>