Reputation: 65
I have a pandas dataframe with a series of origins & destinations in the form of shapely Point objects. I would like to convert it to a geodatabase of linestrings.
ID orig_coord dest_coord
0 POINT (-116.2847753565571 43.61722615312507) POINT (-116.3042144501943 43.60844476082184)
1 POINT (-116.2847753565571 43.61722615312507) POINT (-116.3042144501943 43.60844476082184)
2 POINT (-116.2847753565571 43.61722615312507) POINT (-116.3042144501943 43.60844476082184)
I've tried df['line']=df.apply(lambda x: LineString())
, but nothing happens.
I've tried df['line']=LineString([df['orig_coord'],df['dest_coord']])
, but that gives me
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
c:\users\...\py3\lib\site-packages\shapely\speedups\_speedups.pyx in shapely.speedups._speedups.geos_linestring_from_py()
AttributeError: 'list' object has no attribute '__array_interface__'
During handling of the above exception, another exception occurred:
AssertionError Traceback (most recent call last)
<ipython-input-31-fe64089b1dcf> in <module>
----> 1 df['line']=LineString([df['orig_coord'],df['dest_coord']])
c:\users\...\py3\lib\site-packages\shapely\geometry\linestring.py in __init__(self, coordinates)
46 BaseGeometry.__init__(self)
47 if coordinates is not None:
---> 48 self._set_coords(coordinates)
49
50 @property
c:\users\...\py3\lib\site-packages\shapely\geometry\linestring.py in _set_coords(self, coordinates)
95 def _set_coords(self, coordinates):
96 self.empty()
---> 97 ret = geos_linestring_from_py(coordinates)
98 if ret is not None:
99 self._geom, self._ndim = ret
c:\users\...\py3\lib\site-packages\shapely\speedups\_speedups.pyx in shapely.speedups._speedups.geos_linestring_from_py()
AssertionError:
Upvotes: 1
Views: 3203
Reputation: 17007
here one solution:
from shapely.geometry import Point, LineString
o = [Point (-116.2847753565571, 43.61722615312507),
Point(-116.2847753565571, 43.61722615312507),
Point (-116.2847753565571,43.61722615312507)]
d = [Point (-116.3042144501943, 43.60844476082184),
Point(-116.3042144501943,43.60844476082184),
Point(-116.3042144501943,43.60844476082184)]
df = pd.DataFrame({'orig_coord' : o, 'dest_coord': d})
df['line']=df.apply(lambda x: LineString([x['orig_coord'], x['dest_coord']]),axis=1)
print(df['line'])
Upvotes: 4
Reputation: 65
I had already used this to get the Point objects, but it hadn't occurred to me to repeat the process:
df['line']=[LineString(xy) for xy in zip(df.orig_coord,df.dest_coord)]
Upvotes: 2