如何将linestring转换为地质层中的多个经度纬度列

发布于 2025-02-04 03:51:07 字数 1450 浏览 0 评论 0原文

这是我的一行输入,

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)

这是我的预期输出

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

编辑:

这是我尝试

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]

错误消息的内容

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

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'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

请止步禁区 2025-02-11 03:51:07

用索引爆炸,然后应用系列

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

结果:

                   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

Explode with index and then apply 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
捎一片雪花 2025-02-11 03:51:07

您可以转换定义使用coords属性,然后将其转换为 shapely.deometry.multipoint

df['geometry'] = df['geometry'].apply(
    lambda x: shapely.geometry.MultiPoint(list(x.coords))
)

完成此操作后,您可以使用 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)

You can convert the coordinates defining the LineString with the coords attribute, then convert this to a 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:

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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文