python - 从包含元组坐标列表的 GeoPandas df 列到包含 LineString 的列
问题描述
我有一个 GeoPandas df:
import geopandas as gpd
from shapely.geometry import LineString
geo_df = gpd.GeoDataFrame({'name': ['foo', 'bar', 'oof'], 'geometry': [[(5.239672304278279, 43.449400744605434), (5.291017601291771, 43.40657292095388)], [(5.27346289130589, 43.418074031107516), (4.935465352479518, 43.44997495014662)], [(4.935465352479518, 43.44997495014662), (5.64570049516335, 43.367506660731095)]]})
看起来像:
name geometry
0 foo [(5.239672304278279, 43.449400744605434), (5.2...
1 bar [(5.27346289130589, 43.418074031107516), (4.93...
2 oof [(4.935465352479518, 43.44997495014662), (5.64...
如何将坐标列转换为 LineString(无论元组列表中有多少点)?例如:
name geometry
0 foo LINESTRING (5.239672304278279 43.449400744605434, 5.2...
1 bar LINESTRING (5.27346289130589 43.418074031107516, 4.93...
2 oof LINESTRING (4.935465352479518 43.44997495014662, 5.64...
编辑:我试过(见 Prateek 的回答):
geo_df['geometry']=geo_df['geometry'].apply(lambda x: LineString(x))
也:
geo_list = [LineString(x) for i in geo_df['geometry'].tolist()]
geo_df['geometry'] = geo_list
两者都返回以下错误:
AttributeError Traceback(最近一次调用最后)~/opt/anaconda3/lib/python3.8/site-packages/shapely/speedups/_speedups.pyx in shapely.speedups._speedups.geos_linestring_from_py()
AttributeError:“list”对象没有属性“ array_interface ”
在处理上述异常的过程中,又出现了一个异常:
AssertionError Traceback(最近一次调用最后一次)在 17 geo_df['geometry'] = tuple_list 18 ---> 19 geo_df['geometry'] = geo_df['geometry'].apply(lambda x: LineString(x)) 20 21
~/opt/anaconda3/lib/python3.8/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds) 4198 else: 4199 values = self.astype(object) ._values -> 4200 mapped = lib.map_infer(values, f, convert=convert_dtype) 4201 4202 if len(mapped) and isinstance(mapped[0], Series):
pandas/_libs/lib.pyx 在 pandas._libs.lib.map_infer()
在 (x) 17 geo_df['geometry'] = tuple_list 18 ---> 19 geo_df['geometry'] = geo_df['geometry'].apply(lambda x: LineString(x)) 20 21
~/opt/anaconda3/lib/python3.8/site-packages/shapely/geometry/linestring.py in init(自我,坐标)46 BaseGeometry。init (self) 47 如果坐标不是 None: ---> 48 self._set_coords(coordinates) 49 50 @property
~/opt/anaconda3/lib/python3.8/site-packages/shapely/geometry/linestring.py in _set_coords(自我,坐标)95 def _set_coords(自我,坐标):96 self.empty() ---> 97 ret = geos_linestring_from_py(coordinates) 98 如果 ret 不是 None: 99 self._geom, self._ndim = ret
~/opt/anaconda3/lib/python3.8/site-packages/shapely/speedups/_speedups.pyx 在 shapely.speedups._speedups.geos_linestring_from_py()
断言错误:
解决方案
那应该很简单。
import geopandas as gpd
from shapely.geometry import LineString
geo_df = gpd.GeoDataFrame({'name': ['foo', 'bar', 'oof'], 'geometry': [[(5.239672304278279, 43.449400744605434), (5.291017601291771, 43.40657292095388)], [(5.27346289130589, 43.418074031107516), (4.935465352479518, 43.44997495014662)], [(4.935465352479518, 43.44997495014662), (5.64570049516335, 43.367506660731095)]]})
geo_df['geometry']=geo_df['geometry'].apply(lambda x: LineString(x))