【问题标题】:Convert LINESTRING wkt representation LINESTRING((a b),(c d)) to LineString[(a,b),(c,d)] [duplicate]将 LINESTRING wkt 表示 LINESTRING((a b),(c d)) 转换为 LineString[(a,b),(c,d)] [重复]
【发布时间】:2022-01-21 02:15:31
【问题描述】:

我知道怎么走

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)) 是您问题第一行中python对象的字符串wkt编码,对吗?您是在问如何从 wkt 字符串转换为匀称的线串?
  • 如果不是,则不清楚您要做什么以及卡在哪里。请在 python 中说明你现在在做什么,什么不起作用,以及你想要做什么,最好是minimal reproducible example。谢谢!

标签: python geopandas shapely


【解决方案1】:

'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'\1', 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>

【讨论】:

  • 感谢您的回答。它回答了提出的问题。你是对的,'LINESTRING ((0 0), (1 1), (2 2))' 不是一个有效的 wkt,它也不是我在我的 df 中所拥有的。其实是'LINESTRING (0 0, 1 1, 2 2)'
  • 但是,我仍然无法从'LINESTRING (0 0, 1 1, 2 2)'LineString([(0, 0), (1, 1), (2, 2)])。基本上,我想将第一种类型的整个列转换为另一种。
猜你喜欢
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多