首页 > 解决方案 > 从包含元组坐标列表的 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()

断言错误:

标签: pythondataframegeopandasshapely

解决方案


那应该很简单。

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))

推荐阅读