[英]How to convert linestring to multiple longitude latitude column in geopandas
Here's my one row of input这是我的一行输入
Name geometry
Jalan W.R. Supratman LINESTRING (95.317339 5.5603499, 95.3169007 5.5602832, 95.3165735 5.5602391, 95.3161729 5.5602097, 95.3161289 5.5601326, 95.3160873 5.5600178)
Here's my expected output这是我的预期输出
Name Langitude Longitude
Jalan W.R. Supratman 95.317339 5.5603499
Jalan W.R. Supratman 95.3169007 5.5602832
Jalan W.R. Supratman 95.3165735 5.5602391
Jalan W.R. Supratman 95.3161729 5.5602097
Jalan W.R. Supratman 95.3161289 5.5601326
Jalan W.R. Supratman 95.3160873 5.5600178
Edit:编辑:
Here's what I try这是我尝试的
def utm_to_latlon(coords, zone_number, zone_letter):
easting = coords[0]
northing = coords[1]
return utm.to_latlon(easting, northing, zone_number, zone_letter)
# Using nested list comprehension
df ["lat_lon_tuple"] = [[utm_to_latlon(xy, 44, "N") for xy in tuple(geom.coords)] for geom in df.geometry]
The error message错误信息
<ipython-input-5-4dfd2badb8b4> in <listcomp>(.0)
5
6 # Using nested list comprehension
----> 7 df ["lat_lon_tuple"] = [[utm_to_latlon(xy, 44, "N") for xy in tuple(geom.coords)] for geom in df.geometry]
AttributeError: 'str' object has no attribute 'coords'
You can convert the coordinates defining theLineString
with the coords
attribute, then convert this to ashapely.geometry.MultiPoint
:您可以使用
coords
属性转换定义LineString
的坐标,然后将其转换为shapely.geometry.MultiPoint
:
df['geometry'] = df['geometry'].apply(
lambda x: shapely.geometry.MultiPoint(list(x.coords))
)
Once this is done, you can use df.explode
:完成后,您可以使用
df.explode
:
In [10]: df.explode(index_parts=False)
Out[10]:
geometry
0 POINT (95.31734 5.56035)
0 POINT (95.31690 5.56028)
0 POINT (95.31657 5.56024)
0 POINT (95.31617 5.56021)
0 POINT (95.31613 5.56013)
0 POINT (95.31609 5.56002)
Explode
with index and then apply Series
:用 index
Explode
,然后应用Series
:
import pandas as pd
import geopandas as gpd
from shapely.geometry import LineString
df = gpd.GeoDataFrame(
{'Name': ['Jalan W.R. Supratman', 'Other Street'],
'geometry': [LineString([(95.317339, 5.5603499), (95.3169007,5.5602832), (95.3165735, 5.5602391), (95.3161729,5.5602097), (95.3161289, 5.5601326), (95.3160873, 5.5600178)]),
LineString([(95.0, 6.0), (95.01, 6.01)])]})
print(df.set_index('Name').geometry
.apply(lambda x: list(x.coords))
.explode(ignore_index=False)
.apply(pd.Series)
.reset_index()
.rename(columns={0: 'Langitude', 1: 'Longitude'}))
Result:结果:
Name Langitude Longitude
0 Jalan W.R. Supratman 95.317339 5.560350
1 Jalan W.R. Supratman 95.316901 5.560283
2 Jalan W.R. Supratman 95.316574 5.560239
3 Jalan W.R. Supratman 95.316173 5.560210
4 Jalan W.R. Supratman 95.316129 5.560133
5 Jalan W.R. Supratman 95.316087 5.560018
6 Other Street 95.000000 6.000000
7 Other Street 95.010000 6.010000
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.